""" Тесты для 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("Ты заблокирован") 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"