aboutsummaryrefslogtreecommitdiffstats
path: root/tests/cogs/test_trigger.py
blob: a60a1396d1e6865dc0d08d0b9f41b6ccc68fda70 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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)