fix linter, fix ci, fix tests

This commit is contained in:
2026-02-02 00:46:44 +03:00
parent 68041037bd
commit d87d4e492e
93 changed files with 1042 additions and 862 deletions

View File

@@ -3,8 +3,8 @@ 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.constants import (STATE_STANDUP_WRITE,
STATE_START)
from helper_bot.handlers.voice.voice_handler import VoiceHandlers
@@ -146,113 +146,226 @@ class TestVoiceHandler:
assert len(voice_handler.router.message.handlers) > 0
@pytest.mark.asyncio
async def test_restart_function_sets_state_and_answers(self, voice_handler, mock_message, mock_state, mock_db, mock_settings):
async def test_restart_function_sets_state_and_answers(
self, voice_handler, mock_message, mock_state, mock_db, mock_settings
):
"""restart_function пересылает в логи, обновляет инфо и отправляет клавиатуру."""
with patch('helper_bot.handlers.voice.voice_handler.update_user_info', new_callable=AsyncMock):
with patch('helper_bot.handlers.voice.voice_handler.check_user_emoji', new_callable=AsyncMock):
with patch('helper_bot.handlers.voice.voice_handler.get_main_keyboard') as mock_keyboard:
with patch(
"helper_bot.handlers.voice.voice_handler.update_user_info",
new_callable=AsyncMock,
):
with patch(
"helper_bot.handlers.voice.voice_handler.check_user_emoji",
new_callable=AsyncMock,
):
with patch(
"helper_bot.handlers.voice.voice_handler.get_main_keyboard"
) as mock_keyboard:
mock_keyboard.return_value = MagicMock()
await voice_handler.restart_function(mock_message, mock_state, mock_db, mock_settings)
mock_message.forward.assert_awaited_once_with(chat_id=mock_settings['Telegram']['group_for_logs'])
await voice_handler.restart_function(
mock_message, mock_state, mock_db, mock_settings
)
mock_message.forward.assert_awaited_once_with(
chat_id=mock_settings["Telegram"]["group_for_logs"]
)
mock_state.set_state.assert_called_once_with(STATE_START)
mock_message.answer.assert_called_once()
assert 'Записывайся' in mock_message.answer.call_args[1]['text'] or 'слушай' in mock_message.answer.call_args[1]['text']
assert (
"Записывайся" in mock_message.answer.call_args[1]["text"]
or "слушай" in mock_message.answer.call_args[1]["text"]
)
@pytest.mark.asyncio
async def test_start_sets_state_and_sends_welcome(self, voice_handler, mock_message, mock_state, mock_db, mock_settings):
async def test_start_sets_state_and_sends_welcome(
self, voice_handler, mock_message, mock_state, mock_db, mock_settings
):
"""start устанавливает состояние и отправляет приветствие через VoiceBotService."""
mock_db.mark_voice_bot_welcome_received = AsyncMock()
with patch('helper_bot.handlers.voice.voice_handler.update_user_info', new_callable=AsyncMock):
with patch('helper_bot.handlers.voice.voice_handler.get_user_emoji_safe', new_callable=AsyncMock, return_value='😊'):
with patch('helper_bot.handlers.voice.voice_handler.VoiceBotService') as mock_svc_cls:
mock_svc = MagicMock()
mock_svc.send_welcome_messages = AsyncMock()
mock_svc_cls.return_value = mock_svc
await voice_handler.start(mock_message, mock_state, mock_db, mock_settings)
mock_state.set_state.assert_called_once_with(STATE_START)
mock_svc.send_welcome_messages.assert_awaited_once()
mock_db.mark_voice_bot_welcome_received.assert_awaited_once_with(123)
with patch(
"helper_bot.handlers.voice.voice_handler.update_user_info",
new_callable=AsyncMock,
):
with patch(
"helper_bot.handlers.voice.voice_handler.get_user_emoji_safe",
new_callable=AsyncMock,
return_value="😊",
):
with patch(
"helper_bot.handlers.voice.voice_handler.VoiceBotService"
) as mock_svc_cls:
mock_svc = MagicMock()
mock_svc.send_welcome_messages = AsyncMock()
mock_svc_cls.return_value = mock_svc
await voice_handler.start(
mock_message, mock_state, mock_db, mock_settings
)
mock_state.set_state.assert_called_once_with(STATE_START)
mock_svc.send_welcome_messages.assert_awaited_once()
mock_db.mark_voice_bot_welcome_received.assert_awaited_once_with(
123
)
@pytest.mark.asyncio
async def test_help_function_answers_help_message(self, voice_handler, mock_message, mock_state, mock_settings):
async def test_help_function_answers_help_message(
self, voice_handler, mock_message, mock_state, mock_settings
):
"""help_function пересылает в логи и отправляет HELP_MESSAGE."""
with patch('helper_bot.handlers.voice.voice_handler.update_user_info', new_callable=AsyncMock):
with patch('helper_bot.handlers.voice.voice_handler.messages.get_message') as mock_get:
with patch(
"helper_bot.handlers.voice.voice_handler.update_user_info",
new_callable=AsyncMock,
):
with patch(
"helper_bot.handlers.voice.voice_handler.messages.get_message"
) as mock_get:
mock_get.return_value = "Help text"
await voice_handler.help_function(mock_message, mock_state, mock_settings)
mock_message.forward.assert_awaited_once_with(chat_id=mock_settings['Telegram']['group_for_logs'])
mock_message.answer.assert_called_once_with(text="Help text", disable_web_page_preview=not mock_settings['Telegram']['preview_link'])
await voice_handler.help_function(
mock_message, mock_state, mock_settings
)
mock_message.forward.assert_awaited_once_with(
chat_id=mock_settings["Telegram"]["group_for_logs"]
)
mock_message.answer.assert_called_once_with(
text="Help text",
disable_web_page_preview=not mock_settings["Telegram"][
"preview_link"
],
)
mock_state.set_state.assert_called_once_with(STATE_START)
@pytest.mark.asyncio
async def test_cancel_handler_returns_to_menu(self, voice_handler, mock_message, mock_state, mock_db, mock_settings):
async def test_cancel_handler_returns_to_menu(
self, voice_handler, mock_message, mock_state, mock_db, mock_settings
):
"""cancel_handler пересылает в логи и возвращает в главное меню."""
with patch('helper_bot.handlers.voice.voice_handler.update_user_info', new_callable=AsyncMock):
with patch('helper_bot.handlers.voice.voice_handler.get_reply_keyboard', new_callable=AsyncMock) as mock_kb:
with patch(
"helper_bot.handlers.voice.voice_handler.update_user_info",
new_callable=AsyncMock,
):
with patch(
"helper_bot.handlers.voice.voice_handler.get_reply_keyboard",
new_callable=AsyncMock,
) as mock_kb:
mock_kb.return_value = MagicMock()
await voice_handler.cancel_handler(mock_message, mock_state, mock_db, mock_settings)
await voice_handler.cancel_handler(
mock_message, mock_state, mock_db, mock_settings
)
mock_message.forward.assert_awaited_once()
mock_message.answer.assert_called_once()
assert 'Добро пожаловать' in mock_message.answer.call_args[1]['text'] or 'меню' in mock_message.answer.call_args[1]['text']
assert (
"Добро пожаловать" in mock_message.answer.call_args[1]["text"]
or "меню" in mock_message.answer.call_args[1]["text"]
)
mock_state.set_state.assert_called_once()
@pytest.mark.asyncio
async def test_refresh_listen_function_clears_listenings(self, voice_handler, mock_message, mock_state, mock_db, mock_settings):
async def test_refresh_listen_function_clears_listenings(
self, voice_handler, mock_message, mock_state, mock_db, mock_settings
):
"""refresh_listen_function очищает прослушивания и отправляет сообщение."""
with patch('helper_bot.handlers.voice.voice_handler.update_user_info', new_callable=AsyncMock):
with patch('helper_bot.handlers.voice.voice_handler.get_main_keyboard') as mock_keyboard:
with patch('helper_bot.handlers.voice.voice_handler.VoiceBotService') as mock_svc_cls:
with patch(
"helper_bot.handlers.voice.voice_handler.update_user_info",
new_callable=AsyncMock,
):
with patch(
"helper_bot.handlers.voice.voice_handler.get_main_keyboard"
) as mock_keyboard:
with patch(
"helper_bot.handlers.voice.voice_handler.VoiceBotService"
) as mock_svc_cls:
mock_svc = MagicMock()
mock_svc.clear_user_listenings = AsyncMock()
mock_svc_cls.return_value = mock_svc
with patch('helper_bot.handlers.voice.voice_handler.messages.get_message') as mock_get:
with patch(
"helper_bot.handlers.voice.voice_handler.messages.get_message"
) as mock_get:
mock_get.return_value = "Прослушивания сброшены"
await voice_handler.refresh_listen_function(mock_message, mock_state, mock_db, mock_settings)
await voice_handler.refresh_listen_function(
mock_message, mock_state, mock_db, mock_settings
)
mock_svc.clear_user_listenings.assert_awaited_once_with(123)
mock_message.answer.assert_called_once()
mock_state.set_state.assert_called_once_with(STATE_START)
@pytest.mark.asyncio
async def test_suggest_voice_valid_sends_to_group_and_saves(self, voice_handler, mock_message, mock_state, mock_db, mock_settings):
async def test_suggest_voice_valid_sends_to_group_and_saves(
self, voice_handler, mock_message, mock_state, mock_db, mock_settings
):
"""suggest_voice при валидном голосовом отправляет в группу и сохраняет message_id."""
mock_message.voice = MagicMock()
mock_message.voice.file_id = "voice_123"
with patch('helper_bot.handlers.voice.voice_handler.validate_voice_message', new_callable=AsyncMock, return_value=True):
with patch('helper_bot.handlers.voice.voice_handler.send_voice_message', new_callable=AsyncMock) as mock_send:
with patch(
"helper_bot.handlers.voice.voice_handler.validate_voice_message",
new_callable=AsyncMock,
return_value=True,
):
with patch(
"helper_bot.handlers.voice.voice_handler.send_voice_message",
new_callable=AsyncMock,
) as mock_send:
sent = MagicMock()
sent.message_id = 999
mock_send.return_value = sent
mock_db.set_user_id_and_message_id_for_voice_bot = AsyncMock()
with patch('helper_bot.handlers.voice.voice_handler.get_reply_keyboard_for_voice') as mock_kb:
with patch(
"helper_bot.handlers.voice.voice_handler.get_reply_keyboard_for_voice"
) as mock_kb:
mock_kb.return_value = MagicMock()
with patch('helper_bot.handlers.voice.voice_handler.messages.get_message') as mock_get:
with patch(
"helper_bot.handlers.voice.voice_handler.messages.get_message"
) as mock_get:
mock_get.return_value = "Голос сохранён"
await voice_handler.suggest_voice(mock_message, mock_state, mock_db, mock_settings)
await voice_handler.suggest_voice(
mock_message, mock_state, mock_db, mock_settings
)
mock_send.assert_awaited_once()
mock_db.set_user_id_and_message_id_for_voice_bot.assert_awaited_once_with(999, 123)
mock_db.set_user_id_and_message_id_for_voice_bot.assert_awaited_once_with(
999, 123
)
mock_message.answer.assert_called_once()
mock_state.set_state.assert_called_once_with(STATE_START)
@pytest.mark.asyncio
async def test_suggest_voice_invalid_keeps_state_standup_write(self, voice_handler, mock_message, mock_state, mock_db, mock_settings):
async def test_suggest_voice_invalid_keeps_state_standup_write(
self, voice_handler, mock_message, mock_state, mock_db, mock_settings
):
"""suggest_voice при невалидном голосовом оставляет состояние STANDUP_WRITE."""
with patch('helper_bot.handlers.voice.voice_handler.validate_voice_message', new_callable=AsyncMock, return_value=False):
with patch('helper_bot.handlers.voice.voice_handler.get_main_keyboard') as mock_keyboard:
with patch(
"helper_bot.handlers.voice.voice_handler.validate_voice_message",
new_callable=AsyncMock,
return_value=False,
):
with patch(
"helper_bot.handlers.voice.voice_handler.get_main_keyboard"
) as mock_keyboard:
mock_keyboard.return_value = MagicMock()
with patch('helper_bot.handlers.voice.voice_handler.messages.get_message') as mock_get:
with patch(
"helper_bot.handlers.voice.voice_handler.messages.get_message"
) as mock_get:
mock_get.return_value = "Неверный контент"
await voice_handler.suggest_voice(mock_message, mock_state, mock_db, mock_settings)
await voice_handler.suggest_voice(
mock_message, mock_state, mock_db, mock_settings
)
mock_message.answer.assert_called()
mock_state.set_state.assert_called_once_with(STATE_STANDUP_WRITE)
@pytest.mark.asyncio
async def test_handle_emoji_message_answers_emoji(self, voice_handler, mock_message, mock_state, mock_settings):
async def test_handle_emoji_message_answers_emoji(
self, voice_handler, mock_message, mock_state, mock_settings
):
"""handle_emoji_message пересылает в логи и отвечает эмодзи или ничего."""
with patch('helper_bot.handlers.voice.voice_handler.check_user_emoji', new_callable=AsyncMock, return_value='😊'):
await voice_handler.handle_emoji_message(mock_message, mock_state, mock_settings)
with patch(
"helper_bot.handlers.voice.voice_handler.check_user_emoji",
new_callable=AsyncMock,
return_value="😊",
):
await voice_handler.handle_emoji_message(
mock_message, mock_state, mock_settings
)
mock_message.forward.assert_awaited_once()
mock_state.set_state.assert_called_once_with(STATE_START)
mock_message.answer.assert_called_once_with(f'Твоя эмодзя - 😊', parse_mode='HTML')
mock_message.answer.assert_called_once_with(
f"Твоя эмодзя - 😊", parse_mode="HTML"
)
if __name__ == "__main__":