mirror of
https://github.com/FerraSoft/bottohelp.git
synced 2026-08-06 21:55:03 +00:00
Подготовка к релизу
This commit is contained in:
@@ -0,0 +1,365 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user