import unittest from types import SimpleNamespace from unittest.mock import AsyncMock, patch from cogs.intern import InternCog class InternVoiceBehaviorTests(unittest.TestCase): def make_cog(self, voice_client=None): cog = InternCog.__new__(InternCog) cog.bot = SimpleNamespace(voice_clients=[voice_client] if voice_client else []) cog.data = [{"guild_id": 123, "mentor_id": 456}] cog.connected_guild_ids = set() cog.in_voice_channel = False return cog def make_channel(self, channel_id, guild, connect_mock=None, name="test-channel"): return SimpleNamespace(id=channel_id, guild=guild, connect=connect_mock or AsyncMock(), name=name) def make_member(self, member_id): return SimpleNamespace(id=member_id) async def _run_handler(self, cog, before_channel, after_channel, voice_client): before = SimpleNamespace(channel=before_channel) after = SimpleNamespace(channel=after_channel) member = self.make_member(456) await cog.on_voice_state_update(member, before, after) def test_initial_join_only_connects_with_25_percent_chance(self): cog = self.make_cog() connect_mock = AsyncMock() guild = SimpleNamespace(id=123, voice_client=None) channel = self.make_channel(1, guild, connect_mock=connect_mock) before = None after = SimpleNamespace(channel=channel) member = self.make_member(456) with patch("cogs.intern.random.random", return_value=0.1): import asyncio asyncio.run(cog.on_voice_state_update(member, before, after)) connect_mock.assert_awaited_once() cog = self.make_cog() connect_mock = AsyncMock() guild = SimpleNamespace(id=123, voice_client=None) channel = self.make_channel(1, guild, connect_mock=connect_mock) before = None after = SimpleNamespace(channel=channel) member = self.make_member(456) with patch("cogs.intern.random.random", return_value=0.9): import asyncio asyncio.run(cog.on_voice_state_update(member, before, after)) connect_mock.assert_not_awaited() def test_move_always_moves_the_bot_when_connected(self): guild = SimpleNamespace(id=123, voice_client=None) voice_client = SimpleNamespace(move_to=AsyncMock(), disconnect=AsyncMock(), guild=guild) cog = self.make_cog(voice_client=voice_client) before_channel = self.make_channel(1, guild) after_channel = self.make_channel(2, guild) import asyncio asyncio.run(self._run_handler(cog, before_channel, after_channel, voice_client)) voice_client.move_to.assert_awaited_once_with(after_channel) def test_disconnect_always_disconnects_when_mentor_leaves(self): guild = SimpleNamespace(id=123, voice_client=None) voice_client = SimpleNamespace(move_to=AsyncMock(), disconnect=AsyncMock(), guild=guild) cog = self.make_cog(voice_client=voice_client) before_channel = self.make_channel(1, guild) after_channel = None import asyncio asyncio.run(self._run_handler(cog, before_channel, after_channel, voice_client)) voice_client.disconnect.assert_awaited_once_with(force=True) if __name__ == "__main__": unittest.main()