"""Unit tests for placements logic layer.""" import datetime from unittest.mock import patch import pytest from sound_recordings.api import app from sound_recordings.constants.owner_category import CURATED, EDITORIAL from sound_recordings.constants.placements import DEFAULT_MIN_FOLLOWERS from sound_recordings.logic import placements, store_outages from sound_recordings.models import placements_metadata from sound_recordings.schemas.placement import PlacementSchema, RecentPlacementsSchema from sound_recordings.schemas.placements import PlacementsSchema isrc = "DED831000251" playlist_id = ("pl.a7be635ddafd48c49f6c5656d826285f",) store_ids = [1, 286] owner_categories = [CURATED, EDITORIAL] @pytest.fixture def placements_metadata_items(): """Fixture returning placements metadata.""" return { "total_count": 1, "items": [ { "playlist_id": "pl.a7be635ddafd48c49f6c5656d826285f", "store_id": 1, "playlist_name": "British Folk Essentials", "playlist_uri": "https://itunes.apple.com/sa/playlist/pl.a7be635ddafd48c49f6c5656d826285f", # noqa "storefront": "SA", "added": datetime.date(2016, 6, 1), "artwork_url": "https://is5-ssl.mzstatic.com/image/thumb/Features118/v4/3f/d9/1f/3fd91f00-c6e5-a01a-da41-1a07944df36f/source/{w}x{h}cc.jpeg", # noqa "country": "SA", "followers": 18, "track_count": 61, "position": 21, "previous_position": 18, "total_streams": 3001, } ], } @pytest.fixture def recent_placements_metadata_items(): """Fixture returning placements metadata.""" return { "items": [ { "playlist_id": "pl.a7be635ddafd48c49f6c5656d826285f", "store_id": 1, "playlist_name": "British Folk Essentials", "playlist_uri": "https://itunes.apple.com/sa/playlist/pl.a7be635ddafd48c49f6c5656d826285f", # noqa "storefront": "SA", "added": datetime.date(2016, 6, 1), "artwork_url": "https://is5-ssl.mzstatic.com/image/thumb/Features118/v4/3f/d9/1f/3fd91f00-c6e5-a01a-da41-1a07944df36f/source/{w}x{h}cc.jpeg", # noqa "country": "SA", "followers": 18, "track_count": 61, "position": 21, "previous_position": 18, "total_streams": 3001, } ], } @pytest.fixture def placement(): """Fixture returning placements metadata.""" return { "playlist_id": "pl.a7be635ddafd48c49f6c5656d826285f", "store_id": 1, "playlist_name": "British Folk Essentials", "playlist_uri": "https://itunes.apple.com/sa/playlist/pl.a7be635ddafd48c49f6c5656d826285f", # noqa "storefront": "SA", "added": datetime.date(2016, 6, 1), "artwork_url": "https://is5-ssl.mzstatic.com/image/thumb/Features118/v4/3f/d9/1f/3fd91f00-c6e5-a01a-da41-1a07944df36f/source/{w}x{h}cc.jpeg", # noqa "country": "SA", "followers": 18, "track_count": 61, "position": 21, "previous_position": 18, "total_streams": 3001, } @pytest.fixture def storefronts_property(): """Fixture returning storefronts metadata.""" return { "storefronts": [ { "added": datetime.date(2016, 6, 1), "country": "US", "postion": 35, "previous_position": 29, "storefront": "US", "total_streams": 1253, "track_count": 50, "playlist_uri": "https://itunes.apple.com/us/playlist/pl.6f", } ] } @pytest.fixture def mock_get_placements_metadata(placements_metadata_items): """Mock get_placements_metadata.""" with patch( "sound_recordings.models." "placements_metadata.get_placements_metadata" ) as get_placements_metadata: get_placements_metadata.return_value = placements_metadata_items yield get_placements_metadata @pytest.fixture def mock_get_placement(placement): """Mock get_placements_metadata.""" with patch( "sound_recordings.models.placements_metadata.get_placement" ) as get_placement: get_placement.return_value = placement yield get_placement @pytest.fixture def mock_get_recent_placements_metadata( recent_placements_metadata_items, storefronts_property ): """Mock get_recent_placements_metadata.""" with patch( "sound_recordings.models.placements_metadata." "get_recent_placements_metadata" ) as get_recent_placements_metadata: recent_placements_metadata_items = recent_placements_metadata_items["items"][:] recent_placements_metadata_items[0].update({"isrc": "USA561066580"}) recent_placements_metadata_items[0].update({"count": 100}) recent_placements_metadata_items[0].update(storefronts_property) get_recent_placements_metadata.return_value = recent_placements_metadata_items yield get_recent_placements_metadata @pytest.fixture def mock_get_placements_total_count(): """Mock get_placements_total_count.""" with patch( "sound_recordings.models.placements_metadata." "get_placements_total_count" ) as get_recent_placements_metadata: get_recent_placements_metadata.return_value = 19 yield get_recent_placements_metadata @pytest.fixture def mock_add_outage_error_to_stores(): """Mock add_outage_error_to_stores.""" with patch( "sound_recordings.logic.store_outages." "add_outage_error_to_stores" ) as add_outage_error_to_stores: add_outage_error_to_stores.return_value = [ {"id": 286, "name": "Spotify"}, {"id": 1, "name": "Apple Music", "error": {"code": "unreliable"}}, ] yield add_outage_error_to_stores @pytest.fixture def get_placements_result( mock_get_placements_metadata, mock_add_outage_error_to_stores, mock_permissions_for_label, request_context_for_label, ): """Run get_placements.""" return placements.get_placements( request_context_for_label, 25, 0, "DESC", "added", isrc, store_ids, owner_categories, DEFAULT_MIN_FOLLOWERS, ) @pytest.fixture def get_placement_result( mock_get_placement, mock_add_outage_error_to_stores, mock_permissions_for_label, request_context_for_label, ): """Run get_placements.""" return placements.get_placement(request_context_for_label, isrc, playlist_id) @pytest.fixture def get_recent_placements_result( mock_get_recent_placements_metadata, mock_get_placements_total_count, mock_add_outage_error_to_stores, mock_permissions_for_label, request_context_for_label, ): """Run get_recent_placements.""" with app.test_request_context(): return placements.get_recent_placements( request_context_for_label, 25, 0, [1, 286], [CURATED, EDITORIAL], DEFAULT_MIN_FOLLOWERS, ) def test_get_placements( get_placements_result, mock_permissions_for_label, request_context_for_label ): """Test result of get_track_placements.""" placement_models = placements_metadata.get_placements_metadata( request_context_for_label, 25, 0, isrc ) assert get_placements_result.message == PlacementsSchema().dump( { "isrc": isrc, "items": placement_models["items"], "sources": store_outages.add_outage_error_to_stores(), "total_count": placement_models["total_count"], } ) def test_get_placement( get_placement_result, mock_permissions_for_label, request_context_for_label ): """Test get_placement.""" placement_model = placements_metadata.get_placement( request_context_for_label, isrc, playlist_id ) assert get_placement_result.message == PlacementSchema().dump(placement_model) def test_get_recent_placements( get_recent_placements_result, mock_permissions_for_label, request_context_for_label ): """Test result of test_get_recent_placements.""" recent_placements = placements_metadata.get_recent_placements_metadata( request_context_for_label, 25, 0 ) assert get_recent_placements_result.message == RecentPlacementsSchema().dump( { "items": recent_placements, "count": get_recent_placements_result.message["count"], "sources": store_outages.add_outage_error_to_stores(), "total": get_recent_placements_result.message["total"], } )