diff options
| author | 2022-10-18 20:14:31 +0300 | |
|---|---|---|
| committer | 2022-10-18 20:14:31 +0300 | |
| commit | 6be1686021a8ac204af63a1b68b0ae887f2788df (patch) | |
| tree | dec397fa169dab19976b4c00e335a808e50533b7 /tests | |
| parent | Return None instead of False in try_get_tag (diff) | |
| parent | Merge pull request #2283 from shtlrs/1379-tranform-urls-upon-rich-embed-filte... (diff) | |
Merge branch 'main' into fix-silence-and-tags-when-unloaded
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/bot/exts/backend/test_error_handler.py | 13 | ||||
| -rw-r--r-- | tests/bot/exts/info/test_information.py | 74 | ||||
| -rw-r--r-- | tests/bot/exts/moderation/infraction/test_infractions.py | 38 | ||||
| -rw-r--r-- | tests/helpers.py | 2 | ||||
| -rw-r--r-- | tests/test_helpers.py | 2 | 
5 files changed, 112 insertions, 17 deletions
| diff --git a/tests/bot/exts/backend/test_error_handler.py b/tests/bot/exts/backend/test_error_handler.py index 7562f6aa8..eae1bae20 100644 --- a/tests/bot/exts/backend/test_error_handler.py +++ b/tests/bot/exts/backend/test_error_handler.py @@ -9,7 +9,7 @@ from bot.exts.backend import error_handler  from bot.exts.info.tags import Tags  from bot.exts.moderation.silence import Silence  from bot.utils.checks import InWhitelistCheckFailure -from tests.helpers import MockBot, MockContext, MockGuild, MockRole, MockTextChannel +from tests.helpers import MockBot, MockContext, MockGuild, MockRole, MockTextChannel, MockVoiceChannel  class ErrorHandlerTests(unittest.IsolatedAsyncioTestCase): @@ -192,7 +192,16 @@ class TrySilenceTests(unittest.IsolatedAsyncioTestCase):          self.bot = MockBot()          self.silence = Silence(self.bot)          self.bot.get_command.return_value = self.silence.silence -        self.ctx = MockContext(bot=self.bot) + +        # Use explicit mock channels so that discord.utils.get doesn't think +        # guild.text_channels is an async iterable due to the MagicMock having +        # a __aiter__ attr. +        guild_overrides = { +            "text_channels": [MockTextChannel(), MockTextChannel()], +            "voice_channels": [MockVoiceChannel(), MockVoiceChannel()], +        } +        self.guild = MockGuild(**guild_overrides) +        self.ctx = MockContext(bot=self.bot, guild=self.guild)          self.cog = error_handler.ErrorHandler(self.bot)      async def test_try_silence_context_invoked_from_error_handler(self): diff --git a/tests/bot/exts/info/test_information.py b/tests/bot/exts/info/test_information.py index d896b7652..9f5143c01 100644 --- a/tests/bot/exts/info/test_information.py +++ b/tests/bot/exts/info/test_information.py @@ -2,6 +2,7 @@ import textwrap  import unittest  import unittest.mock  from datetime import datetime +from textwrap import shorten  import discord @@ -573,3 +574,76 @@ class UserCommandTests(unittest.IsolatedAsyncioTestCase):          create_embed.assert_called_once_with(ctx, self.target, False)          ctx.send.assert_called_once() + + +class RuleCommandTests(unittest.IsolatedAsyncioTestCase): +    """Tests for the `!rule` command.""" + +    def setUp(self) -> None: +        """Set up steps executed before each test is run.""" +        self.bot = helpers.MockBot() +        self.cog = information.Information(self.bot) +        self.ctx = helpers.MockContext(author=helpers.MockMember(id=1, name="Bellaluma")) +        self.full_rules = [ +            ( +                "First rule", +                ["first", "number_one"] +            ), +            ( +                "Second rule", +                ["second", "number_two"] +            ), +            ( +                "Third rule", +                ["third", "number_three"] +            ) +        ] +        self.bot.api_client.get.return_value = self.full_rules + +    async def test_return_none_if_one_rule_number_is_invalid(self): + +        test_cases = [ +            (('1', '6', '7', '8'), (6, 7, 8)), +            (('10', "first"), (10, )), +            (("first", 10), (10, )) +        ] + +        for raw_user_input, extracted_rule_numbers in test_cases: +            with self.subTest(identifier=raw_user_input): +                invalid = ", ".join( +                    str(rule_number) for rule_number in extracted_rule_numbers +                    if rule_number < 1 or rule_number > len(self.full_rules)) + +                final_rule_numbers = await self.cog.rules(self.cog, self.ctx, *raw_user_input) + +                self.assertEqual( +                    self.ctx.send.call_args, +                    unittest.mock.call(shorten(":x: Invalid rule indices: " + invalid, 75, placeholder=" ..."))) +                self.assertEqual(None, final_rule_numbers) + +    async def test_return_correct_rule_numbers(self): + +        test_cases = [ +            (("1", "2", "first"), {1, 2}), +            (("1", "hello", "2", "second"), {1}), +            (("second", "third", "unknown", "999"), {2, 3}) +        ] + +        for raw_user_input, expected_matched_rule_numbers in test_cases: +            with self.subTest(identifier=raw_user_input): +                final_rule_numbers = await self.cog.rules(self.cog, self.ctx, *raw_user_input) +                self.assertEqual(expected_matched_rule_numbers, final_rule_numbers) + +    async def test_return_default_rules_when_no_input_or_no_match_are_found(self): +        test_cases = [ +            ((), None), +            (("hello", "2", "second"), None), +            (("hello", "999"), None), +        ] + +        for raw_user_input, expected_matched_rule_numbers in test_cases: +            with self.subTest(identifier=raw_user_input): +                final_rule_numbers = await self.cog.rules(self.cog, self.ctx, *raw_user_input) +                embed = self.ctx.send.call_args.kwargs['embed'] +                self.assertEqual(information.DEFAULT_RULES_DESCRIPTION, embed.description) +                self.assertEqual(expected_matched_rule_numbers, final_rule_numbers) diff --git a/tests/bot/exts/moderation/infraction/test_infractions.py b/tests/bot/exts/moderation/infraction/test_infractions.py index a18a4d23b..b78328137 100644 --- a/tests/bot/exts/moderation/infraction/test_infractions.py +++ b/tests/bot/exts/moderation/infraction/test_infractions.py @@ -35,17 +35,20 @@ class TruncationTests(unittest.IsolatedAsyncioTestCase):          self.cog.apply_infraction = AsyncMock()          self.bot.get_cog.return_value = AsyncMock()          self.cog.mod_log.ignore = Mock() -        self.ctx.guild.ban = Mock() +        self.ctx.guild.ban = AsyncMock()          await self.cog.apply_ban(self.ctx, self.target, "foo bar" * 3000) -        self.ctx.guild.ban.assert_called_once_with( +        self.cog.apply_infraction.assert_awaited_once_with( +            self.ctx, {"foo": "bar", "purge": ""}, self.target, ANY +        ) + +        action = self.cog.apply_infraction.call_args.args[-1] +        await action() +        self.ctx.guild.ban.assert_awaited_once_with(              self.target,              reason=textwrap.shorten("foo bar" * 3000, 512, placeholder="..."),              delete_message_days=0          ) -        self.cog.apply_infraction.assert_awaited_once_with( -            self.ctx, {"foo": "bar", "purge": ""}, self.target, self.ctx.guild.ban.return_value -        )      @patch("bot.exts.moderation.infraction._utils.post_infraction")      async def test_apply_kick_reason_truncation(self, post_infraction_mock): @@ -54,14 +57,17 @@ class TruncationTests(unittest.IsolatedAsyncioTestCase):          self.cog.apply_infraction = AsyncMock()          self.cog.mod_log.ignore = Mock() -        self.target.kick = Mock() +        self.target.kick = AsyncMock()          await self.cog.apply_kick(self.ctx, self.target, "foo bar" * 3000) -        self.target.kick.assert_called_once_with(reason=textwrap.shorten("foo bar" * 3000, 512, placeholder="..."))          self.cog.apply_infraction.assert_awaited_once_with( -            self.ctx, {"foo": "bar"}, self.target, self.target.kick.return_value +            self.ctx, {"foo": "bar"}, self.target, ANY          ) +        action = self.cog.apply_infraction.call_args.args[-1] +        await action() +        self.target.kick.assert_awaited_once_with(reason=textwrap.shorten("foo bar" * 3000, 512, placeholder="...")) +  @patch("bot.exts.moderation.infraction.infractions.constants.Roles.voice_verified", new=123456)  class VoiceMuteTests(unittest.IsolatedAsyncioTestCase): @@ -90,8 +96,14 @@ class VoiceMuteTests(unittest.IsolatedAsyncioTestCase):      async def test_voice_unmute(self):          """Should call infraction pardoning function."""          self.cog.pardon_infraction = AsyncMock() +        self.assertIsNone(await self.cog.unvoicemute(self.cog, self.ctx, self.user, pardon_reason="foobar")) +        self.cog.pardon_infraction.assert_awaited_once_with(self.ctx, "voice_mute", self.user, "foobar") + +    async def test_voice_unmute_reasonless(self): +        """Should call infraction pardoning function without a pardon reason.""" +        self.cog.pardon_infraction = AsyncMock()          self.assertIsNone(await self.cog.unvoicemute(self.cog, self.ctx, self.user)) -        self.cog.pardon_infraction.assert_awaited_once_with(self.ctx, "voice_mute", self.user) +        self.cog.pardon_infraction.assert_awaited_once_with(self.ctx, "voice_mute", self.user, None)      @patch("bot.exts.moderation.infraction.infractions._utils.post_infraction")      @patch("bot.exts.moderation.infraction.infractions._utils.get_active_infraction") @@ -141,8 +153,8 @@ class VoiceMuteTests(unittest.IsolatedAsyncioTestCase):      async def action_tester(self, action, reason: str) -> None:          """Helper method to test voice mute action.""" -        self.assertTrue(inspect.iscoroutine(action)) -        await action +        self.assertTrue(inspect.iscoroutinefunction(action)) +        await action()          self.user.move_to.assert_called_once_with(None, reason=ANY)          self.user.remove_roles.assert_called_once_with(self.cog._voice_verified_role, reason=reason) @@ -195,8 +207,8 @@ class VoiceMuteTests(unittest.IsolatedAsyncioTestCase):          # Test action          action = self.cog.apply_infraction.call_args[0][-1] -        self.assertTrue(inspect.iscoroutine(action)) -        await action +        self.assertTrue(inspect.iscoroutinefunction(action)) +        await action()      async def test_voice_unmute_user_not_found(self):          """Should include info to return dict when user was not found from guild.""" diff --git a/tests/helpers.py b/tests/helpers.py index 687e15b96..a4b919dcb 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -317,7 +317,7 @@ class MockBot(CustomMockMixin, unittest.mock.MagicMock):          guild_id=1,          intents=discord.Intents.all(),      ) -    additional_spec_asyncs = ("wait_for", "redis_ready") +    additional_spec_asyncs = ("wait_for",)      def __init__(self, **kwargs) -> None:          super().__init__(**kwargs) diff --git a/tests/test_helpers.py b/tests/test_helpers.py index f3040b305..b2686b1d0 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -14,7 +14,7 @@ class DiscordMocksTests(unittest.TestCase):          """Test if the default initialization of MockRole results in the correct object."""          role = helpers.MockRole() -        # The `spec` argument makes sure `isistance` checks with `discord.Role` pass +        # The `spec` argument makes sure `isinstance` checks with `discord.Role` pass          self.assertIsInstance(role, discord.Role)          self.assertEqual(role.name, "role") | 
