"""Feed status unit tests.""" import pytest from marshmallow import ValidationError from src.errors.feed_status import LoadFeedStatusError from src.logic.feed_status import get_feed_statuses from src.models.feed_status import Feed, FeedStatus, StoreInfo from tests.unit import data def test_get_feed_statuses_success(mocker): """Test success scenarios for get_feed_statuses.""" mock_raw_data = { 'analyticFeedStatuses': { 'feedStatus': [ { 'feed': {'id': 286, 'name': 'Spotify', 'store': {'storeId': 286, 'storeName': 'Spotify'}}, 'storeHighWaterMark': f'{data.DATE_STR}T00:00:00.000Z', 'updateStatus': 'UPDATED', }, { 'feed': {'id': 1, 'name': 'Apple Music', 'store': {'storeId': 1, 'storeName': 'Apple Music'}}, 'storeHighWaterMark': f'{data.DATE_STR_2}T00:00:00.000Z', 'updateStatus': 'WAITING_FOR_UPDATES', }, ] } } expected_result = [ FeedStatus( feed=Feed(id=286, name='Spotify', store=StoreInfo(store_id=286, store_name='Spotify')), store_high_water_mark=data.DATE_OBJ, update_status='UPDATED', ), FeedStatus( feed=Feed(id=1, name='Apple Music', store=StoreInfo(store_id=1, store_name='Apple Music')), store_high_water_mark=data.DATE_OBJ_2, update_status='WAITING_FOR_UPDATES', ), ] mocker.patch('src.logic.feed_status.execute_query', return_value=mock_raw_data) result = get_feed_statuses() assert result == expected_result @pytest.mark.parametrize( 'mock_config, expected_cause', [ pytest.param( # Simulate the GQL query itself failing {'side_effect': Exception('Network error connecting to API')}, Exception, id='execute_query_raises_exception', ), pytest.param( # Simulate malformed data that fails Marshmallow validation {'return_value': {'analyticFeedStatuses': {'feedStatus': [{'feed': {'id': 1}}]}}}, ValidationError, id='schema_validation_error', ), ], ) def test_get_feed_statuses_failure(mock_config, expected_cause, mocker): """Test failure scenarios for get_feed_statuses.""" mocker.patch('src.logic.feed_status.execute_query', **mock_config) with pytest.raises(LoadFeedStatusError) as excinfo: get_feed_statuses() assert isinstance(excinfo.value.__cause__, expected_cause)