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

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

@@ -0,0 +1,101 @@
"""
Тесты для helper_bot.middlewares.rate_limit_middleware.
"""
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from aiogram.types import CallbackQuery, Message, Update
from helper_bot.middlewares.rate_limit_middleware import RateLimitMiddleware
@pytest.mark.unit
@pytest.mark.asyncio
class TestRateLimitMiddleware:
"""Тесты для RateLimitMiddleware."""
@pytest.fixture
def middleware(self):
"""Экземпляр middleware."""
return RateLimitMiddleware()
@pytest.fixture
def mock_handler(self):
"""Мок handler."""
return AsyncMock(return_value="handler_result")
async def test_event_with_message_calls_rate_limiter(self, middleware, mock_handler):
"""При событии с message вызывается rate_limiter.send_with_rate_limit."""
event = MagicMock(spec=Message)
event.message = None
event.chat = MagicMock()
event.chat.id = 12345
data = {}
with patch.object(
middleware.rate_limiter,
"send_with_rate_limit",
new_callable=AsyncMock,
return_value="rate_limited_result",
) as mock_send:
result = await middleware(mock_handler, event, data)
mock_send.assert_called_once()
call_args = mock_send.call_args
assert call_args[0][1] == 12345 # chat_id
# Вызываем переданный rate_limited_handler
await call_args[0][0]()
mock_handler.assert_called_once_with(event, data)
assert result == "rate_limited_result"
async def test_update_with_message_calls_rate_limiter(self, middleware, mock_handler):
"""При Update с message извлекается chat_id и вызывается rate_limiter."""
message = MagicMock(spec=Message)
message.chat = MagicMock()
message.chat.id = 99999
event = MagicMock(spec=Update)
event.message = message
data = {}
with patch.object(
middleware.rate_limiter,
"send_with_rate_limit",
new_callable=AsyncMock,
return_value="ok",
) as mock_send:
await middleware(mock_handler, event, data)
mock_send.assert_called_once()
assert mock_send.call_args[0][1] == 99999
async def test_event_without_message_calls_handler_directly(self, middleware, mock_handler):
"""При событии без message (например CallbackQuery) handler вызывается напрямую."""
event = MagicMock(spec=CallbackQuery)
event.message = None
data = {}
result = await middleware(mock_handler, event, data)
mock_handler.assert_called_once_with(event, data)
assert result == "handler_result"
async def test_exception_from_handler_propagates(self, middleware, mock_handler):
"""Исключение из handler пробрасывается через rate_limiter."""
event = MagicMock(spec=Message)
event.chat = MagicMock()
event.chat.id = 1
data = {}
mock_handler.side_effect = ValueError("test error")
with patch.object(
middleware.rate_limiter,
"send_with_rate_limit",
new_callable=AsyncMock,
) as mock_send:
async def call_passed_handler(inner_handler, chat_id):
return await inner_handler()
mock_send.side_effect = call_passed_handler
with pytest.raises(ValueError, match="test error"):
await middleware(mock_handler, event, data)