From 857a7364ddb9b10529593c5e9c3578eb95c1da9b Mon Sep 17 00:00:00 2001 From: salmonik Date: Sat, 18 Apr 2026 16:24:42 +0200 Subject: add a test suite Signed-off-by: salmonik --- tests/cogs/test_trigger.py | 106 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 tests/cogs/test_trigger.py (limited to 'tests/cogs/test_trigger.py') diff --git a/tests/cogs/test_trigger.py b/tests/cogs/test_trigger.py new file mode 100644 index 0000000..befc360 --- /dev/null +++ b/tests/cogs/test_trigger.py @@ -0,0 +1,106 @@ +import pytest +from unittest.mock import AsyncMock, patch, MagicMock +import sqlite3 +from tests.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) \ No newline at end of file -- cgit v1.2.3