fix linter, fix ci, fix tests
This commit is contained in:
@@ -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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user