"""Tests for track_metadata model.""" from datetime import datetime from unittest.mock import patch import pytest from sound_recordings.models import track_metadata label_id = 456 profile_id = 1 subaccount_id = None permissions_filter = { "label_ids": [label_id], "subaccount_id": subaccount_id, "artist_ids": None, } permissions_filter_artist_profile = { "label_id": None, "subaccount_id": None, "artist_ids": {1, 2, 3}, } product_id_1 = 1231 product_id_2 = 1232 product_id_3 = 1233 track_isrc = "NOO1" artist_name = "Lil Jon" FIRST_ID_1 = "product:{}".format(product_id_1) FIRST_ID_2 = "product:{}".format(product_id_2) FIRST_ID_3 = "product:{}".format(product_id_3) SECOND_ID = "isrc:{}".format(track_isrc) PRODUCT_1 = { "release_id": product_id_1, "is_deleted": True, "release_date": "2020-01-01", "sales_start_date": "2020-01-01", "release_artist": artist_name, } PRODUCT_1_DATE = datetime(2020, 1, 1).date() PRODUCT_2 = { "release_id": product_id_2, "is_deleted": False, "release_date": "2020-01-02", "sales_start_date": "2020-01-02", "release_artist": artist_name, } PRODUCT_2_DATE = datetime(2020, 1, 2).date() PRODUCT_3 = { "release_id": product_id_3, "is_deleted": False, "release_date": "2020-01-03", "sales_start_date": "2020-01-03", "release_artist": artist_name, } PRODUCT_3_DATE = datetime(2020, 1, 3).date() TRACK_1 = { "isrc": track_isrc, "track_name": "track 1", "label_id": label_id, "subaccount_id": None, "first_id": FIRST_ID_1, "product": PRODUCT_1, "artists": [{"artist_name": artist_name, "type": "performer"}], } TRACK_2 = { "isrc": track_isrc, "track_name": "track 2", "label_id": label_id, "subaccount_id": None, "first_id": FIRST_ID_2, "product": PRODUCT_2, "artists": [{"artist_name": artist_name, "type": "performer"}], } TRACK_3 = { "isrc": track_isrc, "track_name": "track 3", "label_id": label_id, "subaccount_id": None, "first_id": FIRST_ID_3, "product": PRODUCT_3, "artists": [{"artist_name": artist_name, "type": "performer"}], } QUERY_RESPONSE_BY_RANGE_KEY_MIXED = [TRACK_1, TRACK_2, TRACK_3] QUERY_RESPONSE_BY_RANGE_KEY_DELETED = [TRACK_1] @pytest.fixture() def mock_query_by_range_key_mixed(): """Mock dynamo.query_by_range_key.""" with patch( "sound_recordings.models.track_metadata.dynamo" ".query_by_range_key" ) as query: query.return_value = QUERY_RESPONSE_BY_RANGE_KEY_MIXED yield query @pytest.fixture() def mock_query_by_range_key_deleted(): """Mock dynamo.query_by_range_key.""" with patch( "sound_recordings.models.track_metadata.dynamo" ".query_by_range_key" ) as query: query.return_value = QUERY_RESPONSE_BY_RANGE_KEY_DELETED yield query class TestGetTrackMetadata: """Test get_track_metadata model.""" @pytest.fixture(autouse=True) def no_cache(self): """Mock out caching of response.""" with patch("sound_recordings.connectors.redis.client.get") as get: get.return_value = None yield get def test_success(self, mock_query_by_range_key_mixed): """Test that latest non-deleted product returned.""" result = track_metadata.get_track_metadata( permissions_filter_artist_profile, track_isrc ) assert result == { "track_name": "track 3", "first_id": FIRST_ID_3, "label_id": label_id, "subaccount_id": subaccount_id, "isrc": track_isrc, "artist_name": artist_name, "artists": [{"artist_name": artist_name, "type": "performer"}], "product": { **PRODUCT_3, "release_date": PRODUCT_3_DATE, "sales_start_date": PRODUCT_3_DATE, "artists": [{"artist_name": artist_name, "type": "performer"}], }, "products": [ { **PRODUCT_3, "release_date": PRODUCT_3_DATE, "sales_start_date": PRODUCT_3_DATE, "artists": [{"artist_name": artist_name, "type": "performer"}], }, { **PRODUCT_2, "release_date": PRODUCT_2_DATE, "sales_start_date": PRODUCT_2_DATE, "artists": [{"artist_name": artist_name, "type": "performer"}], }, ], } def test_deleted(self, mock_query_by_range_key_deleted): """Test that deleted product returned if requested.""" result = track_metadata.get_track_metadata( permissions_filter_artist_profile, track_isrc, True ) assert result == { "track_name": "track 1", "first_id": FIRST_ID_1, "isrc": track_isrc, "label_id": label_id, "subaccount_id": subaccount_id, "artist_name": artist_name, "artists": [{"artist_name": artist_name, "type": "performer"}], "product": { **PRODUCT_1, "release_date": PRODUCT_1_DATE, "sales_start_date": PRODUCT_1_DATE, "artists": [{"artist_name": artist_name, "type": "performer"}], }, "products": [ { **PRODUCT_1, "release_date": PRODUCT_1_DATE, "sales_start_date": PRODUCT_1_DATE, "artists": [{"artist_name": artist_name, "type": "performer"}], }, ], } def test_not_found(self, mock_query_by_range_key_mixed): """Test model not found.""" mock_query_by_range_key_mixed.return_value = [] result = track_metadata.get_track_metadata( permissions_filter_artist_profile, track_isrc ) assert result is None