import pytest from unittest.mock import AsyncMock, patch, MagicMock import discord import httpx from tests.conftest import MockApplicationContext @pytest.fixture def ai_cog(bot): from cogs.ai import AI cog = AI(bot) return cog @pytest.fixture def mock_ai_response(): return { "choices": [ { "message": { "content": "Test response from AI" } } ] } @pytest.mark.asyncio async def test_senator_command_success(ai_cog, mock_channel, mock_guild, bot, mock_ai_response): ctx = MockApplicationContext(bot=bot, channel=mock_channel, guild=mock_guild) mock_response = MagicMock() mock_response.json = MagicMock(return_value=mock_ai_response) mock_client = MagicMock() mock_client.post = AsyncMock(return_value=mock_response) mock_client.__aenter__ = AsyncMock(return_value=mock_response) mock_client.__aexit__ = AsyncMock(return_value=None) with patch('cogs.ai.httpx.AsyncClient') as mock_httpx: instance = mock_httpx.return_value.__aenter__.return_value instance.post = AsyncMock(return_value=mock_response) with patch.object(ctx, 'send_followup', new_callable=AsyncMock) as mock_followup: await ai_cog.senator.callback(ai_cog, ctx, text="Hello", tts=False) mock_followup.assert_called_once_with("Test response from AI") @pytest.mark.asyncio async def test_senator_command_empty_choices(ai_cog, mock_channel, mock_guild, bot): ctx = MockApplicationContext(bot=bot, channel=mock_channel, guild=mock_guild) mock_response = MagicMock() mock_response.json = MagicMock(return_value={"choices": []}) mock_client = MagicMock() mock_client.post = AsyncMock(return_value=mock_response) mock_client.__aenter__ = AsyncMock(return_value=mock_response) mock_client.__aexit__ = AsyncMock(return_value=None) with patch('cogs.ai.httpx.AsyncClient') as mock_httpx: instance = mock_httpx.return_value.__aenter__.return_value instance.post = AsyncMock(return_value=mock_response) with patch.object(ctx, 'send_followup', new_callable=AsyncMock) as mock_followup: await ai_cog.senator.callback(ai_cog, ctx, text="Hello", tts=False) mock_followup.assert_called_once_with("bot siem zesroĊ‚") @pytest.mark.asyncio async def test_senator_command_no_choices_key(ai_cog, mock_channel, mock_guild, bot): ctx = MockApplicationContext(bot=bot, channel=mock_channel, guild=mock_guild) mock_response = MagicMock() mock_response.json = MagicMock(return_value={}) with patch('cogs.ai.httpx.AsyncClient') as mock_httpx: instance = mock_httpx.return_value.__aenter__.return_value instance.post = AsyncMock(return_value=mock_response) with patch('cogs.ai.logger') as mock_logger: try: await ai_cog.senator.callback(ai_cog, ctx, text="Hello", tts=False) except KeyError: pass assert mock_logger.info.called