Files
telegram-helper-bot/tests/test_blacklist_middleware.py
2026-02-02 00:54:23 +03:00

113 lines
4.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Тесты для 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"