import pytest from unittest.mock import AsyncMock, patch, MagicMock import sqlite3 from conftest import MockApplicationContext @pytest.fixture def trigger_cog(bot): with patch('cogs.trigger.get_connection') as mock_conn: mock_conn.return_value.__enter__ = MagicMock(return_value=MagicMock()) mock_conn.return_value.__exit__ = MagicMock(return_value=False) from cogs.trigger import Trigger cog = Trigger(bot) return cog @pytest.fixture def mock_db_connection(): with patch('cogs.trigger.get_connection') as mock_get_conn: mock_conn = MagicMock() mock_cursor = MagicMock() mock_conn.cursor.return_value = mock_cursor mock_get_conn.return_value.__enter__ = MagicMock(return_value=mock_conn) mock_get_conn.return_value.__exit__ = MagicMock(return_value=False) yield mock_conn, mock_cursor @pytest.mark.asyncio async def test_trigger_create_command(trigger_cog, mock_channel, mock_guild, bot, mock_db_connection): ctx = MockApplicationContext(bot=bot, channel=mock_channel, guild=mock_guild) mock_conn, mock_cursor = mock_db_connection mock_cursor.fetchone.return_value = None with patch('cogs.trigger.get_connection') as mock_get_conn: mock_conn = MagicMock() mock_cursor = MagicMock() mock_conn.cursor.return_value = mock_cursor mock_get_conn.return_value.__enter__ = MagicMock(return_value=mock_conn) mock_get_conn.return_value.__exit__ = MagicMock(return_value=False) with patch.object(ctx, 'respond', new_callable=AsyncMock) as mock_respond: await trigger_cog.create.callback(trigger_cog, ctx, name="test_trigger") mock_respond.assert_called_once_with("trigger added") @pytest.mark.asyncio async def test_trigger_add_command(trigger_cog, mock_channel, mock_guild, bot, mock_db_connection): ctx = MockApplicationContext(bot=bot, channel=mock_channel, guild=mock_guild) with patch('cogs.trigger.get_connection') as mock_get_conn: mock_conn = MagicMock() mock_cursor = MagicMock() mock_cursor.fetchone.return_value = (1,) # trigger exists mock_conn.cursor.return_value = mock_cursor mock_get_conn.return_value.__enter__ = MagicMock(return_value=mock_conn) mock_get_conn.return_value.__exit__ = MagicMock(return_value=False) with patch.object(ctx, 'respond', new_callable=AsyncMock) as mock_respond: await trigger_cog.add.callback(trigger_cog, ctx, name="test_trigger", trigger="hello", response="Hi there!") mock_respond.assert_called_once_with("trigger updated") @pytest.mark.asyncio async def test_trigger_add_command_not_found(trigger_cog, mock_channel, mock_guild, bot, mock_db_connection): ctx = MockApplicationContext(bot=bot, channel=mock_channel, guild=mock_guild) with patch('cogs.trigger.get_connection') as mock_get_conn: mock_conn = MagicMock() mock_cursor = MagicMock() mock_cursor.fetchone.return_value = None # trigger not found mock_conn.cursor.return_value = mock_cursor mock_get_conn.return_value.__enter__ = MagicMock(return_value=mock_conn) mock_get_conn.return_value.__exit__ = MagicMock(return_value=False) with patch.object(ctx, 'respond', new_callable=AsyncMock) as mock_respond: await trigger_cog.add.callback(trigger_cog, ctx, name="nonexistent", trigger="hello", response="Hi") mock_respond.assert_called_once_with("Trigger not found.") @pytest.mark.asyncio async def test_trigger_delete_command(trigger_cog, mock_channel, mock_guild, bot, mock_db_connection): ctx = MockApplicationContext(bot=bot, channel=mock_channel, guild=mock_guild) with patch('cogs.trigger.get_connection') as mock_get_conn: mock_conn = MagicMock() mock_cursor = MagicMock() mock_cursor.fetchone.return_value = (1,) # trigger exists mock_conn.cursor.return_value = mock_cursor mock_get_conn.return_value.__enter__ = MagicMock(return_value=mock_conn) mock_get_conn.return_value.__exit__ = MagicMock(return_value=False) with patch.object(ctx, 'respond', new_callable=AsyncMock) as mock_respond: await trigger_cog.delete.callback(trigger_cog, ctx, name="test_trigger") mock_respond.assert_called_once_with("trigger deleted") @pytest.mark.asyncio async def test_trigger_help_command(trigger_cog, mock_channel, mock_guild, bot): ctx = MockApplicationContext(bot=bot, channel=mock_channel, guild=mock_guild) with patch.object(ctx, 'respond', new_callable=AsyncMock) as mock_respond: await trigger_cog.help.callback(trigger_cog, ctx) mock_respond.assert_called_once() args = mock_respond.call_args assert "Trigger create" in str(args)