131 lines
4.5 KiB
Python
131 lines
4.5 KiB
Python
"""
|
||
Тесты для helper_bot.middlewares.album_middleware.
|
||
"""
|
||
|
||
import asyncio
|
||
from unittest.mock import AsyncMock, MagicMock, patch
|
||
|
||
import pytest
|
||
from helper_bot.middlewares.album_middleware import (AlbumGetter,
|
||
AlbumMiddleware)
|
||
|
||
|
||
@pytest.mark.unit
|
||
@pytest.mark.asyncio
|
||
class TestAlbumGetter:
|
||
"""Тесты для AlbumGetter."""
|
||
|
||
async def test_get_album_returns_collected_album_after_event_set(self):
|
||
"""get_album возвращает собранную медиагруппу после set()."""
|
||
album_data = {"group_1": {"collected_album": [MagicMock(), MagicMock()]}}
|
||
event = asyncio.Event()
|
||
event.set()
|
||
getter = AlbumGetter(album_data, "group_1", event)
|
||
|
||
result = await getter.get_album(timeout=1.0)
|
||
|
||
assert result is not None
|
||
assert len(result) == 2
|
||
|
||
async def test_get_album_returns_none_on_timeout(self):
|
||
"""get_album возвращает None при таймауте."""
|
||
album_data = {}
|
||
event = asyncio.Event()
|
||
getter = AlbumGetter(album_data, "group_1", event)
|
||
|
||
result = await getter.get_album(timeout=0.01)
|
||
|
||
assert result is None
|
||
|
||
async def test_get_album_returns_none_if_media_group_id_removed(self):
|
||
"""get_album возвращает None если media_group_id уже удалён из album_data."""
|
||
album_data = {}
|
||
event = asyncio.Event()
|
||
event.set()
|
||
getter = AlbumGetter(album_data, "missing_group", event)
|
||
|
||
result = await getter.get_album(timeout=0.1)
|
||
|
||
assert result is None
|
||
|
||
|
||
@pytest.mark.unit
|
||
@pytest.mark.asyncio
|
||
class TestAlbumMiddleware:
|
||
"""Тесты для AlbumMiddleware."""
|
||
|
||
@pytest.fixture
|
||
def middleware(self):
|
||
"""Middleware с короткой latency для тестов."""
|
||
return AlbumMiddleware(latency=0.05)
|
||
|
||
@pytest.fixture
|
||
def mock_handler(self):
|
||
"""Мок handler."""
|
||
return AsyncMock(return_value="ok")
|
||
|
||
async def test_no_media_group_id_calls_handler_immediately(
|
||
self, middleware, mock_handler
|
||
):
|
||
"""Сообщение без media_group_id передаётся в handler сразу."""
|
||
event = MagicMock()
|
||
event.media_group_id = None
|
||
event.message_id = 1
|
||
data = {}
|
||
|
||
result = await middleware(mock_handler, event, data)
|
||
|
||
mock_handler.assert_called_once_with(event, data)
|
||
assert result == "ok"
|
||
assert "album_getter" not in data
|
||
|
||
async def test_first_media_group_message_creates_album_getter_and_calls_handler(
|
||
self, middleware, mock_handler
|
||
):
|
||
"""Первое сообщение медиагруппы: создаётся album_getter, handler вызывается."""
|
||
event = MagicMock()
|
||
event.media_group_id = "group_123"
|
||
event.message_id = 10
|
||
data = {}
|
||
|
||
result = await middleware(mock_handler, event, data)
|
||
|
||
mock_handler.assert_called_once_with(event, data)
|
||
assert "album_getter" in data
|
||
assert isinstance(data["album_getter"], AlbumGetter)
|
||
assert data["album_getter"].media_group_id == "group_123"
|
||
assert result == "ok"
|
||
|
||
async def test_second_media_group_message_does_not_call_handler(
|
||
self, middleware, mock_handler
|
||
):
|
||
"""Второе сообщение той же медиагруппы: handler не вызывается."""
|
||
event1 = MagicMock()
|
||
event1.media_group_id = "group_456"
|
||
event1.message_id = 1
|
||
data1 = {}
|
||
await middleware(mock_handler, event1, data1)
|
||
|
||
event2 = MagicMock()
|
||
event2.media_group_id = "group_456"
|
||
event2.message_id = 2
|
||
data2 = {}
|
||
|
||
result = await middleware(mock_handler, event2, data2)
|
||
|
||
assert mock_handler.call_count == 1
|
||
assert result is None
|
||
|
||
def test_collect_album_messages_returns_count(self, middleware):
|
||
"""collect_album_messages возвращает количество сообщений в группе."""
|
||
event = MagicMock()
|
||
event.media_group_id = "g1"
|
||
assert middleware.collect_album_messages(event) == 1
|
||
assert middleware.collect_album_messages(event) == 2
|
||
|
||
def test_collect_album_messages_no_media_group_returns_zero(self, middleware):
|
||
"""Без media_group_id возвращается 0."""
|
||
event = MagicMock()
|
||
event.media_group_id = None
|
||
assert middleware.collect_album_messages(event) == 0
|