""" Тесты для 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