Merge remote-tracking branch 'origin/master' into fix-1

This commit is contained in:
2026-02-02 00:41:51 +03:00
116 changed files with 9801 additions and 6456 deletions

View File

@@ -5,6 +5,7 @@ from unittest.mock import AsyncMock, MagicMock, Mock, patch
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,
@@ -15,7 +16,7 @@ from helper_bot.handlers.private.services import BotSettings
class TestPrivateHandlers:
"""Test class for PrivateHandlers"""
@pytest.fixture
def mock_db(self):
"""Mock database"""
@@ -29,7 +30,7 @@ class TestPrivateHandlers:
db.update_helper_message = AsyncMock()
db.update_user_activity = AsyncMock()
return db
@pytest.fixture
def mock_settings(self):
"""Mock bot settings"""
@@ -41,9 +42,9 @@ class TestPrivateHandlers:
important_logs="test_important",
preview_link="test_link",
logs="test_logs_setting",
test="test_test_setting"
test="test_test_setting",
)
@pytest.fixture
def mock_message(self):
"""Mock Telegram message"""
@@ -56,7 +57,7 @@ class TestPrivateHandlers:
from_user.is_bot = False
from_user.language_code = "ru"
message.from_user = from_user
message.text = "test message"
message.message_id = 1
@@ -71,7 +72,7 @@ class TestPrivateHandlers:
message.answer = AsyncMock()
message.answer_sticker = AsyncMock()
return message
@pytest.fixture
def mock_state(self):
"""Mock FSM state"""
@@ -79,14 +80,14 @@ class TestPrivateHandlers:
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)
@@ -96,25 +97,32 @@ class TestPrivateHandlers:
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):
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)
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)
mock_message.forward.assert_called_once_with(
chat_id=mock_settings.group_for_logs
)
@pytest.mark.asyncio
async def test_handle_emoji_message_no_emoji(self, mock_db, mock_settings, mock_message, mock_state):
@@ -126,24 +134,39 @@ class TestPrivateHandlers:
mock_state.set_state.assert_called_once_with(FSM_STATES["START"])
mock_message.answer.assert_not_called()
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):
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!")
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)
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()
@@ -241,7 +264,7 @@ class TestPrivateHandlers:
class TestBotSettings:
"""Test class for BotSettings dataclass"""
def test_bot_settings_creation(self):
"""Test creating BotSettings instance"""
settings = BotSettings(
@@ -252,9 +275,9 @@ class TestBotSettings:
important_logs="important",
preview_link="link",
logs="logs_setting",
test="test_setting"
test="test_setting",
)
assert settings.group_for_posts == "posts"
assert settings.group_for_message == "message"
assert settings.main_public == "public"
@@ -267,14 +290,14 @@ class TestBotSettings:
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"] == "📢Предложить свой пост"