201 lines
7.0 KiB
Python
201 lines
7.0 KiB
Python
"""Tests for refactored private handlers"""
|
||
|
||
from unittest.mock import AsyncMock, MagicMock, Mock
|
||
|
||
import pytest
|
||
from aiogram import types
|
||
from aiogram.fsm.context import FSMContext
|
||
|
||
from helper_bot.handlers.private.constants import BUTTON_TEXTS, FSM_STATES
|
||
from helper_bot.handlers.private.private_handlers import (
|
||
PrivateHandlers, create_private_handlers)
|
||
from helper_bot.handlers.private.services import BotSettings
|
||
|
||
|
||
class TestPrivateHandlers:
|
||
"""Test class for PrivateHandlers"""
|
||
|
||
@pytest.fixture
|
||
def mock_db(self):
|
||
"""Mock database"""
|
||
db = Mock()
|
||
db.user_exists = AsyncMock(return_value=False)
|
||
db.add_user = AsyncMock()
|
||
db.update_user_date = AsyncMock()
|
||
db.update_stickers_info = AsyncMock()
|
||
db.add_post = AsyncMock()
|
||
db.add_message = AsyncMock()
|
||
db.update_helper_message = AsyncMock()
|
||
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)
|
||
# Создаем мок для from_user
|
||
from_user = Mock()
|
||
from_user.id = 12345
|
||
from_user.full_name = "Test User"
|
||
from_user.username = "testuser"
|
||
from_user.is_bot = False
|
||
from_user.language_code = "ru"
|
||
message.from_user = from_user
|
||
|
||
message.text = "test message"
|
||
|
||
# Создаем мок для chat
|
||
chat = Mock()
|
||
chat.id = 12345
|
||
message.chat = chat
|
||
|
||
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
|
||
|
||
@pytest.mark.asyncio
|
||
async 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:
|
||
mock_check_emoji = AsyncMock(return_value="😊")
|
||
m.setattr(
|
||
"helper_bot.handlers.private.private_handlers.check_user_emoji",
|
||
mock_check_emoji,
|
||
)
|
||
|
||
# Test the handler
|
||
await 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
|
||
)
|
||
|
||
@pytest.mark.asyncio
|
||
async 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!",
|
||
)
|
||
mock_keyboard = AsyncMock(return_value=Mock())
|
||
m.setattr(
|
||
"helper_bot.handlers.private.private_handlers.get_reply_keyboard",
|
||
mock_keyboard,
|
||
)
|
||
|
||
# Test the handler
|
||
await 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_user.assert_called_once()
|
||
mock_db.update_user_date.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"] == "📩Связаться с админами"
|