Files
telegram-helper-bot/tests/test_voice_handler.py
2026-02-01 23:04:32 +03:00

152 lines
5.5 KiB
Python

from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from aiogram import types
from aiogram.fsm.context import FSMContext
from helper_bot.handlers.voice.constants import (STATE_STANDUP_WRITE,
STATE_START)
from helper_bot.handlers.voice.voice_handler import VoiceHandlers
class TestVoiceHandler:
"""Тесты для VoiceHandler"""
@pytest.fixture
def mock_db(self):
"""Мок для базы данных"""
mock_db = Mock()
mock_db.settings = {
"Telegram": {
"group_for_logs": "test_logs_chat",
"group_for_posts": "test_posts_chat",
"preview_link": True,
}
}
return mock_db
@pytest.fixture
def mock_settings(self):
"""Мок для настроек"""
return {
"Telegram": {
"group_for_logs": "test_logs_chat",
"group_for_posts": "test_posts_chat",
"preview_link": True,
}
}
@pytest.fixture
def mock_message(self):
"""Мок для сообщения"""
message = Mock(spec=types.Message)
message.from_user = Mock()
message.from_user.id = 123
message.from_user.first_name = "Test"
message.from_user.full_name = "Test User"
message.chat = Mock()
message.chat.id = 456
message.answer = AsyncMock()
message.forward = AsyncMock()
return message
@pytest.fixture
def mock_state(self):
"""Мок для состояния FSM"""
state = Mock(spec=FSMContext)
state.set_state = AsyncMock()
return state
@pytest.fixture
def voice_handler(self, mock_db, mock_settings):
"""Экземпляр VoiceHandler для тестов"""
return VoiceHandlers(mock_db, mock_settings)
@pytest.mark.asyncio
async def test_voice_bot_button_handler_welcome_received(
self, voice_handler, mock_message, mock_state, mock_db, mock_settings
):
"""Тест обработчика кнопки когда приветствие уже получено"""
from unittest.mock import AsyncMock
mock_db.check_voice_bot_welcome_received = AsyncMock(return_value=True)
with patch.object(voice_handler, "restart_function") as mock_restart:
with patch(
"helper_bot.handlers.voice.voice_handler.update_user_info"
) as mock_update_user:
mock_update_user.return_value = None
await voice_handler.voice_bot_button_handler(
mock_message, mock_state, mock_db, mock_settings
)
mock_db.check_voice_bot_welcome_received.assert_called_once_with(123)
mock_restart.assert_called_once_with(
mock_message, mock_state, mock_db, mock_settings
)
@pytest.mark.asyncio
async def test_voice_bot_button_handler_welcome_not_received(
self, voice_handler, mock_message, mock_state, mock_db, mock_settings
):
"""Тест обработчика кнопки когда приветствие не получено"""
from unittest.mock import AsyncMock
mock_db.check_voice_bot_welcome_received = AsyncMock(return_value=False)
with patch.object(voice_handler, "start") as mock_start:
await voice_handler.voice_bot_button_handler(
mock_message, mock_state, mock_db, mock_settings
)
mock_db.check_voice_bot_welcome_received.assert_called_once_with(123)
mock_start.assert_called_once_with(
mock_message, mock_state, mock_db, mock_settings
)
@pytest.mark.asyncio
async def test_voice_bot_button_handler_exception(
self, voice_handler, mock_message, mock_state, mock_db, mock_settings
):
"""Тест обработчика кнопки при исключении"""
mock_db.check_voice_bot_welcome_received.side_effect = Exception("Test error")
with patch.object(voice_handler, "start") as mock_start:
await voice_handler.voice_bot_button_handler(
mock_message, mock_state, mock_db, mock_settings
)
mock_start.assert_called_once_with(
mock_message, mock_state, mock_db, mock_settings
)
# Упрощенные тесты для основных функций
@pytest.mark.asyncio
async def test_standup_write(
self, voice_handler, mock_message, mock_state, mock_db, mock_settings
):
"""Тест функции standup_write"""
with patch(
"helper_bot.handlers.voice.voice_handler.messages.get_message"
) as mock_get_message:
mock_get_message.return_value = "Record voice message"
await voice_handler.standup_write(
mock_message, mock_state, mock_db, mock_settings
)
mock_state.set_state.assert_called_once_with(STATE_STANDUP_WRITE)
mock_message.answer.assert_called_once_with(
text="Record voice message", reply_markup=types.ReplyKeyboardRemove()
)
def test_setup_handlers(self, voice_handler):
"""Тест настройки обработчиков"""
# Проверяем, что роутер содержит обработчики
assert len(voice_handler.router.message.handlers) > 0
if __name__ == "__main__":
pytest.main([__file__])