fix linter, fix ci, fix tests

This commit is contained in:
2026-02-02 00:46:44 +03:00
parent 68041037bd
commit d87d4e492e
93 changed files with 1042 additions and 862 deletions

View File

@@ -7,12 +7,8 @@ from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from aiogram.types import Message
from helper_bot.middlewares.metrics_middleware import (
DatabaseMetricsMiddleware,
ErrorMetricsMiddleware,
MetricsMiddleware,
)
DatabaseMetricsMiddleware, ErrorMetricsMiddleware, MetricsMiddleware)
@pytest.mark.unit
@@ -30,13 +26,17 @@ class TestMetricsMiddleware:
@pytest.fixture
def mock_handler(self):
"""Мок handler."""
async def sample_handler(event, data):
return "result"
sample_handler.__name__ = "sample_handler"
return sample_handler
@patch("helper_bot.middlewares.metrics_middleware.metrics")
async def test_handler_success_records_metrics(self, mock_metrics, middleware, mock_handler):
async def test_handler_success_records_metrics(
self, mock_metrics, middleware, mock_handler
):
"""При успешном выполнении handler вызываются record_method_duration и record_middleware."""
event = MagicMock(spec=Message)
event.message = None
@@ -64,10 +64,14 @@ class TestMetricsMiddleware:
assert call_args[2] == "success"
@patch("helper_bot.middlewares.metrics_middleware.metrics")
async def test_handler_exception_records_error_and_reraises(self, mock_metrics, middleware):
async def test_handler_exception_records_error_and_reraises(
self, mock_metrics, middleware
):
"""При исключении в handler записываются метрики ошибки и исключение пробрасывается."""
async def failing_handler(event, data):
raise ValueError("test error")
failing_handler.__name__ = "failing_handler"
event = MagicMock(spec=Message)
@@ -96,8 +100,10 @@ class TestMetricsMiddleware:
def test_get_handler_name_returns_function_name(self, middleware):
"""_get_handler_name возвращает __name__ функции."""
def named_handler():
pass
assert middleware._get_handler_name(named_handler) == "named_handler"
def test_get_handler_name_for_lambda_returns_qualname_or_unknown(self, middleware):
@@ -108,7 +114,9 @@ class TestMetricsMiddleware:
@pytest.mark.asyncio
@patch("helper_bot.middlewares.metrics_middleware.metrics")
async def test_record_comprehensive_message_metrics_photo(self, mock_metrics, middleware):
async def test_record_comprehensive_message_metrics_photo(
self, mock_metrics, middleware
):
"""_record_comprehensive_message_metrics для сообщения с фото записывает message_type photo."""
message = MagicMock()
message.photo = [MagicMock()]
@@ -126,13 +134,17 @@ class TestMetricsMiddleware:
result = await middleware._record_comprehensive_message_metrics(message)
mock_metrics.record_message.assert_called_once_with("photo", "private", "message_handler")
mock_metrics.record_message.assert_called_once_with(
"photo", "private", "message_handler"
)
assert result["message_type"] == "photo"
assert result["chat_type"] == "private"
@pytest.mark.asyncio
@patch("helper_bot.middlewares.metrics_middleware.metrics")
async def test_record_comprehensive_message_metrics_voice(self, mock_metrics, middleware):
async def test_record_comprehensive_message_metrics_voice(
self, mock_metrics, middleware
):
"""_record_comprehensive_message_metrics для voice записывает message_type voice."""
message = MagicMock()
message.photo = None
@@ -150,12 +162,16 @@ class TestMetricsMiddleware:
result = await middleware._record_comprehensive_message_metrics(message)
mock_metrics.record_message.assert_called_once_with("voice", "supergroup", "message_handler")
mock_metrics.record_message.assert_called_once_with(
"voice", "supergroup", "message_handler"
)
assert result["message_type"] == "voice"
@pytest.mark.asyncio
@patch("helper_bot.middlewares.metrics_middleware.metrics")
async def test_record_comprehensive_callback_metrics(self, mock_metrics, middleware):
async def test_record_comprehensive_callback_metrics(
self, mock_metrics, middleware
):
"""_record_comprehensive_callback_metrics записывает callback_query и возвращает данные."""
callback = MagicMock()
callback.data = "publish"
@@ -165,7 +181,9 @@ class TestMetricsMiddleware:
result = await middleware._record_comprehensive_callback_metrics(callback)
mock_metrics.record_message.assert_called_once_with("callback_query", "callback", "callback_handler")
mock_metrics.record_message.assert_called_once_with(
"callback_query", "callback", "callback_handler"
)
assert result["callback_data"] == "publish"
assert result["user_id"] == 10
@@ -178,7 +196,9 @@ class TestMetricsMiddleware:
result = await middleware._record_unknown_event_metrics(event)
mock_metrics.record_message.assert_called_once_with("unknown", "unknown", "unknown_handler")
mock_metrics.record_message.assert_called_once_with(
"unknown", "unknown", "unknown_handler"
)
assert "event_type" in result
def test_extract_command_info_slash_command_returns_mapping(self, middleware):
@@ -214,7 +234,9 @@ class TestMetricsMiddleware:
result = middleware._extract_callback_command_info_with_fallback(callback)
assert result is None
def test_extract_callback_command_info_ban_pattern_returns_callback_ban(self, middleware):
def test_extract_callback_command_info_ban_pattern_returns_callback_ban(
self, middleware
):
"""_extract_callback_command_info_with_fallback для ban_123 возвращает callback_ban."""
callback = MagicMock()
callback.data = "ban_123456"
@@ -224,7 +246,9 @@ class TestMetricsMiddleware:
assert result["command"] == "callback_ban" or "ban" in result["command"]
assert "handler_type" in result
def test_extract_callback_command_info_page_pattern_returns_callback_page(self, middleware):
def test_extract_callback_command_info_page_pattern_returns_callback_page(
self, middleware
):
"""_extract_callback_command_info_with_fallback для page_2 возвращает callback_page."""
callback = MagicMock()
callback.data = "page_2"
@@ -236,14 +260,18 @@ class TestMetricsMiddleware:
@pytest.mark.asyncio
@patch("helper_bot.middlewares.metrics_middleware.metrics")
@patch("helper_bot.utils.base_dependency_factory.get_global_instance")
async def test_update_active_users_metric_sets_metrics(self, mock_get_global, mock_metrics, middleware):
async def test_update_active_users_metric_sets_metrics(
self, mock_get_global, mock_metrics, middleware
):
"""_update_active_users_metric вызывает fetch_one и устанавливает метрики."""
mock_bdf = MagicMock()
mock_db = MagicMock()
mock_db.fetch_one = AsyncMock(side_effect=[
{"total": 100},
{"daily": 10},
])
mock_db.fetch_one = AsyncMock(
side_effect=[
{"total": 100},
{"daily": 10},
]
)
mock_bdf.get_db.return_value = mock_db
mock_get_global.return_value = mock_bdf
@@ -257,7 +285,9 @@ class TestMetricsMiddleware:
@pytest.mark.asyncio
@patch("helper_bot.middlewares.metrics_middleware.metrics")
@patch("helper_bot.utils.base_dependency_factory.get_global_instance")
async def test_update_active_users_metric_on_exception_sets_fallback(self, mock_get_global, mock_metrics, middleware):
async def test_update_active_users_metric_on_exception_sets_fallback(
self, mock_get_global, mock_metrics, middleware
):
"""_update_active_users_metric при исключении устанавливает fallback 1."""
mock_get_global.side_effect = RuntimeError("no bdf")