Ejemplo n.º 1
0
    async def test_kick_called(self, ctx, sync, kick):
        """Tests if silence command calls kick on a voice channel."""
        channel = MockVoiceChannel()
        await self.cog.silence.callback(self.cog, ctx, channel, 10, kick=True)

        kick.assert_awaited_once_with(channel)
        sync.assert_not_called()
Ejemplo n.º 2
0
    def setUp(self) -> None:
        self.bot = MockBot()
        self.cog = silence.Silence(self.bot)

        self.text_channels = [MockTextChannel() for _ in range(2)]
        self.bot.get_channel.return_value = self.text_channels[1]

        self.voice_channel = MockVoiceChannel()
Ejemplo n.º 3
0
    async def test_sync_move_to_error(self):
        """Test to ensure move_to gets called on all members during sync, even if some fail."""
        await self.cog._async_init()
        failing_member, members = self.create_erroneous_members()

        await self.cog._force_voice_sync(MockVoiceChannel(members=members))
        for member in members:
            self.assertEqual(member.move_to.call_count, 1 if member == failing_member else 2)
Ejemplo n.º 4
0
    async def test_kick_move_to_error(self):
        """Test to ensure move_to gets called on all members during kick, even if some fail."""
        await self.cog._async_init()
        _, members = self.create_erroneous_members()

        await self.cog._kick_voice_members(MockVoiceChannel(members=members))
        for member in members:
            member.move_to.assert_awaited_once()
Ejemplo n.º 5
0
    async def test_skipped_already_unsilenced(self):
        """Permissions were not set and `False` was returned for an already unsilenced channel."""
        self.cog.scheduler.__contains__.return_value = False
        self.cog.previous_overwrites.get.return_value = None

        for channel in (MockVoiceChannel(), MockTextChannel()):
            with self.subTest(channel=channel):
                self.assertFalse(await self.cog._unsilence(channel))
                channel.set_permissions.assert_not_called()
Ejemplo n.º 6
0
    async def test_skipped_already_silenced(self):
        """Permissions were not set and `False` was returned for an already silenced channel."""
        subtests = (
            (False, MockTextChannel(), PermissionOverwrite(send_messages=False, add_reactions=False)),
            (True, MockTextChannel(), PermissionOverwrite(send_messages=True, add_reactions=True)),
            (True, MockTextChannel(), PermissionOverwrite(send_messages=False, add_reactions=False)),
            (False, MockVoiceChannel(), PermissionOverwrite(connect=False, speak=False)),
            (True, MockVoiceChannel(), PermissionOverwrite(connect=True, speak=True)),
            (True, MockVoiceChannel(), PermissionOverwrite(connect=False, speak=False)),
        )

        for contains, channel, overwrite in subtests:
            with self.subTest(contains=contains, is_text=isinstance(channel, MockTextChannel), overwrite=overwrite):
                self.cog.scheduler.__contains__.return_value = contains
                channel.overwrites_for.return_value = overwrite

                self.assertFalse(await self.cog._set_silence_overwrites(channel))
                channel.set_permissions.assert_not_called()
Ejemplo n.º 7
0
    async def test_force_voice_sync_no_channel(self):
        """Test to ensure _force_voice_sync can create its own voice channel if one is not available."""
        await self.cog._async_init()

        channel = MockVoiceChannel(guild=MockGuild(afk_channel=None))
        new_channel = MockVoiceChannel(delete=AsyncMock())
        channel.guild.create_voice_channel.return_value = new_channel

        await self.cog._force_voice_sync(channel)

        # Check channel creation
        overwrites = {
            channel.guild.default_role: PermissionOverwrite(speak=False, connect=False, view_channel=False)
        }
        channel.guild.create_voice_channel.assert_awaited_once_with("mute-temp", overwrites=overwrites)

        # Check bot deleted channel
        new_channel.delete.assert_awaited_once()
Ejemplo n.º 8
0
    async def test_unsilence_role(self):
        """Tests unsilence_wrapper applies permission to the correct role."""
        test_cases = (
            (MockTextChannel(), self.cog.bot.get_guild(Guild.id).default_role),
            (MockVoiceChannel(), self.cog.bot.get_guild(Guild.id).get_role(Roles.voice_verified))
        )

        for channel, role in test_cases:
            with self.subTest(channel=channel, role=role):
                await self.cog._unsilence_wrapper(channel, MockContext())
                channel.overwrites_for.assert_called_with(role)
Ejemplo n.º 9
0
    async def test_voice_kick(self):
        """Test to ensure kick function can remove all members from a voice channel."""
        await self.cog._async_init()

        # Create a regular member, and one member for each of the moderation roles
        moderation_members = [MockMember(roles=[MockRole(id=role)]) for role in MODERATION_ROLES]
        members = [MockMember(), *moderation_members]

        channel = MockVoiceChannel(members=members)
        await self.cog._kick_voice_members(channel)

        for member in members:
            if member in moderation_members:
                member.move_to.assert_not_called()
            else:
                self.assertEqual((None,), member.move_to.call_args_list[0].args)
Ejemplo n.º 10
0
    def setUp(self) -> None:
        self.bot = MockBot(get_channel=lambda _: MockTextChannel())
        self.cog = silence.Silence(self.bot)
        self.cog._init_task = asyncio.Future()
        self.cog._init_task.set_result(None)

        # Avoid unawaited coroutine warnings.
        self.cog.scheduler.schedule_later.side_effect = lambda delay, task_id, coro: coro.close()

        asyncio.run(self.cog._async_init())  # Populate instance attributes.

        self.text_channel = MockTextChannel()
        self.text_overwrite = PermissionOverwrite(send_messages=True, add_reactions=False)
        self.text_channel.overwrites_for.return_value = self.text_overwrite

        self.voice_channel = MockVoiceChannel()
        self.voice_overwrite = PermissionOverwrite(connect=True, speak=True)
        self.voice_channel.overwrites_for.return_value = self.voice_overwrite
Ejemplo n.º 11
0
    async def test_sent_correct_message(self):
        """Appropriate failure/success message was sent by the command to the correct channel."""
        # The following test tuples are made up of:
        # duration, expected message, and the success of the _set_silence_overwrites function
        test_cases = (
            (
                0.0001,
                silence.MSG_SILENCE_SUCCESS.format(duration=0.0001),
                True,
            ),
            (
                None,
                silence.MSG_SILENCE_PERMANENT,
                True,
            ),
            (
                5,
                silence.MSG_SILENCE_FAIL,
                False,
            ),
        )

        targets = (MockTextChannel(), MockVoiceChannel(), None)

        for (duration, message,
             was_silenced), target in itertools.product(test_cases, targets):
            with mock.patch.object(self.cog,
                                   "_set_silence_overwrites",
                                   return_value=was_silenced):
                with self.subTest(was_silenced=was_silenced,
                                  target=target,
                                  message=message):
                    with mock.patch.object(self.cog,
                                           "send_message") as send_message:
                        ctx = MockContext()
                        await self.cog.silence.callback(
                            self.cog, ctx, target, duration)
                        send_message.assert_called_once_with(
                            message,
                            ctx.channel,
                            target or ctx.channel,
                            alert_target=was_silenced)
Ejemplo n.º 12
0
    def setUp(self) -> None:
        self.bot = MockBot(get_channel=lambda _: MockTextChannel())
        self.cog = silence.Silence(self.bot)
        self.cog._init_task = asyncio.Future()
        self.cog._init_task.set_result(None)

        overwrites_cache = mock.create_autospec(self.cog.previous_overwrites, spec_set=True)
        self.cog.previous_overwrites = overwrites_cache

        asyncio.run(self.cog._async_init())  # Populate instance attributes.

        self.cog.scheduler.__contains__.return_value = True
        overwrites_cache.get.return_value = '{"send_messages": true, "add_reactions": false}'
        self.text_channel = MockTextChannel()
        self.text_overwrite = PermissionOverwrite(send_messages=False, add_reactions=False)
        self.text_channel.overwrites_for.return_value = self.text_overwrite

        self.voice_channel = MockVoiceChannel()
        self.voice_overwrite = PermissionOverwrite(connect=True, speak=True)
        self.voice_channel.overwrites_for.return_value = self.voice_overwrite
Ejemplo n.º 13
0
    async def test_force_voice_sync(self):
        """Tests the _force_voice_sync helper function."""
        await self.cog._async_init()

        # Create a regular member, and one member for each of the moderation roles
        moderation_members = [MockMember(roles=[MockRole(id=role)]) for role in MODERATION_ROLES]
        members = [MockMember(), *moderation_members]

        channel = MockVoiceChannel(members=members)

        await self.cog._force_voice_sync(channel)
        for member in members:
            if member in moderation_members:
                member.move_to.assert_not_called()
            else:
                self.assertEqual(member.move_to.call_count, 2)
                calls = member.move_to.call_args_list

                # Tests that the member was moved to the afk channel, and back.
                self.assertEqual((channel.guild.afk_channel,), calls[0].args)
                self.assertEqual((channel,), calls[1].args)
Ejemplo n.º 14
0
 async def test_cache_miss_sent_mod_alert_voice(self):
     """A message was sent to the mod alerts channel upon muting a voice channel."""
     self.cog.previous_overwrites.get.return_value = None
     await self.cog._unsilence(MockVoiceChannel())
     self.cog._mod_alerts_channel.send.assert_awaited_once()