mirror of
https://github.com/FerraSoft/bottohelp.git
synced 2026-08-06 21:55:03 +00:00
365 lines
14 KiB
Python
365 lines
14 KiB
Python
"""
|
|
Unit-тесты для TriggerRepository.
|
|
"""
|
|
|
|
import pytest
|
|
from unittest.mock import Mock, patch
|
|
from datetime import datetime
|
|
from database.repository import TriggerRepository
|
|
|
|
|
|
class TestTriggerRepository:
|
|
"""Тесты репозитория триггеров"""
|
|
|
|
@pytest.fixture
|
|
def trigger_repository(self):
|
|
"""Фикстура репозитория триггеров с in-memory базой"""
|
|
repo = TriggerRepository(':memory:')
|
|
return repo
|
|
|
|
def test_get_active_triggers_group(self, trigger_repository):
|
|
"""Тест получения активных триггеров для групповых чатов"""
|
|
# Создаем тестовые данные
|
|
trigger_repository._execute_query("""
|
|
INSERT INTO triggers (name, pattern, response_text, is_active, chat_type)
|
|
VALUES (?, ?, ?, ?, ?)
|
|
""", ('active_group_trigger', r'hello', 'Hi!', 1, 'group'))
|
|
|
|
trigger_repository._execute_query("""
|
|
INSERT INTO triggers (name, pattern, response_text, is_active, chat_type)
|
|
VALUES (?, ?, ?, ?, ?)
|
|
""", ('inactive_trigger', r'bye', 'Bye!', 0, 'group'))
|
|
|
|
trigger_repository._execute_query("""
|
|
INSERT INTO triggers (name, pattern, response_text, is_active, chat_type)
|
|
VALUES (?, ?, ?, ?, ?)
|
|
""", ('private_trigger', r'private', 'Private!', 1, 'private'))
|
|
|
|
triggers = trigger_repository.get_active_triggers('group')
|
|
|
|
assert len(triggers) == 1
|
|
assert triggers[0]['name'] == 'active_group_trigger'
|
|
assert triggers[0]['pattern'] == r'hello'
|
|
assert triggers[0]['response_text'] == 'Hi!'
|
|
|
|
def test_get_active_triggers_private(self, trigger_repository):
|
|
"""Тест получения активных триггеров для приватных чатов"""
|
|
# Создаем тестовые данные
|
|
trigger_repository._execute_query("""
|
|
INSERT INTO triggers (name, pattern, response_text, is_active, chat_type)
|
|
VALUES (?, ?, ?, ?, ?)
|
|
""", ('private_trigger', r'private', 'Private!', 1, 'private'))
|
|
|
|
trigger_repository._execute_query("""
|
|
INSERT INTO triggers (name, pattern, response_text, is_active, chat_type)
|
|
VALUES (?, ?, ?, ?, ?)
|
|
""", ('group_trigger', r'group', 'Group!', 1, 'group'))
|
|
|
|
triggers = trigger_repository.get_active_triggers('private')
|
|
|
|
assert len(triggers) == 1
|
|
assert triggers[0]['name'] == 'private_trigger'
|
|
assert triggers[0]['chat_type'] == 'private'
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_get_active_triggers_async(self, trigger_repository):
|
|
"""Тест асинхронного получения активных триггеров"""
|
|
# Создаем тестовые данные
|
|
trigger_repository._execute_query("""
|
|
INSERT INTO triggers (name, pattern, response_text, is_active, chat_type)
|
|
VALUES (?, ?, ?, ?, ?)
|
|
""", ('async_trigger', r'async', 'Async!', 1, 'group'))
|
|
|
|
triggers = await trigger_repository.get_active_triggers_async('group')
|
|
|
|
assert len(triggers) == 1
|
|
assert triggers[0]['name'] == 'async_trigger'
|
|
|
|
def test_add_trigger_success(self, trigger_repository):
|
|
"""Тест успешного добавления триггера"""
|
|
trigger_data = {
|
|
'name': 'new_trigger',
|
|
'description': 'Test trigger',
|
|
'pattern': r'test\s+pattern',
|
|
'response_text': 'Test response',
|
|
'response_sticker': 'sticker123',
|
|
'response_gif': 'gif456',
|
|
'created_by': 123456,
|
|
'chat_type': 'group'
|
|
}
|
|
|
|
trigger_id = trigger_repository.add_trigger(trigger_data)
|
|
|
|
assert trigger_id is not None
|
|
assert isinstance(trigger_id, int)
|
|
|
|
# Проверяем, что триггер был добавлен
|
|
trigger = trigger_repository.get_trigger_by_id(trigger_id)
|
|
assert trigger is not None
|
|
assert trigger['name'] == 'new_trigger'
|
|
assert trigger['description'] == 'Test trigger'
|
|
assert trigger['pattern'] == r'test\s+pattern'
|
|
assert trigger['response_text'] == 'Test response'
|
|
assert trigger['response_sticker'] == 'sticker123'
|
|
assert trigger['response_gif'] == 'gif456'
|
|
assert trigger['created_by'] == 123456
|
|
assert trigger['chat_type'] == 'group'
|
|
assert trigger['is_active'] == 1
|
|
assert trigger['trigger_count'] == 0
|
|
|
|
def test_add_trigger_minimal_data(self, trigger_repository):
|
|
"""Тест добавления триггера с минимальными данными"""
|
|
trigger_data = {
|
|
'name': 'minimal_trigger',
|
|
'pattern': r'minimal'
|
|
}
|
|
|
|
trigger_id = trigger_repository.add_trigger(trigger_data)
|
|
|
|
assert trigger_id is not None
|
|
|
|
trigger = trigger_repository.get_trigger_by_id(trigger_id)
|
|
assert trigger['name'] == 'minimal_trigger'
|
|
assert trigger['pattern'] == r'minimal'
|
|
assert trigger['response_text'] is None
|
|
assert trigger['chat_type'] == 'group' # значение по умолчанию
|
|
|
|
def test_update_trigger_stats_success(self, trigger_repository):
|
|
"""Тест успешного обновления статистики триггера"""
|
|
# Создаем триггер
|
|
trigger_id = trigger_repository.add_trigger({
|
|
'name': 'stats_trigger',
|
|
'pattern': r'stats'
|
|
})
|
|
|
|
# Обновляем статистику
|
|
success = trigger_repository.update_trigger_stats(trigger_id)
|
|
|
|
assert success == True
|
|
|
|
# Проверяем обновление
|
|
trigger = trigger_repository.get_trigger_by_id(trigger_id)
|
|
assert trigger['trigger_count'] == 1
|
|
assert trigger['last_triggered'] is not None
|
|
|
|
def test_update_trigger_stats_nonexistent(self, trigger_repository):
|
|
"""Тест обновления статистики несуществующего триггера"""
|
|
success = trigger_repository.update_trigger_stats(99999)
|
|
|
|
assert success == False
|
|
|
|
def test_get_trigger_by_id_exists(self, trigger_repository):
|
|
"""Тест получения существующего триггера по ID"""
|
|
trigger_data = {
|
|
'name': 'test_trigger',
|
|
'pattern': r'test',
|
|
'response_text': 'Test response'
|
|
}
|
|
|
|
trigger_id = trigger_repository.add_trigger(trigger_data)
|
|
trigger = trigger_repository.get_trigger_by_id(trigger_id)
|
|
|
|
assert trigger is not None
|
|
assert trigger['id'] == trigger_id
|
|
assert trigger['name'] == 'test_trigger'
|
|
assert trigger['pattern'] == r'test'
|
|
assert trigger['response_text'] == 'Test response'
|
|
|
|
def test_get_trigger_by_id_not_exists(self, trigger_repository):
|
|
"""Тест получения несуществующего триггера по ID"""
|
|
trigger = trigger_repository.get_trigger_by_id(99999)
|
|
|
|
assert trigger is None
|
|
|
|
def test_update_trigger_success(self, trigger_repository):
|
|
"""Тест успешного обновления триггера"""
|
|
# Создаем триггер
|
|
trigger_id = trigger_repository.add_trigger({
|
|
'name': 'update_trigger',
|
|
'pattern': r'old_pattern',
|
|
'response_text': 'Old response'
|
|
})
|
|
|
|
# Обновляем
|
|
update_data = {
|
|
'name': 'updated_trigger',
|
|
'pattern': r'new_pattern',
|
|
'response_text': 'New response'
|
|
}
|
|
|
|
success = trigger_repository.update_trigger(trigger_id, update_data)
|
|
|
|
assert success == True
|
|
|
|
# Проверяем обновление
|
|
trigger = trigger_repository.get_trigger_by_id(trigger_id)
|
|
assert trigger['name'] == 'updated_trigger'
|
|
assert trigger['pattern'] == r'new_pattern'
|
|
assert trigger['response_text'] == 'New response'
|
|
|
|
def test_update_trigger_not_exists(self, trigger_repository):
|
|
"""Тест обновления несуществующего триггера"""
|
|
success = trigger_repository.update_trigger(99999, {'name': 'new_name'})
|
|
|
|
assert success == False
|
|
|
|
def test_update_trigger_partial(self, trigger_repository):
|
|
"""Тест частичного обновления триггера"""
|
|
# Создаем триггер
|
|
trigger_id = trigger_repository.add_trigger({
|
|
'name': 'partial_trigger',
|
|
'pattern': r'partial',
|
|
'response_text': 'Original response'
|
|
})
|
|
|
|
# Обновляем только имя
|
|
success = trigger_repository.update_trigger(trigger_id, {'name': 'updated_partial'})
|
|
|
|
assert success == True
|
|
|
|
trigger = trigger_repository.get_trigger_by_id(trigger_id)
|
|
assert trigger['name'] == 'updated_partial'
|
|
assert trigger['pattern'] == r'partial' # Не изменено
|
|
assert trigger['response_text'] == 'Original response' # Не изменено
|
|
|
|
def test_delete_trigger_success(self, trigger_repository):
|
|
"""Тест успешного удаления триггера"""
|
|
# Создаем триггер
|
|
trigger_id = trigger_repository.add_trigger({
|
|
'name': 'delete_trigger',
|
|
'pattern': r'delete'
|
|
})
|
|
|
|
# Удаляем
|
|
success = trigger_repository.delete_trigger(trigger_id)
|
|
|
|
assert success == True
|
|
|
|
# Проверяем, что триггер удален
|
|
trigger = trigger_repository.get_trigger_by_id(trigger_id)
|
|
assert trigger is None
|
|
|
|
def test_delete_trigger_not_exists(self, trigger_repository):
|
|
"""Тест удаления несуществующего триггера"""
|
|
success = trigger_repository.delete_trigger(99999)
|
|
|
|
assert success == False
|
|
|
|
def test_get_all_triggers(self, trigger_repository):
|
|
"""Тест получения всех триггеров"""
|
|
# Создаем несколько триггеров
|
|
trigger_repository.add_trigger({
|
|
'name': 'trigger1',
|
|
'pattern': r'pattern1'
|
|
})
|
|
|
|
trigger_repository.add_trigger({
|
|
'name': 'trigger2',
|
|
'pattern': r'pattern2'
|
|
})
|
|
|
|
triggers = trigger_repository.get_all_triggers()
|
|
|
|
assert len(triggers) >= 2 # Может быть больше из других тестов
|
|
|
|
# Проверяем сортировку по created_at DESC
|
|
trigger_names = [t['name'] for t in triggers if t['name'] in ['trigger1', 'trigger2']]
|
|
assert 'trigger2' in trigger_names # trigger2 создан позже
|
|
|
|
def test_toggle_trigger_activate(self, trigger_repository):
|
|
"""Тест активации триггера"""
|
|
# Создаем неактивный триггер
|
|
trigger_id = trigger_repository.add_trigger({
|
|
'name': 'toggle_trigger',
|
|
'pattern': r'toggle'
|
|
})
|
|
|
|
# Деактивируем
|
|
trigger_repository.toggle_trigger(trigger_id, False)
|
|
|
|
# Активируем
|
|
success = trigger_repository.toggle_trigger(trigger_id, True)
|
|
|
|
assert success == True
|
|
|
|
trigger = trigger_repository.get_trigger_by_id(trigger_id)
|
|
assert trigger['is_active'] == 1
|
|
|
|
def test_toggle_trigger_deactivate(self, trigger_repository):
|
|
"""Тест деактивации триггера"""
|
|
# Создаем активный триггер (по умолчанию активен)
|
|
trigger_id = trigger_repository.add_trigger({
|
|
'name': 'deactivate_trigger',
|
|
'pattern': r'deactivate'
|
|
})
|
|
|
|
# Деактивируем
|
|
success = trigger_repository.toggle_trigger(trigger_id, False)
|
|
|
|
assert success == True
|
|
|
|
trigger = trigger_repository.get_trigger_by_id(trigger_id)
|
|
assert trigger['is_active'] == 0
|
|
|
|
def test_toggle_trigger_not_exists(self, trigger_repository):
|
|
"""Тест переключения статуса несуществующего триггера"""
|
|
success = trigger_repository.toggle_trigger(99999, True)
|
|
|
|
assert success == False
|
|
|
|
def test_trigger_with_reaction(self, trigger_repository):
|
|
"""Тест триггера с реакцией"""
|
|
trigger_data = {
|
|
'name': 'reaction_trigger',
|
|
'pattern': r'react',
|
|
'reaction_type': 'emoji',
|
|
'action_data': '👍'
|
|
}
|
|
|
|
trigger_id = trigger_repository.add_trigger(trigger_data)
|
|
|
|
trigger = trigger_repository.get_trigger_by_id(trigger_id)
|
|
assert trigger.get('reaction_type') == 'emoji'
|
|
assert trigger.get('action_data') == '👍'
|
|
|
|
def test_trigger_with_multiple_responses(self, trigger_repository):
|
|
"""Тест триггера с множественными ответами"""
|
|
trigger_data = {
|
|
'name': 'multi_response_trigger',
|
|
'pattern': r'multi',
|
|
'response_text': 'Text response',
|
|
'response_sticker': 'sticker123',
|
|
'response_gif': 'gif456',
|
|
'reaction_type': 'emoji',
|
|
'action_data': '❤️'
|
|
}
|
|
|
|
trigger_id = trigger_repository.add_trigger(trigger_data)
|
|
|
|
trigger = trigger_repository.get_trigger_by_id(trigger_id)
|
|
assert trigger['response_text'] == 'Text response'
|
|
assert trigger['response_sticker'] == 'sticker123'
|
|
assert trigger['response_gif'] == 'gif456'
|
|
assert trigger.get('reaction_type') == 'emoji'
|
|
assert trigger.get('action_data') == '❤️'
|
|
|
|
def test_trigger_default_values(self, trigger_repository):
|
|
"""Тест значений по умолчанию для триггера"""
|
|
trigger_data = {
|
|
'name': 'default_trigger',
|
|
'pattern': r'default'
|
|
}
|
|
|
|
trigger_id = trigger_repository.add_trigger(trigger_data)
|
|
|
|
trigger = trigger_repository.get_trigger_by_id(trigger_id)
|
|
assert trigger['chat_type'] == 'group'
|
|
assert trigger['is_active'] == 1
|
|
assert trigger['trigger_count'] == 0
|
|
assert trigger['created_by'] == 0
|
|
assert trigger['response_text'] is None
|
|
assert trigger['response_sticker'] is None
|
|
assert trigger['response_gif'] is None
|
|
assert trigger.get('reaction_type') is None
|
|
assert trigger.get('action_data') is None
|
|
assert trigger.get('last_triggered') is None |