test_home_guild.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. """Tests du serveur du bot : rien n'est accepté ailleurs. Lancer depuis la racine du projet : python -m unittest"""
  2. import unittest
  3. from unittest import mock
  4. import discord
  5. from bot.discord_bot import ChatBot, HomeTree
  6. HOME, OTHER = 1000, 2000
  7. CHANNEL_ID = 10
  8. def fake_bot(channel_found: bool = True) -> mock.Mock:
  9. bot = mock.Mock()
  10. bot.settings.channel_id = CHANNEL_ID
  11. bot.get_channel.return_value = mock.Mock(guild=mock.Mock(id=HOME)) if channel_found else None
  12. bot.home_guild_id = lambda: ChatBot.home_guild_id(bot)
  13. bot.handle_main_channel = mock.AsyncMock()
  14. bot.handle_mention = mock.AsyncMock()
  15. bot.register_members = mock.AsyncMock()
  16. return bot
  17. def fake_interaction(guild_id: int | None) -> mock.Mock:
  18. interaction = mock.Mock(guild_id=guild_id, type=discord.InteractionType.application_command,
  19. data={"name": "memoire-serveur"})
  20. interaction.response.send_message = mock.AsyncMock()
  21. return interaction
  22. class CommandsTest(unittest.IsolatedAsyncioTestCase):
  23. async def check(self, interaction: mock.Mock, channel_found: bool = True) -> bool:
  24. tree = object.__new__(HomeTree) # sans client Discord réel
  25. tree.client = fake_bot(channel_found)
  26. return await tree.interaction_check(interaction)
  27. async def test_home_guild_accepted(self):
  28. interaction = fake_interaction(HOME)
  29. self.assertTrue(await self.check(interaction))
  30. interaction.response.send_message.assert_not_awaited()
  31. async def test_other_guild_refused(self):
  32. # Administrateur d'un autre serveur où le bot a été invité : ni lecture ni écriture de la mémoire.
  33. interaction = fake_interaction(OTHER)
  34. self.assertFalse(await self.check(interaction))
  35. interaction.response.send_message.assert_awaited_once()
  36. async def test_direct_message_refused(self):
  37. self.assertFalse(await self.check(fake_interaction(None)))
  38. async def test_refused_while_channel_unknown(self):
  39. self.assertFalse(await self.check(fake_interaction(HOME), channel_found=False))
  40. class MessagesTest(unittest.IsolatedAsyncioTestCase):
  41. async def receive(self, guild: mock.Mock | None, channel_id: int = CHANNEL_ID) -> mock.Mock:
  42. bot = fake_bot()
  43. message = mock.Mock(guild=guild, webhook_id=None, type=discord.MessageType.default)
  44. message.channel.id = channel_id
  45. message.author.bot = False
  46. message.mentions = [bot.user]
  47. await ChatBot.on_message(bot, message)
  48. return bot
  49. async def test_home_guild_answered(self):
  50. bot = await self.receive(mock.Mock(id=HOME))
  51. bot.handle_main_channel.assert_awaited_once()
  52. async def test_other_guild_ignored(self):
  53. # Même un salon qui porte le même identifiant ou une mention : rien n'est lu ni noté.
  54. bot = await self.receive(mock.Mock(id=OTHER))
  55. bot.handle_main_channel.assert_not_awaited()
  56. bot.handle_mention.assert_not_awaited()
  57. bot.register_members.assert_not_awaited()
  58. async def test_direct_message_ignored(self):
  59. bot = await self.receive(None, channel_id=99)
  60. bot.handle_mention.assert_not_awaited()
  61. bot.register_members.assert_not_awaited()
  62. if __name__ == "__main__":
  63. unittest.main()