| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- """Tests de la vérification du salon dédié (CHANNEL_ID). Lancer depuis la racine du projet : python -m unittest"""
- import unittest
- from unittest import mock
- import discord
- from bot.discord_bot import ChatBot, channel_problem
- CHANNEL_ID, GUILD_ID = 10, 1000
- def fake_client(channel=None, guild=None) -> mock.Mock:
- client = mock.Mock()
- client.get_channel.return_value = channel
- client.get_guild.return_value = guild
- return client
- def fake_channel(cls=discord.TextChannel, **permissions) -> mock.Mock:
- channel = mock.Mock(spec=cls)
- channel.guild = mock.Mock(id=GUILD_ID)
- channel.__str__ = lambda self: "salon"
- allowed = {"view_channel": True, "send_messages": True, "send_messages_in_threads": True,
- "read_message_history": True} | permissions
- channel.permissions_for.return_value = mock.Mock(**allowed)
- return channel
- class ChannelProblemTest(unittest.TestCase):
- def test_usable_channel(self):
- self.assertIsNone(channel_problem(fake_client(fake_channel()), CHANNEL_ID))
- def test_unknown_channel(self):
- self.assertIn("introuvable", channel_problem(fake_client(), CHANNEL_ID))
- def test_server_id_instead_of_channel(self):
- self.assertIn("identifiant du serveur", channel_problem(fake_client(guild=mock.Mock()), CHANNEL_ID))
- def test_category_and_forum_refused(self):
- self.assertIn("une catégorie", channel_problem(fake_client(fake_channel(discord.CategoryChannel)), CHANNEL_ID))
- self.assertIn("un forum", channel_problem(fake_client(fake_channel(discord.ForumChannel)), CHANNEL_ID))
- def test_missing_permissions(self):
- problem = channel_problem(fake_client(fake_channel(send_messages=False)), CHANNEL_ID)
- self.assertIn("la permission « Envoyer des messages »", problem)
- problem = channel_problem(fake_client(fake_channel(view_channel=False, read_message_history=False)), CHANNEL_ID)
- self.assertIn("les permissions « Voir les salons », « Voir les anciens messages »", problem)
- def test_thread_uses_thread_permission(self):
- thread = fake_channel(discord.Thread, send_messages=False)
- self.assertIsNone(channel_problem(fake_client(thread), CHANNEL_ID))
- thread = fake_channel(discord.Thread, send_messages_in_threads=False)
- self.assertIn("Envoyer des messages dans les fils", channel_problem(fake_client(thread), CHANNEL_ID))
- class AnnounceTest(unittest.IsolatedAsyncioTestCase):
- def fake_bot(self, *, unavailable: bool) -> mock.Mock:
- bot = mock.Mock(_announced=False, config_error=None)
- bot.settings.channel_id = CHANNEL_ID
- bot.get_channel.return_value = None
- bot.get_guild.return_value = None
- bot.guilds = [mock.Mock(unavailable=unavailable)]
- bot.close = mock.AsyncMock()
- return bot
- async def test_wrong_channel_stops_bot(self):
- bot = self.fake_bot(unavailable=False)
- await ChatBot.announce(bot)
- self.assertIn("introuvable", bot.config_error)
- bot.close.assert_awaited_once()
- async def test_unavailable_server_waits(self):
- # Panne Discord : le salon n'est pas encore connu, mais le bot reste allumé.
- bot = self.fake_bot(unavailable=True)
- await ChatBot.announce(bot)
- self.assertIsNone(bot.config_error)
- self.assertFalse(bot._announced)
- bot.close.assert_not_awaited()
- if __name__ == "__main__":
- unittest.main()
|