test_channel.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. """Tests de la vérification du salon dédié (CHANNEL_ID). 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, channel_problem
  6. CHANNEL_ID, GUILD_ID = 10, 1000
  7. def fake_client(channel=None, guild=None) -> mock.Mock:
  8. client = mock.Mock()
  9. client.get_channel.return_value = channel
  10. client.get_guild.return_value = guild
  11. return client
  12. def fake_channel(cls=discord.TextChannel, **permissions) -> mock.Mock:
  13. channel = mock.Mock(spec=cls)
  14. channel.guild = mock.Mock(id=GUILD_ID)
  15. channel.__str__ = lambda self: "salon"
  16. allowed = {"view_channel": True, "send_messages": True, "send_messages_in_threads": True,
  17. "read_message_history": True} | permissions
  18. channel.permissions_for.return_value = mock.Mock(**allowed)
  19. return channel
  20. class ChannelProblemTest(unittest.TestCase):
  21. def test_usable_channel(self):
  22. self.assertIsNone(channel_problem(fake_client(fake_channel()), CHANNEL_ID))
  23. def test_unknown_channel(self):
  24. self.assertIn("introuvable", channel_problem(fake_client(), CHANNEL_ID))
  25. def test_server_id_instead_of_channel(self):
  26. self.assertIn("identifiant du serveur", channel_problem(fake_client(guild=mock.Mock()), CHANNEL_ID))
  27. def test_category_and_forum_refused(self):
  28. self.assertIn("une catégorie", channel_problem(fake_client(fake_channel(discord.CategoryChannel)), CHANNEL_ID))
  29. self.assertIn("un forum", channel_problem(fake_client(fake_channel(discord.ForumChannel)), CHANNEL_ID))
  30. def test_missing_permissions(self):
  31. problem = channel_problem(fake_client(fake_channel(send_messages=False)), CHANNEL_ID)
  32. self.assertIn("la permission « Envoyer des messages »", problem)
  33. problem = channel_problem(fake_client(fake_channel(view_channel=False, read_message_history=False)), CHANNEL_ID)
  34. self.assertIn("les permissions « Voir les salons », « Voir les anciens messages »", problem)
  35. def test_thread_uses_thread_permission(self):
  36. thread = fake_channel(discord.Thread, send_messages=False)
  37. self.assertIsNone(channel_problem(fake_client(thread), CHANNEL_ID))
  38. thread = fake_channel(discord.Thread, send_messages_in_threads=False)
  39. self.assertIn("Envoyer des messages dans les fils", channel_problem(fake_client(thread), CHANNEL_ID))
  40. class AnnounceTest(unittest.IsolatedAsyncioTestCase):
  41. def fake_bot(self, *, unavailable: bool) -> mock.Mock:
  42. bot = mock.Mock(_announced=False, config_error=None)
  43. bot.settings.channel_id = CHANNEL_ID
  44. bot.get_channel.return_value = None
  45. bot.get_guild.return_value = None
  46. bot.guilds = [mock.Mock(unavailable=unavailable)]
  47. bot.close = mock.AsyncMock()
  48. return bot
  49. async def test_wrong_channel_stops_bot(self):
  50. bot = self.fake_bot(unavailable=False)
  51. await ChatBot.announce(bot)
  52. self.assertIn("introuvable", bot.config_error)
  53. bot.close.assert_awaited_once()
  54. async def test_unavailable_server_waits(self):
  55. # Panne Discord : le salon n'est pas encore connu, mais le bot reste allumé.
  56. bot = self.fake_bot(unavailable=True)
  57. await ChatBot.announce(bot)
  58. self.assertIsNone(bot.config_error)
  59. self.assertFalse(bot._announced)
  60. bot.close.assert_not_awaited()
  61. if __name__ == "__main__":
  62. unittest.main()