Переписал почти все тесты

feat: улучшено логирование и обработка скорингов в PostService и RagApiClient

- Добавлены отладочные сообщения для передачи скорингов в функции обработки постов.
- Обновлено логирование успешного получения скорингов из RAG API с дополнительной информацией.
- Оптимизирована обработка скорингов в функции get_text_message для улучшения отладки.
- Обновлены тесты для проверки новых функциональных возможностей и обработки ошибок.
This commit is contained in:
2026-01-30 00:55:47 +03:00
parent e87f4af82f
commit a5faa4bdc6
27 changed files with 4320 additions and 8 deletions

View File

@@ -238,6 +238,91 @@ class TestVoiceBotService:
assert hasattr(voice_service, 'get_remaining_audio_count')
assert hasattr(voice_service, 'send_welcome_messages')
@pytest.mark.asyncio
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:
mock_rglob.side_effect = OSError("Permission denied")
sticker = await voice_service.get_welcome_sticker()
assert sticker is None
@pytest.mark.asyncio
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:
await voice_service.get_welcome_sticker()
mock_send_logs.assert_awaited_once()
@pytest.mark.asyncio
async def test_get_random_audio_exception_raises(self, voice_service, mock_bot_db):
"""get_random_audio при исключении выбрасывает AudioProcessingError."""
mock_bot_db.check_listen_audio = AsyncMock(side_effect=Exception("DB error"))
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):
"""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):
"""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"))
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):
"""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):
"""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="Не удалось отправить приветственные сообщения"):
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:
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):
"""_send_error_to_logs при ошибке отправки логирует и не падает."""
voice_service.settings = {
'Settings': {},
'Telegram': {'important_logs': '-123'},
}
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()
if __name__ == '__main__':
pytest.main([__file__])