"""Tests for refactored private handlers""" import pytest from unittest.mock import Mock, AsyncMock, MagicMock from aiogram import types from aiogram.fsm.context import FSMContext from helper_bot.handlers.private.private_handlers import ( create_private_handlers, PrivateHandlers ) from helper_bot.handlers.private.services import BotSettings from helper_bot.handlers.private.constants import FSM_STATES, BUTTON_TEXTS class TestPrivateHandlers: """Test class for PrivateHandlers""" @pytest.fixture def mock_db(self): """Mock database""" db = Mock() db.user_exists.return_value = False db.add_new_user_in_db = Mock() db.update_date_for_user = Mock() db.update_info_about_stickers = Mock() db.add_post_in_db = Mock() db.add_new_message_in_db = Mock() db.update_helper_message_in_db = Mock() return db @pytest.fixture def mock_settings(self): """Mock bot settings""" return BotSettings( group_for_posts="test_posts", group_for_message="test_message", main_public="test_public", group_for_logs="test_logs", important_logs="test_important", preview_link="test_link", logs="test_logs_setting", test="test_test_setting" ) @pytest.fixture def mock_message(self): """Mock Telegram message""" message = Mock(spec=types.Message) message.from_user.id = 12345 message.from_user.full_name = "Test User" message.from_user.username = "testuser" message.from_user.is_bot = False message.from_user.language_code = "ru" message.text = "test message" message.chat.id = 12345 message.bot = Mock() message.bot.send_message = AsyncMock() message.forward = AsyncMock() message.answer = AsyncMock() message.answer_sticker = AsyncMock() return message @pytest.fixture def mock_state(self): """Mock FSM state""" state = Mock(spec=FSMContext) state.set_state = AsyncMock() state.get_state = AsyncMock(return_value=FSM_STATES["START"]) return state def test_create_private_handlers(self, mock_db, mock_settings): """Test creating private handlers instance""" handlers = create_private_handlers(mock_db, mock_settings) assert isinstance(handlers, PrivateHandlers) assert handlers.db == mock_db assert handlers.settings == mock_settings def test_private_handlers_initialization(self, mock_db, mock_settings): """Test PrivateHandlers initialization""" handlers = PrivateHandlers(mock_db, mock_settings) assert handlers.db == mock_db assert handlers.settings == mock_settings assert handlers.user_service is not None assert handlers.post_service is not None assert handlers.sticker_service is not None assert handlers.router is not None def test_handle_emoji_message(self, mock_db, mock_settings, mock_message, mock_state): """Test emoji message handler""" handlers = create_private_handlers(mock_db, mock_settings) # Mock the check_user_emoji function with pytest.MonkeyPatch().context() as m: m.setattr('helper_bot.handlers.private.private_handlers.check_user_emoji', lambda x: "😊") # Test the handler handlers.handle_emoji_message(mock_message, mock_state) # Verify state was set mock_state.set_state.assert_called_once_with(FSM_STATES["START"]) # Verify message was logged mock_message.forward.assert_called_once_with(chat_id=mock_settings.group_for_logs) def test_handle_start_message(self, mock_db, mock_settings, mock_message, mock_state): """Test start message handler""" handlers = create_private_handlers(mock_db, mock_settings) # Mock the get_first_name and messages functions with pytest.MonkeyPatch().context() as m: m.setattr('helper_bot.handlers.private.private_handlers.get_first_name', lambda x: "Test") m.setattr('helper_bot.handlers.private.private_handlers.messages.get_message', lambda x, y: "Hello Test!") m.setattr('helper_bot.handlers.private.private_handlers.get_reply_keyboard', lambda x, y: Mock()) # Test the handler handlers.handle_start_message(mock_message, mock_state) # Verify state was set mock_state.set_state.assert_called_once_with(FSM_STATES["START"]) # Verify user was ensured to exist mock_db.add_new_user_in_db.assert_called_once() mock_db.update_date_for_user.assert_called_once() class TestBotSettings: """Test class for BotSettings dataclass""" def test_bot_settings_creation(self): """Test creating BotSettings instance""" settings = BotSettings( group_for_posts="posts", group_for_message="message", main_public="public", group_for_logs="logs", important_logs="important", preview_link="link", logs="logs_setting", test="test_setting" ) assert settings.group_for_posts == "posts" assert settings.group_for_message == "message" assert settings.main_public == "public" assert settings.group_for_logs == "logs" assert settings.important_logs == "important" assert settings.preview_link == "link" assert settings.logs == "logs_setting" assert settings.test == "test_setting" class TestConstants: """Test class for constants""" def test_fsm_states(self): """Test FSM states constants""" assert FSM_STATES["START"] == "START" assert FSM_STATES["SUGGEST"] == "SUGGEST" assert FSM_STATES["PRE_CHAT"] == "PRE_CHAT" assert FSM_STATES["CHAT"] == "CHAT" def test_button_texts(self): """Test button text constants""" assert BUTTON_TEXTS["SUGGEST_POST"] == "📢Предложить свой пост" assert BUTTON_TEXTS["SAY_GOODBYE"] == "👋🏼Сказать пока!" assert BUTTON_TEXTS["LEAVE_CHAT"] == "Выйти из чата" assert BUTTON_TEXTS["RETURN_TO_BOT"] == "Вернуться в бота" assert BUTTON_TEXTS["WANT_STICKERS"] == "🤪Хочу стикеры" assert BUTTON_TEXTS["CONNECT_ADMIN"] == "📩Связаться с админами"