"""Unit tests for the top markets logic layer.""" from unittest.mock import patch import pytest from sound_recordings.logic import top_markets @pytest.fixture def mock_get_top_markets_model_payload(): """Mock payload for top markets model.""" return [ { "country_code": "UA", "streams_7_days": 42, "orchard_region_name": "Kyiv", "growth_percentage": 0.333, }, { "country_code": "US", "streams_7_days": 37, "orchard_region_name": "NYC", "growth_percentage": 0.42, }, ] @pytest.fixture def expected_payload(): """Return expected payload from logic.""" return { "isrc": "TEST", "items": [ { "country_code": "UA", "streams": 42, "region": "Kyiv", "growth_percentage": 0.333, }, { "country_code": "US", "streams": 37, "region": "NYC", "growth_percentage": 0.42, }, ], "sources": [{"id": 286, "name": "Spotify"}], } @pytest.fixture def mock_add_outage_error_to_stores(): """Mock add_outage_error_to_stores.""" with patch( "sound_recordings.logic.top_markets.add_outage_error_to_stores" ) as add_outage_error_to_stores: add_outage_error_to_stores.return_value = [{"id": 286, "name": "Spotify"}] yield add_outage_error_to_stores @pytest.fixture def mock_get_top_markets_success(mock_get_top_markets_model_payload): """Mock successful get_top_markets model response.""" with patch( "sound_recordings.models.top_markets.get_top_markets" ) as get_top_markets: get_top_markets.return_value = mock_get_top_markets_model_payload yield get_top_markets @pytest.fixture def mock_get_top_markets_failure(): """Mock failure top_markets model response.""" with patch( "sound_recordings.models.top_markets.get_top_markets" ) as get_top_markets: get_top_markets.return_value = [] yield get_top_markets @pytest.fixture def get_top_markets_response( mock_add_outage_error_to_stores, mock_permissions_for_label, request_context_for_label, ): """Return response from get_top_markets.""" return top_markets.get_top_markets( request_context_for_label, "TEST", ["theorchard"], [1, 286] ) @pytest.fixture def get_top_markets_with_countries_response( mock_add_outage_error_to_stores, mock_permissions_for_label, request_context_for_label, ): """Return response from get_top_markets.""" return top_markets.get_top_markets( request_context_for_label, "TEST", ["theorchard"], [1, 286], ["US", "GB"] ) def test_get_top_markets_model_called( mock_get_top_markets_success, get_top_markets_response, mock_add_outage_error_to_stores, mock_permissions_for_label, permissions_for_label, ): """Test model layer called from logic.""" mock_get_top_markets_success.assert_called_once_with( permissions_for_label, "TEST", ["theorchard"], [1, 286], [] ) def test_get_top_markets_model_called_with_countries( mock_get_top_markets_success, get_top_markets_with_countries_response, mock_add_outage_error_to_stores, mock_permissions_for_label, permissions_for_label, ): """Test model layer called from logic.""" mock_get_top_markets_success.assert_called_once_with( permissions_for_label, "TEST", ["theorchard"], [1, 286], ["US", "GB"] ) def test_get_top_markets_success( mock_get_top_markets_success, expected_payload, get_top_markets_response, mock_add_outage_error_to_stores, ): """Test successful response.""" assert get_top_markets_response.status == 200 assert get_top_markets_response.message == expected_payload def test_get_top_markets_failure( mock_get_top_markets_failure, get_top_markets_response, mock_add_outage_error_to_stores, expected_payload, ): """Test get_top_markets when model fails.""" assert get_top_markets_response.status == 200 expected_payload["items"] = [] assert get_top_markets_response.message == expected_payload