feat: улучшено логирование и обработка скорингов в PostService и RagApiClient - Добавлены отладочные сообщения для передачи скорингов в функции обработки постов. - Обновлено логирование успешного получения скорингов из RAG API с дополнительной информацией. - Оптимизирована обработка скорингов в функции get_text_message для улучшения отладки. - Обновлены тесты для проверки новых функциональных возможностей и обработки ошибок.
112 lines
4.2 KiB
Python
112 lines
4.2 KiB
Python
"""
|
||
Тесты для helper_bot.middlewares.blacklist_middleware.
|
||
"""
|
||
|
||
from unittest.mock import AsyncMock, MagicMock, patch
|
||
|
||
import pytest
|
||
from aiogram.types import CallbackQuery, Message
|
||
|
||
from helper_bot.middlewares.blacklist_middleware import BlacklistMiddleware
|
||
|
||
|
||
@pytest.mark.unit
|
||
@pytest.mark.asyncio
|
||
class TestBlacklistMiddleware:
|
||
"""Тесты для BlacklistMiddleware."""
|
||
|
||
@pytest.fixture
|
||
def middleware(self):
|
||
"""Экземпляр middleware."""
|
||
return BlacklistMiddleware()
|
||
|
||
@pytest.fixture
|
||
def mock_handler(self):
|
||
"""Мок handler."""
|
||
return AsyncMock(return_value="handler_ok")
|
||
|
||
@patch("helper_bot.middlewares.blacklist_middleware.BotDB", new_callable=MagicMock)
|
||
async def test_user_not_in_blacklist_calls_handler(
|
||
self, mock_bot_db, middleware, mock_handler
|
||
):
|
||
"""Пользователь не в блэклисте — handler вызывается."""
|
||
mock_bot_db.check_user_in_blacklist = AsyncMock(return_value=False)
|
||
|
||
event = MagicMock(spec=Message)
|
||
event.from_user = MagicMock()
|
||
event.from_user.id = 123
|
||
event.from_user.username = "user1"
|
||
data = {}
|
||
|
||
result = await middleware(mock_handler, event, data)
|
||
|
||
mock_bot_db.check_user_in_blacklist.assert_called_once_with(123)
|
||
mock_handler.assert_called_once_with(event, data)
|
||
assert result == "handler_ok"
|
||
|
||
@patch("helper_bot.middlewares.blacklist_middleware.BotDB", new_callable=MagicMock)
|
||
async def test_user_in_blacklist_message_sends_answer_and_returns_false(
|
||
self, mock_bot_db, middleware, mock_handler
|
||
):
|
||
"""Пользователь в блэклисте (Message) — отправляется ответ, handler не вызывается."""
|
||
mock_bot_db.check_user_in_blacklist = AsyncMock(return_value=True)
|
||
mock_bot_db.get_blacklist_users_by_id = AsyncMock(
|
||
return_value=(123, "Спам", 1735689600) # user_id, reason, date_unban_ts
|
||
)
|
||
|
||
event = MagicMock(spec=Message)
|
||
event.from_user = MagicMock()
|
||
event.from_user.id = 123
|
||
event.from_user.username = "banned"
|
||
event.answer = AsyncMock()
|
||
data = {}
|
||
|
||
result = await middleware(mock_handler, event, data)
|
||
|
||
mock_handler.assert_not_called()
|
||
event.answer.assert_called_once()
|
||
call_text = event.answer.call_args[0][0]
|
||
assert "Ты заблокирован" in call_text
|
||
assert "Спам" in call_text
|
||
assert result is False
|
||
|
||
@patch("helper_bot.middlewares.blacklist_middleware.BotDB", new_callable=MagicMock)
|
||
async def test_user_in_blacklist_callback_sends_alert(
|
||
self, mock_bot_db, middleware, mock_handler
|
||
):
|
||
"""Пользователь в блэклисте (CallbackQuery) — answer с show_alert=True."""
|
||
mock_bot_db.check_user_in_blacklist = AsyncMock(return_value=True)
|
||
mock_bot_db.get_blacklist_users_by_id = AsyncMock(
|
||
return_value=(456, "Нарушение", None)
|
||
)
|
||
|
||
event = MagicMock(spec=CallbackQuery)
|
||
event.from_user = MagicMock()
|
||
event.from_user.id = 456
|
||
event.from_user.username = "banned_cb"
|
||
event.answer = AsyncMock()
|
||
data = {}
|
||
|
||
result = await middleware(mock_handler, event, data)
|
||
|
||
mock_handler.assert_not_called()
|
||
event.answer.assert_called_once()
|
||
call_args = event.answer.call_args
|
||
assert call_args[0][0].startswith("<b>Ты заблокирован")
|
||
assert call_args[1].get("show_alert") is True
|
||
assert result is False
|
||
|
||
@patch("helper_bot.middlewares.blacklist_middleware.BotDB", new_callable=MagicMock)
|
||
async def test_event_without_user_passes_through(
|
||
self, mock_bot_db, middleware, mock_handler
|
||
):
|
||
"""Событие без user — handler вызывается (user = None)."""
|
||
event = MagicMock()
|
||
# Объект без from_user или from_user = None — в коде user = event.from_user
|
||
event.from_user = None
|
||
data = {}
|
||
|
||
result = await middleware(mock_handler, event, data)
|
||
|
||
mock_handler.assert_called_once_with(event, data)
|
||
assert result == "handler_ok" |