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 pathlib import Path
from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from helper_bot.handlers.voice.exceptions import AudioProcessingError, VoiceMessageError
from helper_bot.handlers.voice.exceptions import (AudioProcessingError,
VoiceMessageError)
from helper_bot.handlers.voice.services import VoiceBotService
@@ -275,9 +275,11 @@ class TestVoiceBotService:
assert hasattr(voice_service, "send_welcome_messages")
@pytest.mark.asyncio
async def test_get_welcome_sticker_exception_returns_none(self, voice_service, mock_settings):
async def test_get_welcome_sticker_exception_returns_none(
self, voice_service, mock_settings
):
"""get_welcome_sticker при исключении возвращает None."""
with patch('pathlib.Path.rglob') as mock_rglob:
with patch("pathlib.Path.rglob") as mock_rglob:
mock_rglob.side_effect = OSError("Permission denied")
sticker = await voice_service.get_welcome_sticker()
@@ -285,11 +287,15 @@ class TestVoiceBotService:
assert sticker is None
@pytest.mark.asyncio
async def test_get_welcome_sticker_exception_sends_to_logs_when_enabled(self, voice_service, mock_settings):
async def test_get_welcome_sticker_exception_sends_to_logs_when_enabled(
self, voice_service, mock_settings
):
"""get_welcome_sticker при исключении и logs=True отправляет ошибку в логи."""
voice_service.settings = {'Settings': {'logs': True}, 'Telegram': {}}
with patch('pathlib.Path.rglob', side_effect=OSError("err")):
with patch.object(voice_service, '_send_error_to_logs', new_callable=AsyncMock) as mock_send_logs:
voice_service.settings = {"Settings": {"logs": True}, "Telegram": {}}
with patch("pathlib.Path.rglob", side_effect=OSError("err")):
with patch.object(
voice_service, "_send_error_to_logs", new_callable=AsyncMock
) as mock_send_logs:
await voice_service.get_welcome_sticker()
mock_send_logs.assert_awaited_once()
@@ -298,63 +304,90 @@ class TestVoiceBotService:
"""get_random_audio при исключении выбрасывает AudioProcessingError."""
mock_bot_db.check_listen_audio = AsyncMock(side_effect=Exception("DB error"))
with pytest.raises(AudioProcessingError, match="Не удалось получить случайное аудио"):
with pytest.raises(
AudioProcessingError, match="Не удалось получить случайное аудио"
):
await voice_service.get_random_audio(123)
@pytest.mark.asyncio
async def test_mark_audio_as_listened_exception_raises(self, voice_service, mock_bot_db):
async def test_mark_audio_as_listened_exception_raises(
self, voice_service, mock_bot_db
):
"""mark_audio_as_listened при исключении выбрасывает DatabaseError."""
from helper_bot.handlers.voice.exceptions import DatabaseError
mock_bot_db.mark_listened_audio = AsyncMock(side_effect=Exception("DB error"))
with pytest.raises(DatabaseError, match="Не удалось пометить аудио"):
await voice_service.mark_audio_as_listened("file", 123)
@pytest.mark.asyncio
async def test_clear_user_listenings_exception_raises(self, voice_service, mock_bot_db):
async def test_clear_user_listenings_exception_raises(
self, voice_service, mock_bot_db
):
"""clear_user_listenings при исключении выбрасывает DatabaseError."""
from helper_bot.handlers.voice.exceptions import DatabaseError
mock_bot_db.delete_listen_count_for_user = AsyncMock(side_effect=Exception("DB error"))
mock_bot_db.delete_listen_count_for_user = AsyncMock(
side_effect=Exception("DB error")
)
with pytest.raises(DatabaseError, match="Не удалось очистить прослушивания"):
await voice_service.clear_user_listenings(123)
@pytest.mark.asyncio
async def test_get_remaining_audio_count_exception_raises(self, voice_service, mock_bot_db):
async def test_get_remaining_audio_count_exception_raises(
self, voice_service, mock_bot_db
):
"""get_remaining_audio_count при исключении выбрасывает DatabaseError."""
from helper_bot.handlers.voice.exceptions import DatabaseError
mock_bot_db.check_listen_audio = AsyncMock(side_effect=Exception("DB error"))
with pytest.raises(DatabaseError, match="Не удалось получить количество аудио"):
await voice_service.get_remaining_audio_count(123)
@pytest.mark.asyncio
async def test_send_welcome_messages_exception_raises(self, voice_service, mock_bot_db, mock_settings):
async def test_send_welcome_messages_exception_raises(
self, voice_service, mock_bot_db, mock_settings
):
"""send_welcome_messages при исключении выбрасывает VoiceMessageError."""
mock_message = Mock()
mock_message.answer = AsyncMock(side_effect=Exception("Network error"))
mock_message.answer_sticker = AsyncMock()
with patch.object(voice_service, 'get_welcome_sticker', new_callable=AsyncMock, return_value=None):
with patch.object(voice_service, '_get_main_keyboard', return_value=Mock()):
with pytest.raises(VoiceMessageError, match="Не удалось отправить приветственные сообщения"):
with patch.object(
voice_service,
"get_welcome_sticker",
new_callable=AsyncMock,
return_value=None,
):
with patch.object(voice_service, "_get_main_keyboard", return_value=Mock()):
with pytest.raises(
VoiceMessageError,
match="Не удалось отправить приветственные сообщения",
):
await voice_service.send_welcome_messages(mock_message, "😊")
def test_get_main_keyboard_returns_keyboard(self, voice_service):
"""_get_main_keyboard возвращает клавиатуру."""
with patch('helper_bot.keyboards.keyboards.get_main_keyboard') as mock_kb:
with patch("helper_bot.keyboards.keyboards.get_main_keyboard") as mock_kb:
mock_kb.return_value = Mock()
result = voice_service._get_main_keyboard()
mock_kb.assert_called_once()
assert result is not None
@pytest.mark.asyncio
async def test_send_error_to_logs_handles_exception(self, voice_service, mock_settings):
async def test_send_error_to_logs_handles_exception(
self, voice_service, mock_settings
):
"""_send_error_to_logs при ошибке отправки логирует и не падает."""
voice_service.settings = {
'Settings': {},
'Telegram': {'important_logs': '-123'},
"Settings": {},
"Telegram": {"important_logs": "-123"},
}
with patch('helper_bot.utils.helper_func.send_voice_message', new_callable=AsyncMock) as mock_send:
with patch(
"helper_bot.utils.helper_func.send_voice_message", new_callable=AsyncMock
) as mock_send:
mock_send.side_effect = Exception("Send failed")
await voice_service._send_error_to_logs("Test error")
mock_send.assert_awaited_once()