"""Pytest conftest module.""" from datetime import datetime import os from ddex_ingester_common.constants.xmltodict import DDEX_LIST_FIELDS from ddex_ingester_common.models.ddex.asset import Asset as DDEXAsset from ddex_ingester_common.models.ddex.deal import Deal as DDEXDeal from ddex_ingester_common.models.ddex.deal_term import DealTerm as DDEXDealTerm from ddex_ingester_common.models.s3.body import Body as S3Body from ddex_ingester_common.models.s3.deal import Deal as S3Deal from ddex_ingester_common.models.s3.label_participant import LabelParticipant from ddex_ingester_common.models.s3.product import Product as S3Product from ddex_ingester_common.models.s3.project import Project as S3Project from ddex_ingester_common.models.s3.track import Track as S3Track from ddex_ingester_common.models.state_machine.body import ( Body as StateMachineBody ) from ddex_ingester_common.models.state_machine.correction_item import ( CorrectionItem as StateMachineCorrectionItem ) from ddex_ingester_common.models.state_machine.error_correction import ( ErrorCorrection as StateMachineErrorCorrection ) from ddex_ingester_common.models.state_machine.original_values import ( OriginalValues as StateMachineOriginalValues ) from ddex_ingester_common.models.state_machine.product import ( Product as StateMachineProduct ) from ddex_ingester_common.models.state_machine.track import ( Track as StateMachineTrack ) import pytest import xmltodict DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data',) @pytest.fixture def context(): """Context dict fixture.""" return { 'product': { 'vendor_id': 123, 'subaccount_id': 123, 'release_reference': 'R0', 'upc': '886448369561', 'is_main_release': True, 'product_id': None, 'artwork': { 'filename': 'artwork.tif', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/artwork.tif', 'ows_assets_filename': None }, 'release_type': 'Album', 'sale_start_date': '2010-12-21', 'original_release_date': '2010-12-31', 'grid': 'A10301A0004280500R', 'catalog_number': 'G010004280500R', 'display_artist_name': 'Giveon', 'original_values': { 'sale_start_date': None, 'carveout_country_codes': ['US', 'CA'], 'release_date': '2016-01-01' }, 'status': None, 'product_name': 'Test Artist', 'not_for_distribution': None, 'special_instructions': 'Something', 'genres': [ { 'genre': 'Pop', 'subgenre': 'Alternative', } ] }, 'tracks': [ { 'release_reference': 'R1', 'asset': { 'filename': 'audio.flac', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/audio.flac', 'ows_assets_filename': None }, 'volume': 1, 'tuid': None, 'sequence_number': 1, 'isrc': 'USSM12001699', 'release_type': 'TrackRelease', 'track_name': 'New Track', 'resource_reference': 'A1' } ], 'participants': [ { 'name': 'artistName', 'artist_id': '11', 'label_participant_id': '12', 'label_participant_uuid': 'AAAAAA', } ], 'deals': [ { 'release_references': ['R1'], 'deal_terms': [ { 'start_date': None, 'start_date_time': '2020-03-27T00:00:00', 'territories': ['AE'], 'commercial_model_types': [ 'AdvertisementSupportedModel' ], 'usage_type': [ 'NonInteractiveStream', 'OnDemandStream', ], 'takedown': None, } ], } ], 'error_correction': { 'release_correction_id': 286056, 'release_id': 2604712, 'items': [ { 'release_correction_detail_id': 4192314, 'field_name': 'coverart', 'key_value': True, 'key_id': 2604712, 'table_name': 'releases', } ] }, 'is_purged_release': False, 'key': 'folder/subfolder/', 'bucket': 'ddex-bucket', 'errors': None, 'message_id': '123456', 'message_thread_id': '123456SOMETHING', 'party_id': 'PADPIDA2007040502I', 'update_indicator': 'OriginalMessage', 'maintenance_owner': None, 'execution_name': 'execution_name', 'state_machine_name': 'state_machine_name', 'execution_start_time': '2019-03-26T20:14:13.192Z', 'orchard_label': 'TVT Records', 'project_id': 123, 'has_switchboard_deal': True, } @pytest.fixture def statemachine_context(): """Context dict fixture.""" return { 'product': { 'vendor_id': 123, 'subaccount_id': 123, 'release_reference': 'R0', 'release_type': 'Album', 'upc': '886448369561', 'display_upc': None, 'product_id': None, 'artwork': { 'filename': 'artwork.tif', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/artwork.tif', 'ows_assets_filename': None }, 'sale_start_date': '2010-12-21', 'original_release_date': '2010-12-31', 'grid': 'A10301A0004280500R', 'catalog_number': 'G010004280500R', 'display_artist_name': 'Giveon', 'original_values': { 'sale_start_date': None, 'carveout_country_codes': ['US', 'CA'], 'release_date': '2016-01-01' }, 'status': None, 'product_name': 'Test Artist', 'not_for_distribution': 'N', 'display_status': None, 'special_instructions': 'Something', 'genre_id': None, 'subgenre_id': None, }, 'tracks': [ { 'release_reference': 'R1', 'asset': { 'filename': 'audio.flac', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/audio.flac', 'ows_assets_filename': None }, 'tuid': None, 'isrc': 'USSM12001699', 'resource_reference': 'A1' } ], 'error_correction': { 'release_correction_id': 286056, 'release_id': 2604712, 'items': [ { 'release_correction_detail_id': 4192314, 'field_name': 'coverart', 'key_value': True, 'key_id': 2604712, 'table_name': 'releases', } ] }, 'is_purged_release': False, 'key': 'folder/subfolder/', 'bucket': 'ddex-bucket', 'errors': None, 'message_id': '123456', 'message_thread_id': '123456SOMETHING', 'update_indicator': 'OriginalMessage', 'maintenance_owner': None, 'execution_name': 'execution_name', 'state_machine_name': 'state_machine_name', 'execution_start_time': '2019-03-26T20:14:13.192Z', 'orchard_label': 'TVT Records', 'project_id': 123, 'video': None, 'warnings': [ { 'field': 'WarningField', 'warning_type': 'LambdaWarning', 'exception': 'this is the exception string' } ], 'ddex_provider': 'SME', 'correlation_id': '4ertdgjd56itkcllyighbl', 'deal_coordinators': ['awesome-coordinator@theorchard.com'], 'validate_product_retry_counter': 2, 'ingest_id': 1, 'has_switchboard_deal': True, 'artwork_ingestion_only': False, } @pytest.fixture() def s3_parsed_ddex(): """Parse DDEX in S3 model.""" return { 'product': { 'release_reference': 'R0', 'upc': '886448369561', 'display_upc': None, 'is_main_release': True, 'artwork': { 'filename': 'artwork.tif', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/artwork.tif', 'ows_assets_filename': None }, 'release_type': 'Album', 'sale_start_date': '2010-12-21', 'original_release_date': '2010-12-31', 'grid': 'A10301A0004280500R', 'catalog_number': 'G010004280500R', 'display_artist_name': 'Giveon', 'product_name': 'Test Artist', 'metadata_language': 'ENG', 'product_version': 'New Version', 'imprint': 'BNA Records Label', 'manufacturer_upc': '886448369562', 'genres': [ { 'genre': 'R&B', 'subgenre': 'R and B', }, { 'genre': 'Pop', 'subgenre': 'Alternative', } ], 'p_line': '2020 Epic Records, a division of Sony Music Entertainment', # noqa 'c_line': '2020 Epic Records, a division of Sony Music Entertainment', # noqa, 'display_artists': [ { 'name': 'Giveon', 'sequence_number': 1, 'roles': [ 'MainArtist' ], 'localized_names': [ { 'language_code': 'RU', 'name': 'Альбертина Уокер', }, { 'language_code': 'JP', 'name': 'アルバーティナウォーカ', } ], }, { 'name': 'Artist', 'sequence_number': 2, 'roles': [ 'SecondaryArtist' ] }, ], 'marketing_blurb': 'A tagline to sell the Product can go here.', 'stores': [ { 'store_id': 'spotify', 'link': 'spotify:album:368TKDyiyzFTwCyHJ0uWqc', 'delivery_date': '2020-12-03', 'carved_out': True, }, { 'store_id': 'apple', 'link': '186235393', 'delivery_date': '2020-12-02' }, { 'store_id': 'deezer', 'link': 'www.deezer.com/album/186235392' }, { 'store_id': 'vevo', 'delivery_date': '2020-12-01' } ], 'artist_profile_page': 'ArtistVEVO', 'localized_titles': [ { 'language_code': 'ru', 'title': 'Песни Церкви - Живите в Мемфисе' } ], 'product_id': None, 'vendor_id': None, 'subaccount_id': None, 'status': None, 'not_for_distribution': 'N', 'display_status': None, 'special_instructions': None, 'genre_id': None, 'subgenre_id': None, 'product_version_notes': None, 'proprietary_id': None, 'major_label': 'Epic Records Group', 'parent_repertoire_owner_code': '0123', 'parent_repertoire_owner_name': 'SME Brasil Ltda.', 'repertoire_owner_code': '0123', 'repertoire_owner_name': 'SME Brasil Ltda.', 'is_confidential': False, 'duration': 'PT0H23M19S', 'maintenance_owner_code': '0124', 'maintenance_owner_name': 'Test', }, 'tracks': [ { 'release_reference': 'R1', 'asset': { 'filename': 'audio.flac', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/audio.flac', 'ows_assets_filename': None }, 'volume': 1, 'sequence_number': 1, 'isrc': 'USSM12001699', 'release_type': 'TrackRelease', 'track_name': 'NewTrack', 'track_version': '2020 Remaster', 'lyrics': 'Allow me to introduce myself...', 'lyrics_language': 'en', 'us_publishing_obligation': 'Composition', 'ownership_rights': 'LICENSED', 'publishers': ['ATV Music Publishing', 'Chateau Publishing'], 'recording_country_code': 'US', 'copyright_owner_country': 'US', 'explicit': 'E', 'p_line': '(P) 2018 Sony Music Associated Records', 'c_line': None, 'content_type': 'Music with vocals', 'offer_type': 'ALL', 'original_release_date': '2024-01-01', 'is_instrumental': True, 'display_artists': [ { 'name': 'Giveon', 'sequence_number': 1, 'roles': [ 'MainArtist' ] }, { 'name': 'Artist', 'sequence_number': 2, 'roles': [ 'SecondaryArtist' ] }, ], 'resource_contributors': [ { 'name': 'Giveon Evans', 'sequence_number': 1, 'roles': [ 'Arranger', 'Composer', 'Lyricist' ] }, ], 'localized_titles': [ { 'language_code': 'ru', 'title': 'Не позволяйте никому оборачивать вас', 'version': 'Прямой эфир' } ], 'preview_start_time': 30, 'resource_reference': 'A1' } ], 'deals': [ { 'release_references': ['R0'], 'deal_terms': [ { 'start_date': None, 'start_date_time': '2020-03-27T00:00:00', 'territories': ['AE'], 'commercial_model_types': [ 'AdvertisementSupportedModel' ], 'usage_type': [ 'NonInteractiveStream', 'OnDemandStream', ], 'takedown': None, 'price_type': '12', }, { 'pre_order': True, 'start_date': None, 'start_date_time': '2020-04-27T00:00:00', 'release_display_date': '2021-04-20T00:00:00', 'track_listing_preview_date': '2021-04-20T00:00:00', 'cover_art_preview_date': '2021-04-20T00:00:00', 'clip_preview_date': '2021-04-30T00:00:00', 'territories': ['BE'], 'commercial_model_types': [ 'AdvertisementSupportedModel' ], 'usage_type': [ 'NonInteractiveStream', 'OnDemandStream', ], 'takedown': None, 'instant_gratifications': { 'references': ['A1', 'A2'], 'start_date': '2021-04-20', 'start_date_time': '2021-04-25T00:00:00' } } ], } ], 'label_participants': [ { 'name': 'Various', 'artist_id': '2395783', 'label_participant_id': '8b795a29-0bc4-4059-a331-badd120030d9', 'label_participant_uuid': '8b795a29-0bc4-4059-a331-badd120030d9' }, { 'name': 'Various Artists', 'artist_id': '2903134', 'label_participant_id': '3cfd4c3a-ada8-4c1e-88d3-61368914e585', 'label_participant_uuid': '3cfd4c3a-ada8-4c1e-88d3-61368914e585' }, { 'name': 'Marin Marais', 'artist_id': '3858257', 'label_participant_id': 'a4f5c034-aaeb-4e4e-9ccc-32a1fbbcb7f5', 'label_participant_uuid': 'a4f5c034-aaeb-4e4e-9ccc-32a1fbbcb7f5' } ], 'key': 'folder/subfolder/', 'bucket': 'ddex-bucket', 'message_id': '123456', 'message_thread_id': '123456SOMETHING', 'party_id': 'PADPIDA2007040502I', 'update_indicator': 'OriginalMessage', 'execution_name': 'execution_name', 'state_machine_name': 'state_machine_name', 'execution_start_time': '2019-03-26T20:14:13.192Z', 'video': None, 'project': { 'name': 'HIGHER LEARNING MUSIC FROM THE MOTION PICTURE', 'project_code': '1001247', 'description': 'The project description text enter here', 'artist': { 'name': 'Laureano Brizuela', 'sequence_number': 1, 'apple_id': 'itunes:artist:7vWDO969PvNqNYHIOW5v0m', 'spotify_uri': 'spotify:artist:6vWDO969PvNqNYHIOW5v0m' }, 'marketing_highlights': [ { 'highlight': 'marketing highlight enter here', 'territory_codes': ['US', 'CA'], 'store_codes': None }, { 'highlight': 'marketing highlight for WW enter here', 'territory_codes': ['worldwide'], 'store_codes': None }, { 'highlight': 'marketing highlight for Store 1 & 2 enter here', # noqa 'territory_codes': None, 'store_codes': ['StordId1', 'StordId2'] }, { 'highlight': 'marketing highlight for Store 3 enter here', 'territory_codes': None, 'store_codes': ['StordId3'] } ] }, } @pytest.fixture() def deserialized_asset(): """Asset model.""" return DDEXAsset( **{ 'filename': 'audio.flac', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/audio.flac', 'ows_assets_filename': None } ) @pytest.fixture() def deserialized_context_track(deserialized_asset): """Track model.""" return StateMachineTrack( **{ 'release_reference': 'R1', 'asset': deserialized_asset, 'volume': 1, 'tuid': None, 'sequence_number': 1, 'isrc': 'USSM12001699', 'release_type': 'TrackRelease', 'resource_reference': 'A1' } ) @pytest.fixture() def deserialized_context_original_values(): """Original Values model.""" return StateMachineOriginalValues( **{ 'sale_start_date': None, 'carveout_country_codes': ['US', 'CA'], 'release_date': '2016-01-01' } ) @pytest.fixture() def deserialized_context_product(deserialized_context_original_values): """Product model.""" return StateMachineProduct( **{ 'vendor_id': 123, 'subaccount_id': 123, 'release_reference': 'R0', 'upc': '886448369561', 'is_main_release': True, 'product_id': None, 'display_artist_name': 'Giveon', 'artwork': { 'filename': 'artwork.tif', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/artwork.tif', 'ows_assets_filename': None }, 'release_type': 'Album', 'sale_start_date': datetime.strptime('2010-12-21', '%Y-%m-%d'), 'original_release_date': '2010-12-31', 'grid': 'A10301A0004280500R', 'catalog_number': 'G010004280500R', 'original_values': deserialized_context_original_values, 'product_name': 'Test Artist', 'special_instructions': 'Something', 'genre_id': None, 'subgenre_id': None, 'not_for_distribution': 'N', } ) @pytest.fixture() def deserialized_deal_term(): """Deal term dict.""" return DDEXDealTerm( **{ 'start_date': None, 'start_date_time': '2020-03-27T00:00:00', 'territories': ['AE'], 'commercial_model_types': ['AdvertisementSupportedModel'], 'usage_type': ['NonInteractiveStream', 'OnDemandStream'], } ) @pytest.fixture() def deserialized_deal(deserialized_deal_term): """Deal dict.""" return DDEXDeal( **{ 'release_references': ['R1'], 'deal_terms': [deserialized_deal_term] } ) @pytest.fixture() def deserialized_correction_item(): """Correction item dict.""" return StateMachineCorrectionItem( **{ 'release_correction_detail_id': 4192314, 'field_name': 'coverart', 'key_value': True, 'key_id': 2604712, 'table_name': 'releases', } ) @pytest.fixture() def deserialized_error_correction(deserialized_correction_item): """Error correction dict.""" return StateMachineErrorCorrection( **{ 'release_correction_id': 286056, 'release_id': 2604712, 'items': [deserialized_correction_item] } ) @pytest.fixture def deserialized_context( deserialized_context_track, deserialized_context_product, deserialized_error_correction ): """Body dict.""" return StateMachineBody( **{ 'product': deserialized_context_product, 'tracks': [deserialized_context_track], 'error_correction': deserialized_error_correction, 'is_purged_release': False, 'key': 'folder/subfolder/', 'bucket': 'ddex-bucket', 'errors': None, 'message_id': '123456', 'message_thread_id': '123456SOMETHING', 'update_indicator': 'OriginalMessage', 'execution_name': 'execution_name', 'state_machine_name': 'state_machine_name', 'execution_start_time': '2019-03-26T20:14:13.192Z', 'orchard_label': 'TVT Records', 'project_id': 123, 'warnings': [ { 'field': 'WarningField', 'warning_type': 'LambdaWarning', 'exception': 'this is the exception string' } ], 'ddex_provider': 'SME', 'correlation_id': '4ertdgjd56itkcllyighbl', 'deal_coordinators': ['awesome-coordinator@theorchard.com'], 'validate_product_retry_counter': 2, 'ingest_id': 1, 'has_switchboard_deal': True, 'artwork_ingestion_only': False, } ) @pytest.fixture def deserialized_s3_context_product(): """S3 Product Dict.""" return S3Product( **{ 'release_reference': 'R0', 'upc': '886448369561', 'is_main_release': True, 'artwork': { 'filename': 'artwork.tif', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/artwork.tif', 'ows_assets_filename': None }, 'release_type': 'Album', 'sale_start_date': datetime.strptime('2010-12-21', '%Y-%m-%d'), 'original_release_date': '2010-12-31', 'grid': 'A10301A0004280500R', 'catalog_number': 'G010004280500R', 'display_artist_name': 'Giveon', 'product_name': 'Test Artist', 'metadata_language': 'ENG', 'product_version': 'New Version', 'imprint': 'BNA Records Label', 'not_for_distribution': 'N', 'manufacturer_upc': '886448369562', 'genres': [ { 'genre': 'R&B', 'subgenre': 'R and B', }, { 'genre': 'Pop', 'subgenre': 'Alternative', }, ], 'video': None, 'p_line': '2020 Epic Records, a division of Sony Music Entertainment', # noqa 'c_line': '2020 Epic Records, a division of Sony Music Entertainment', # noqa 'display_artists': [ { 'name': 'Giveon', 'sequence_number': 1, 'roles': [ 'MainArtist' ], 'localized_names': [ { 'language_code': 'RU', 'name': 'Альбертина Уокер', }, { 'language_code': 'JP', 'name': 'アルバーティナウォーカ', } ], }, { 'name': 'Artist', 'sequence_number': 2, 'roles': [ 'SecondaryArtist' ] }, ], 'marketing_blurb': 'A tagline to sell the Product can go here.', 'stores': [ { 'store_id': 'spotify', 'link': 'spotify:album:368TKDyiyzFTwCyHJ0uWqc', 'delivery_date': '2020-12-03', 'carved_out': True, }, { 'store_id': 'apple', 'link': '186235393', 'delivery_date': '2020-12-02' }, { 'store_id': 'deezer', 'link': 'www.deezer.com/album/186235392' }, { 'store_id': 'vevo', 'delivery_date': '2020-12-01' } ], 'artist_profile_page': 'ArtistVEVO', 'localized_titles': [ { 'language_code': 'ru', 'title': 'Песни Церкви - Живите в Мемфисе' } ], 'major_label': 'Epic Records Group', 'parent_repertoire_owner_code': '0123', 'parent_repertoire_owner_name': 'SME Brasil Ltda.', 'repertoire_owner_code': '0123', 'repertoire_owner_name': 'SME Brasil Ltda.', 'is_confidential': False, 'duration': 'PT0H23M19S', 'maintenance_owner_code': '0124', 'maintenance_owner_name': 'Test', } ) @pytest.fixture def deserialized_s3_context_project(): """S3 Project Dict.""" return S3Project( **{ 'name': 'HIGHER LEARNING MUSIC FROM THE MOTION PICTURE', 'project_code': '1001247', 'description': 'The project description text enter here', 'artist': { 'name': 'Laureano Brizuela', 'sequence_number': 1, 'apple_id': 'itunes:artist:7vWDO969PvNqNYHIOW5v0m', 'spotify_uri': 'spotify:artist:6vWDO969PvNqNYHIOW5v0m' }, 'marketing_highlights': [ { 'highlight': 'marketing highlight enter here', 'territory_codes': ['US', 'CA'], 'store_codes': None }, { 'highlight': 'marketing highlight for WW enter here', 'territory_codes': ['worldwide'], 'store_codes': None }, { 'highlight': 'marketing highlight for Store 1 & 2 enter here', # noqa 'territory_codes': None, 'store_codes': ['StordId1', 'StordId2'] }, { 'highlight': 'marketing highlight for Store 3 enter here', 'territory_codes': None, 'store_codes': ['StordId3'] } ] } ) @pytest.fixture def deserialized_s3_context_tracks(): """S3 Tracks Dict.""" return S3Track( **{ 'release_reference': 'R1', 'asset': { 'filename': 'audio.flac', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/audio.flac', 'ows_assets_filename': None }, 'volume': 1, 'sequence_number': 1, 'isrc': 'USSM12001699', 'release_type': 'TrackRelease', 'track_name': 'NewTrack', 'track_version': '2020 Remaster', 'lyrics': 'Allow me to introduce myself...', 'lyrics_language': 'en', 'us_publishing_obligation': 'Composition', 'ownership_rights': 'LICENSED', 'original_release_date': '2024-01-01', 'publishers': ['ATV Music Publishing', 'Chateau Publishing'], 'recording_country_code': 'US', 'copyright_owner_country': 'US', 'explicit': 'E', 'p_line': '(P) 2018 Sony Music Associated Records', 'genre': 'R&B', 'content_type': 'Music with vocals', 'offer_type': 'ALL', 'is_instrumental': True, 'display_artists': [ { 'name': 'Giveon', 'sequence_number': 1, 'roles': [ 'MainArtist' ] }, { 'name': 'Artist', 'sequence_number': 2, 'roles': [ 'SecondaryArtist' ] }, ], 'resource_contributors': [ { 'name': 'Giveon Evans', 'sequence_number': 1, 'roles': [ 'Arranger', 'Composer', 'Lyricist' ] }, ], 'localized_titles': [ { 'language_code': 'ru', 'title': 'Не позволяйте никому оборачивать вас', 'version': 'Прямой эфир' } ], 'preview_start_time': 30, 'resource_reference': 'A1' } ) @pytest.fixture def deserialized_s3_context_deals(): """S3 Deals Dict.""" return S3Deal( **{ 'release_references': ['R0'], 'deal_terms': [ { 'start_date': None, 'start_date_time': '2020-03-27T00:00:00', 'territories': ['AE'], 'commercial_model_types': ['AdvertisementSupportedModel'], 'usage_type': [ 'NonInteractiveStream', 'OnDemandStream', ], 'takedown': None, 'price_type': '12', }, { 'pre_order': True, 'start_date': None, 'start_date_time': '2020-04-27T00:00:00', 'release_display_date': '2021-04-20T00:00:00', 'track_listing_preview_date': '2021-04-20T00:00:00', 'cover_art_preview_date': '2021-04-20T00:00:00', 'clip_preview_date': '2021-04-30T00:00:00', 'territories': ['BE'], 'commercial_model_types': ['AdvertisementSupportedModel'], 'usage_type': [ 'NonInteractiveStream', 'OnDemandStream', ], 'takedown': None, 'instant_gratifications': { 'references': ['A1', 'A2'], 'start_date': '2021-04-20', 'start_date_time': '2021-04-25T00:00:00' } } ], } ) @pytest.fixture def deserialized_s3_context_label_participants(): """S3 Deals label_participants.""" return [LabelParticipant( **{ 'artist_id': '2395783', 'label_participant_id': '8b795a29-0bc4-4059-a331-badd120030d9', 'label_participant_uuid': '8b795a29-0bc4-4059-a331-badd120030d9', 'name': 'Various', }), LabelParticipant( **{ 'artist_id': '2903134', 'label_participant_id': '3cfd4c3a-ada8-4c1e-88d3-61368914e585', 'label_participant_uuid': '3cfd4c3a-ada8-4c1e-88d3-61368914e585', 'name': 'Various Artists', }), LabelParticipant( **{ 'artist_id': '3858257', 'label_participant_id': 'a4f5c034-aaeb-4e4e-9ccc-32a1fbbcb7f5', 'label_participant_uuid': 'a4f5c034-aaeb-4e4e-9ccc-32a1fbbcb7f5', 'name': 'Marin Marais', })] @pytest.fixture def deserialized_s3_context( deserialized_s3_context_project, deserialized_s3_context_product, deserialized_s3_context_tracks, deserialized_s3_context_deals, deserialized_s3_context_label_participants ): """Body dict for s3 context.""" return S3Body( **{ 'product': deserialized_s3_context_product, 'project': deserialized_s3_context_project, 'tracks': [deserialized_s3_context_tracks], 'deals': [deserialized_s3_context_deals], 'label_participants': deserialized_s3_context_label_participants, 'key': 'folder/subfolder/', 'bucket': 'ddex-bucket', 'message_id': '123456', 'message_thread_id': '123456SOMETHING', 'party_id': 'PADPIDA2007040502I', 'update_indicator': 'OriginalMessage', 'execution_name': 'execution_name', 'state_machine_name': 'state_machine_name', 'execution_start_time': '2019-03-26T20:14:13.192Z' } ) def parse_xml_to_dict(xml): """Parse given XML file using xmltodict.parse().""" with open(os.path.join(DATA_DIR, xml), encoding='utf-8') as fd: return xmltodict.parse(fd.read(), force_list=DDEX_LIST_FIELDS) @pytest.fixture def ddex_document(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-album.xml') @pytest.fixture def ddex_document_localized_data(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-audio-album-localized-data.xml') @pytest.fixture def ddex_document_localized_artist(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-audio-album-localized-data-artist.xml') @pytest.fixture def ddex_document_single_no_assets(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-single-no-assets.xml') @pytest.fixture def ddex_document_single_with_asset_preview(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict( 'ddex-single-one-track-asset-with-preview.xml' ) @pytest.fixture def ddex_document_with_multiple_release_details(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict( 'ddex-with-multiple-release-details-by-territory.xml' ) @pytest.fixture def ddex_document_with_multiple_release_details_not_worldwide(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict( 'ddex-with-multiple-release-details-by-territory-not-worldwide.xml' ) @pytest.fixture def ddex_document_classical(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-classical-album.xml') @pytest.fixture def ddex_document_classical_deeply_nested_groups(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-classical-album-2.xml') @pytest.fixture def ddex_document_classical_deeply_nested_resource_group_lists(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-classical-album-3.xml') @pytest.fixture def ddex_document_release_list(ddex_document): """Release list.""" return ddex_document['ernm:NewReleaseMessage']['ReleaseList']['Release'] @pytest.fixture def purged_ddex_document(): """Purged DDEX document deserialized into a dict.""" return parse_xml_to_dict('purged-ddex.xml') @pytest.fixture def purged_awal_ddex_document(): """Purged DDEX document for AWAL deserialized into a dict.""" return parse_xml_to_dict('purged_ddex_awal.xml') @pytest.fixture def read_ddex_ddex_document(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict( 'read_ddex/ddex-single-with-extended-metadata.xml') @pytest.fixture def read_ddex_extended_metadata(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('read_ddex/extended_metadata.xml') @pytest.fixture def read_ddex_combined_ddex_documents(): """DDEX document combined with extended then deserialized into a dict.""" return parse_xml_to_dict('read_ddex/ddex-single-combined-metadata.xml') @pytest.fixture def read_ddex_awal_ddex_takedown(): """DDEX document with a TakeDown in the DealTerms.""" return parse_xml_to_dict('read_ddex/awal_ddex_document_takedown.xml') @pytest.fixture def read_ddex_awal_ddex_audio_takedown(): """DDEX document with a TakeDown in the DealTerms.""" return parse_xml_to_dict('read_ddex/awal_takedown_audio.xml') @pytest.fixture def read_ddex_awal_ddex_document(): """AWAL DDEX document deserialized into a dict.""" return parse_xml_to_dict('read_ddex/awal_ddex_document.xml') @pytest.fixture def read_ddex_missing_project(): """DDEX missing_project.""" return parse_xml_to_dict('read_ddex/ddex_missing_project.xml') @pytest.fixture def read_extended_metadata_missing_project(): """DDEX extended_metadata_missing_project.""" return parse_xml_to_dict('read_ddex/extended_metadata_missing_project.xml') @pytest.fixture def read_extended_metadata_missing_project_artist(): """DDEX extended_metadata_missing_project.""" return parse_xml_to_dict('read_ddex/extended_metadata_missing_artist.xml') @pytest.fixture def som_livre_combined_ddex(): """Som Livre DDEX and extended DDEX combined in one file.""" return parse_xml_to_dict('ddex-som-livre-combined.xml') @pytest.fixture() def s3_parsed_video_ddex(): """Parse video DDEX in S3 model.""" return { 'product': { 'release_reference': 'R0', 'upc': '111115264505', 'is_main_release': True, 'artwork': { 'filename': 'artwork.tif', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/artwork.tif' }, 'release_type': 'VideoSingle', 'sale_start_date': '2020-10-21', 'original_release_date': '2004-01-08', 'grid': 'A10301A0000025264A', 'catalog_number': 'G010000025264A', 'display_artist_name': 'Kelly Clarkson', 'product_name': 'Before Your Love', 'product_version': 'VIDEO', 'genres': [ { 'genre': 'Pop', 'subgenre': 'Alternative', } ], 'p_line': '(C) 2002 19 Recordings Limited', 'display_artists': [ { 'name': 'Kelly Clarkson', 'sequence_number': 1, 'roles': [ 'MainArtist' ] }, { 'name': 'Artist', 'sequence_number': 2, 'roles': [ 'SecondaryArtist' ] }, ] }, 'video': { 'release_reference': 'R1', 'asset': [ { 'filename': '320974399749_Video_001-001.mp4', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'dir/resources/320974399749_Video_001-001.mp4', 'ows_assets_filename': None }, { 'filename': '320984399749_Video_001-001.mp4', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'dir/resources/320984399749_Video_001-001.mp4', 'ows_assets_filename': None } ], 'isrc': 'USRV80200058', 'release_type': 'VideoTrackRelease', 'video_name': 'Before Your Love', 'video_version': 'VIDEO', 'explicit': 'E', 'p_line': {'line': 'SG Productions', 'year': 2018}, 'c_line': {'line': 'SG Productions', 'year': 2018}, 'title_language': 'ENG', 'content_language': 'ENG', 'product_code': 'G010000025264A', 'imprint': '19 Recordings', 'video_type': 'Official Music Video', 'associated_track_isrc': 'TRAIM1800040', 'description': 'Some video description', 'parental_advisory': 'No', 'lyrics': 'Some lyrics', 'content_type': 'Music with vocals', 'keywords': ['keyword1', 'keyword2'], 'genres': [ { 'genre': 'Pop', 'subgenre': 'Alternative', } ], 'display_artists': [ { 'name': 'Kelly Clarkson', 'sequence_number': 1, 'roles': [ 'MainArtist' ] }, { 'name': 'Artist', 'sequence_number': 2, 'roles': [ 'SecondaryArtist' ] }, ], }, 'deals': [ { 'release_references': ['R0'], 'deal_terms': [ { 'start_date': None, 'start_date_time': '2021-10-21T03:00:00', 'territories': ['US'], 'commercial_model_types': ['PayAsYouGoModel'], 'usage_type': [ 'PermanentDownload', ], 'takedown': None, }, ], }, { 'release_references': ['R1'], 'deal_terms': [ { 'start_date': None, 'start_date_time': '2021-10-21T03:00:00', 'territories': ['US'], 'commercial_model_types': ['PayAsYouGoModel'], 'usage_type': [ 'PermanentDownload', ], 'takedown': None, }, { 'start_date': None, 'start_date_time': '2021-10-21T03:00:00', 'territories': ['US'], 'commercial_model_types': ['SubscriptionModel'], 'usage_type': [ 'ConditionalDownload', 'NonInteractiveStream', 'OnDemandStream', ], 'takedown': None, }, { 'start_date': None, 'start_date_time': '2021-10-21T03:00:00', 'territories': ['US'], 'commercial_model_types': [ 'AdvertisementSupportedModel' ], 'usage_type': [ 'NonInteractiveStream', 'OnDemandStream', ], 'takedown': None, }, ], } ], 'key': 'dir/', 'bucket': 'ddex-bucket', 'message_id': '196785218', 'message_thread_id': 'G010000025264A_TOC', 'party_id': 'PADPIDA2007040502I', 'update_indicator': 'OriginalMessage', 'execution_name': 'execution_name', 'state_machine_name': 'state_machine_name', 'execution_start_time': '2019-03-26T20:14:13.192Z', 'project': { 'name': 'HIGHER LEARNING MUSIC FROM THE MOTION PICTURE', 'project_code': '1001247', 'description': 'The project description text enter here', 'artist': { 'name': 'Laureano Brizuela', 'sequence_number': 1, 'apple_id': 'itunes:artist:7vWDO969PvNqNYHIOW5v0m', 'spotify_uri': 'spotify:artist:6vWDO969PvNqNYHIOW5v0m' }, 'marketing_highlights': [ { 'highlight': 'marketing highlight enter here', 'territory_codes': ['US', 'CA'], 'store_codes': None }, { 'highlight': 'marketing highlight for WW enter here', 'territory_codes': ['worldwide'], 'store_codes': None }, { 'highlight': 'marketing highlight for Store 1 & 2 enter here', # noqa 'territory_codes': None, 'store_codes': ['StordId1', 'StordId2'] }, { 'highlight': 'marketing highlight for Store 3 enter here', 'territory_codes': None, 'store_codes': ['StordId3'] } ] }, } @pytest.fixture def ddex_video_document(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-video-single.xml') @pytest.fixture def ddex_combined_metadata(): """DDEX document combined with extended then deserialized into a dict.""" return parse_xml_to_dict('ddex-single-combined-metadata.xml') @pytest.fixture def ddex_missing_fields(): """DDEX document with missing fields then deserialized into a dict.""" return parse_xml_to_dict('ddex-with-missing-fields.xml') @pytest.fixture def ddex_video_with_artist_profile_document(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-video-with-artist-profile-page.xml') @pytest.fixture def ddex_video_with_related_audio_document(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-video-with-related-audio.xml') @pytest.fixture def ddex_single_preorder(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-single-preorder.xml') @pytest.fixture def ddex_with_invalid_deal_term_fields(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex_with_deal_term_without_start_date.xml') @pytest.fixture def ddex_album_preorder_instant_grats(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('pre-order-and-instant-grat.xml') @pytest.fixture def ddex_single_with_extended_no_project_artist(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-single-combined-no-project-artist.xml') @pytest.fixture def ddex_single_without_language_of_performance(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-single-without-language-of-performance.xml') @pytest.fixture def ddex_multiple_sound_recording_details_by_territory(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict( 'ddex-multiple-SoundRecordingDetailsByTerritory.xml' ) @pytest.fixture def ddex_video_with_user_defined_video_type(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-video-user-defined-video-type.xml') @pytest.fixture def ddex_fluve_multiple_tracks(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-fluve-multiple-tracks.xml') @pytest.fixture def video_context(): """Video context dict fixture.""" return { 'product': { 'vendor_id': 123, 'subaccount_id': 123, 'release_reference': 'R0', 'upc': '886448369561', 'is_main_release': True, 'product_id': None, 'artwork': { 'filename': 'artwork.tif', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/artwork.tif', 'ows_assets_filename': None }, 'release_type': 'Album', 'sale_start_date': '2010-12-21', 'original_release_date': '2004-01-08', 'grid': 'A10301A0004280500R', 'catalog_number': 'G010004280500R', 'display_artist_name': 'Giveon', 'original_values': { 'sale_start_date': None, 'carveout_country_codes': ['US', 'CA'], 'release_date': '2004-01-08' }, 'status': None, 'product_name': 'Before Your Love', 'not_for_distribution': None, }, 'tracks': [], 'video': { 'release_reference': 'T1', 'assets': [ { 'filename': 'video1.mp4', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/video1.mp4', 'aspect_ratio': '1.271', }, { 'filename': 'video2.mp4', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/video2.mp4', 'aspect_ratio': '1.333', }, ], 'tuid': None, 'isrc': 'USSM12001699', 'release_type': 'VideoTrackRelease', 'track_name': 'New Track', 'associated_track_tuid': 35027077, 'current_channel': "I don't see the channel I want", }, 'participants': None, 'deals': None, 'is_purged_release': False, 'key': 'folder/subfolder/', 'bucket': 'ddex-bucket', 'errors': None, 'message_id': '196785218', 'message_thread_id': 'G010000025264A_TOC', 'update_indicator': 'OriginalMessage', 'maintenance_owner': None, 'execution_name': 'execution_name', 'state_machine_name': 'state_machine_name', 'execution_start_time': '2019-03-26T20:14:13.192Z', 'orchard_label': 'TVT Records', 'project_id': 123, 'ddex_provider': 'SME', 'correlation_id': '4ertdgjd56itkcllyighbl', 'has_switchboard_deal': True, } @pytest.fixture def ddex_single_with_excluded_territory(): """DDEX document deserialized into a dict.""" return parse_xml_to_dict('ddex-single-excluded-territories.xml') @pytest.fixture def validation_context(): """State machine input.""" return { 'product': { 'status': None, 'display_artist_name': 'Cool Artist', 'upc': '231232563123', 'product_id': None, 'is_main_release': True, 'release_type': 'release', 'release_reference': 'R0', 'grid': 'A0145345234523453452', 'catalog_number': 'G0134523452345245', 'product_name': 'Test Artist', 'vendor_id': 123, 'subaccount_id': 999, 'genres': [ { 'genre': 'Blues', 'subgenre': 'Acoustic Blues' }, { 'genre': 'R & B', 'subgenre': 'Alternative' }, ], }, 'tracks': [{ 'tuid': None, 'release_reference': 'R1', 'sequence_number': 1, 'release_type': 'TrackRelease', 'volume': 1, 'isrc': 'QZCDB2000001', 'track_name': 'This track', 'resource_reference': 'A1', }], 'project_id': '4498666', 'deals': None, 'bucket': 'ddex-bucket', 'key': 'key', 'message_id': '234524523', 'message_thread_id': 'G014523452345', 'update_indicator': 'OriginalMessage', 'ddex_provider': 'AWAL', } @pytest.fixture def validation_s3_context(): """S3 context fixture.""" return { 'product': { 'vendor_id': 2343234, 'display_artist_name': 'Cool Artist', 'upc': '231232563123', 'is_main_release': True, 'release_type': 'release', 'release_reference': 'R0', 'grid': 'A0145345234523453452', 'catalog_number': 'G0134523452345245', 'product_name': 'Test Artist', 'product_version': 'Instrumental', 'p_line': '2020 Product Pline', 'c_line': '2020 Product Cline', 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist', 'Producer'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [ { 'name': 'english name', 'language_code': 'en' }, { 'name': 'nombre español', 'language_code': 'es' } ] }, { 'apple_id': None, 'roles': ['MainArtist'], 'name': 'Cash Cash', 'sequence_number': 2, 'spotify_uri': None, 'localized_names': [ { 'name': 'english name', 'language_code': 'en' }, { 'name': 'nombre español', 'language_code': 'es' } ] }, { 'apple_id': None, 'roles': ['FeaturedArtist'], 'name': 'Nelly', 'sequence_number': 3, 'spotify_uri': None, } ], 'localized_titles': [ { 'language_code': 'EN', 'title': 'title', 'version': '', }, { 'language_code': 'ES', 'title': 'el título', 'version': '', }, { 'language_code': 'cmn-Hans', 'title': '标题', 'version': '', }, { 'language_code': 'cmn-Hant', 'title': '標題', 'version': '', }, ] }, 'tracks': [ { 'release_reference': 'R1', 'sequence_number': 1, 'release_type': 'TrackRelease', 'volume': 1, 'isrc': 'QZCDB2000001', 'track_name': 'This track', 'resource_reference': 'A1', 'p_line': '2020 track pline', 'localized_titles': [ { 'language_code': 'EN', 'title': 'title', 'version': '', }, { 'language_code': 'ES', 'title': 'el título', 'version': '', }, { 'language_code': 'cmn-Hans', 'title': '标题', 'version': '', }, { 'language_code': 'cmn-Hant', 'title': '標題', 'version': '', }, ], 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist', 'Producer'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [ { 'name': 'english name', 'language_code': 'en' }, { 'name': 'nombre español', 'language_code': 'es' } ] }, { 'apple_id': None, 'roles': ['MainArtist'], 'name': 'Cash Cash', 'sequence_number': 2, 'spotify_uri': None, 'localized_names': [ { 'name': 'english name', 'language_code': 'en' }, { 'name': 'nombre español', 'language_code': 'es' } ] }, ] }, { 'release_reference': 'R2', 'sequence_number': 2, 'release_type': 'TrackRelease', 'volume': 1, 'isrc': 'QZCDB2000002', 'track_name': 'This track 2', 'resource_reference': 'A2', 'p_line': '2020 track pline', 'localized_titles': [ { 'language_code': 'EN', 'title': 'title', 'version': '', }, { 'language_code': 'ES', 'title': 'el título', 'version': '', }, { 'language_code': 'cmn-Hans', 'title': '标题', 'version': '', }, { 'language_code': 'cmn-Hant', 'title': '標題', 'version': '', }, ], 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist', 'Producer'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [ { 'name': 'english name', 'language_code': 'en' }, { 'name': 'nombre español', 'language_code': 'es' } ] }, { 'apple_id': None, 'roles': ['MainArtist'], 'name': 'Cash Cash', 'sequence_number': 2, 'spotify_uri': None, 'localized_names': [ { 'name': 'english name', 'language_code': 'en' }, { 'name': 'nombre español', 'language_code': 'es' } ] }, ] }, ], 'video': { 'release_reference': 'R1', 'assets': [ { 'filename': 'video1.mp4', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/video1.mp4' }, { 'filename': 'video2.mp4', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/video2.mp4' }, ], 'tuid': 45678, 'associated_track_tuid': 45677, 'isrc': 'USSM12001699', 'product_code': 'G010000025264A', 'release_type': 'VideoTrackRelease', 'workflow_id': 1234, 'video_name': 'Before Your Love', 'video_version': 'VIDEO', 'video_type': 'Official Music Video', 'explicit': 'E', 'p_line': {'line': 'SG Productions', 'year': 2018}, 'c_line': {'line': 'SG Productions', 'year': 2018}, 'title_language': 'ENG', 'content_language': 'ENG', 'product_code': 'G010000025264A', 'imprint': '19 Recordings', 'associated_track_isrc': 'TRAIM1800040', 'description': 'Some video description', 'parental_advisory': 'No', 'lyrics': 'Some lyrics', 'keywords': ['keyword1', 'keyword2'], 'genres': [{ 'genre': 'ELECTRONICA-00', 'subgenre': 'POP-00' }], 'display_artists': [ { 'name': 'Kelly Clarkson', 'sequence_number': 1, 'roles': ['Featuring', 'Invalid'] }, { 'name': 'Artist', 'sequence_number': 2, 'roles': ['Director', 'Videographer'] }, ], 'resource_contributors': [{ 'name': 'John', 'sequence_number': 1, 'roles': ['FilmEditor'] }], }, 'deals': [ { 'release_references': ['R1'], 'deal_terms': [ { 'start_date': None, 'start_date_time': '2020-03-27T00:00:00', 'territories': ['AE'], 'commercial_model_types': [ 'AdvertisementSupportedModel' ], 'usage_type': [ 'NonInteractiveStream', 'OnDemandStream', ], 'takedown': None, 'price_type': '1', } ], } ], 'bucket': 'ddex-bucket', 'key': 'key', 'message_id': '234524523', 'message_thread_id': 'G014523452345', 'update_indicator': 'OriginalMessage', 'party_id': 'PADPIDA2007040502I', 'project': { 'project_code': 'FAKE project_code', 'name': 'FAKE name', 'description': 'FAKE description', 'artist': { 'sequence_number': 1, 'name': 'Test', 'spotify_uri': None, 'apple_id': None } } } @pytest.fixture def validation_unparsed_awal_ddex(): """DDEX document.""" with open(os.path.join(DATA_DIR, 'awal_ddex_document_3.xml')) as fd: # noqa return fd.read() @pytest.fixture def validation_unparsed_extended_awal_ddex(): """DDEX document.""" with open(os.path.join(DATA_DIR, 'awal_ddex_document_3_ext.xml')) as fd: # noqa return fd.read() @pytest.fixture def validation_unparsed_awal_ddex_2(): """AWAL DDEX document deserialized into a dict.""" with open(os.path.join(DATA_DIR, 'awal_ddex_document_2.xml')) as fd: # noqa return fd.read() @pytest.fixture def validation_genres(): """Mock result from genres endpoint.""" return { 'data': { 'genres': [ { 'id': 20, 'name': 'Blues', 'subgenres': [ { 'id': 662, 'name': 'Acoustic Blues' }, { 'id': 981, 'name': 'Blues' }, { 'id': 221, 'name': 'Blues Revival' }, { 'id': 222, 'name': 'Blues Rock' }, ] }, { 'id': 13, 'name': "Children's", 'subgenres': [ { 'id': 691, 'name': 'Ancient Tales' }, { 'id': 124, 'name': "Children's" }, { 'id': 163, 'name': 'Circus' }, { 'id': 246, 'name': 'Classical' }, { 'id': 983, 'name': 'Disney' }, ] } ] } } @pytest.fixture def validation_pricing_family_response(): """Mock result from orchardPricingFamily query.""" return { 'data': { 'orchardPricingFamily': [{ 'orchardPricingTiers': [ {'id': '25'}, {'id': '26'}, {'id': '27'} ] }] } } @pytest.fixture def s3_prep_ddex(): """S3 json file.""" return { 'product': { 'display_artist_name': 'Cool Artist', 'upc': '231232563123', 'is_main_release': True, 'release_type': 'release', 'release_reference': 'R0', 'grid': 'A0145345234523453452', 'catalog_number': 'G0134523452345245', 'product_name': 'Test Name', 'p_line': 'Product Pline 2020', 'c_line': 'Product Cline 2020', 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist', 'Producer'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Farm Animals', }], }, { 'apple_id': None, 'roles': ['MainArtist'], 'name': 'Cash Cash', 'sequence_number': 2, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Cash Cash', }], }, { 'apple_id': None, 'roles': ['FeaturedArtist'], 'name': 'Nelly', 'sequence_number': 3, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Nelly', }], } ], 'genres': [ { 'genre': 'ELECTRONICA-00', 'subgenre': 'Alternative' }, { 'genre': 'Rock', 'subgenre': 'Ambient' } ], 'localized_titles': [ { 'language_code': 'fr', 'title': 'French Title', 'version': 'Original' }, { 'language_code': 'ru', 'title': 'Russian Title', 'version': 'Remaster' } ], }, 'tracks': [{ 'release_reference': 'R1', 'sequence_number': 1, 'release_type': 'TrackRelease', 'volume': 1, 'isrc': 'QZCDB2000001', 'track_name': 'This track', 'resource_reference': 'A1', 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist', 'Producer', 'Composer'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Farm Animals', }], }, { 'apple_id': None, 'roles': ['Composer'], 'name': 'Composer Name', 'sequence_number': 2, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Composer Name', }], }, ] }], 'video': { 'release_reference': 'R1', 'assets': [ { 'filename': 'video1.mp4', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/video1.mp4' }, { 'filename': 'video2.mp4', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/video2.mp4' }, ], 'tuid': 45678, 'isrc': 'USSM12001699', 'release_type': 'VideoTrackRelease', 'workflow_id': 1234, 'video_name': 'Before Your Love', 'video_version': 'VIDEO', 'explicit': 'E', 'p_line': {'line': 'SG Productions', 'year': 2018}, 'c_line': {'line': 'SG Productions', 'year': 2018}, 'title_language': 'ENG', 'product_code': 'G010000025264A', 'imprint': '19 Recordings', }, 'deals': [ { 'release_references': ['R1'], 'deal_terms': [ { 'start_date': None, 'start_date_time': '2020-03-27T00:00:00', 'territories': ['AE'], 'commercial_model_types': [ 'AdvertisementSupportedModel' ], 'usage_type': [ 'NonInteractiveStream', 'OnDemandStream', ], 'takedown': None, } ], } ], 'bucket': 'ddex-bucket', 'key': 'key', 'message_id': '234524523', 'message_thread_id': 'G014523452345', 'party_id': 'PADPIDA2012041004F', 'update_indicator': 'OriginalMessage', 'project': { 'project_code': 'FAKE project_code', 'name': 'FAKE name', 'description': 'FAKE description', 'artist': None } } @pytest.fixture def s3_prep_preorder_tracks_ddex(): """S3 json file.""" return { 'product': { 'display_artist_name': 'Cool Artist', 'upc': '231232563123', 'is_main_release': True, 'release_type': 'release', 'release_reference': 'R0', 'grid': 'A0145345234523453452', 'catalog_number': 'G0134523452345245', 'product_name': 'Test Name', 'p_line': 'Product Pline 2020', 'c_line': 'Product Cline 2020', 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist', 'Producer'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Farm Animals', }], }, { 'apple_id': None, 'roles': ['MainArtist'], 'name': 'Cash Cash', 'sequence_number': 2, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Cash Cash', }], }, { 'apple_id': None, 'roles': ['FeaturedArtist'], 'name': 'Nelly', 'sequence_number': 3, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Nelly', }], } ], 'genres': [ { 'genre': 'ELECTRONICA-00', 'subgenre': 'Alternative' }, { 'genre': 'Rock', 'subgenre': 'Ambient' } ], 'localized_titles': [ { 'language_code': 'fr', 'title': 'French Title', 'version': 'Original' }, { 'language_code': 'ru', 'title': 'Russian Title', 'version': 'Remaster' } ], }, 'tracks': [ { 'release_reference': 'R1', 'sequence_number': 1, 'release_type': 'TrackRelease', 'volume': 1, 'isrc': 'QZCDB2000001', 'track_name': 'This track', 'resource_reference': 'A1', 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Farm Animals', }], } ] }, { 'release_reference': 'R2', 'sequence_number': 2, 'release_type': 'TrackRelease', 'volume': 1, 'isrc': 'QZCDB2000001', 'track_name': 'This track', 'resource_reference': 'A2', 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Farm Animals', }], } ] }, { 'release_reference': 'R3', 'sequence_number': 3, 'release_type': 'TrackRelease', 'volume': 1, 'isrc': 'QZCDB2000001', 'track_name': 'This track', 'resource_reference': 'A3', 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Farm Animals', }], } ] }, { 'release_reference': 'R4', 'sequence_number': 4, 'release_type': 'TrackRelease', 'volume': 1, 'isrc': 'QZCDB2000001', 'track_name': 'This track', 'resource_reference': 'A4', 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Farm Animals', }], } ] }, { 'release_reference': 'R5', 'sequence_number': 5, 'release_type': 'TrackRelease', 'volume': 1, 'isrc': 'QZCDB2000001', 'track_name': 'This track', 'resource_reference': 'A5', 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Farm Animals', }], } ] }, { 'release_reference': 'R6', 'sequence_number': 6, 'release_type': 'TrackRelease', 'volume': 1, 'isrc': 'QZCDB2000001', 'track_name': 'This track', 'resource_reference': 'A6', 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Farm Animals', }], } ] }, { 'release_reference': 'R7', 'sequence_number': 7, 'release_type': 'TrackRelease', 'volume': 1, 'isrc': 'QZCDB2000001', 'track_name': 'This track', 'resource_reference': 'A7', 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Farm Animals', }], } ] }, ], 'video': { 'release_reference': 'R1', 'assets': [ { 'filename': 'video1.mp4', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/video1.mp4' }, { 'filename': 'video2.mp4', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/video2.mp4' }, ], 'tuid': 45678, 'isrc': 'USSM12001699', 'release_type': 'VideoTrackRelease', 'workflow_id': 1234, 'video_name': 'Before Your Love', 'video_version': 'VIDEO', 'explicit': 'E', 'p_line': {'line': 'SG Productions', 'year': 2018}, 'c_line': {'line': 'SG Productions', 'year': 2018}, 'title_language': 'ENG', 'product_code': 'G010000025264A', 'imprint': '19 Recordings', }, 'deals': [ { 'release_references': ['R1'], 'deal_terms': [ { 'start_date': None, 'start_date_time': '2020-03-27T00:00:00', 'territories': ['AE'], 'commercial_model_types': [ 'AdvertisementSupportedModel' ], 'usage_type': [ 'NonInteractiveStream', 'OnDemandStream', ], 'takedown': None, } ], } ], 'bucket': 'ddex-bucket', 'key': 'key', 'message_id': '234524523', 'message_thread_id': 'G014523452345', 'party_id': 'PADPIDA2012041004F', 'update_indicator': 'OriginalMessage', 'project': { 'project_code': 'FAKE project_code', 'name': 'FAKE name', 'description': 'FAKE description', 'artist': None } } @pytest.fixture def s3_prep_ddex_artists(): """S3 json file.""" return { 'product': { 'display_artist_name': 'Cool Artist', 'upc': '231232563123', 'is_main_release': True, 'release_type': 'release', 'release_reference': 'R0', 'grid': 'A0145345234523453452', 'catalog_number': 'G0134523452345245', 'product_name': 'Test Name', 'p_line': 'Product Pline 2020', 'c_line': 'Product Cline 2020', 'display_artists': [ { 'apple_id': None, 'roles': ['MainArtist', 'Producer'], 'name': 'Digital Farm Animals', 'sequence_number': 1, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Farm Animals', }], }, { 'apple_id': None, 'roles': ['MainArtist'], 'name': 'Cash Cash', 'sequence_number': 2, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Cash Cash', }], }, { 'apple_id': None, 'roles': ['FeaturedArtist'], 'name': 'Nelly', 'sequence_number': 3, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Nelly', }], } ], 'genres': [ { 'genre': 'ELECTRONICA-00', 'subgenre': 'Alternative' }, { 'genre': 'Rock', 'subgenre': 'Ambient' } ], 'localized_titles': [ { 'language_code': 'fr', 'title': 'French Title', 'version': 'Original' }, { 'language_code': 'ru', 'title': 'Russian Title', 'version': 'Remaster' } ], }, 'tracks': [{ 'release_reference': 'R1', 'sequence_number': 1, 'release_type': 'TrackRelease', 'volume': 1, 'isrc': 'QZCDB2000001', 'track_name': 'This track', 'resource_reference': 'A1', 'display_artists': [ {'name': 'Various Artists', 'sequence_number': 1, 'spotify_uri': None, 'apple_id': None, 'roles': ['AssociatedPerformer', 'MainArtist'], 'localized_names': []}, { 'apple_id': None, 'roles': ['Composer'], 'name': 'Composer Name', 'sequence_number': 2, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Composer Name', }], }, { 'apple_id': None, 'name': 'Artisti Vari', 'sequence_number': 3, 'spotify_uri': None, 'localized_names': [{ 'language_code': 'ru', 'name': 'Russian Composer Name', }], }, ], 'resource_contributors': [ { 'name': 'Emile Hartkamp', 'sequence_number': 1, 'roles': [ 'BackgroundVocal', ], }, { 'name': 'Various Artists', 'sequence_number': 9, 'roles': [ 'Producer' ], 'localized_names': [ { 'language_code': 'JA-JPAN', 'name': 'Various Artists' } ] }]}], 'video': { 'release_reference': 'R1', 'assets': [ { 'filename': 'video1.mp4', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/video1.mp4' }, { 'filename': 'video2.mp4', 'filepath': 'resources/', 'bucket': 'ddex-bucket', 'key': 'folder/subfolder/resources/video2.mp4' }, ], 'tuid': 45678, 'isrc': 'USSM12001699', 'release_type': 'VideoTrackRelease', 'workflow_id': 1234, 'video_name': 'Before Your Love', 'video_version': 'VIDEO', 'explicit': 'E', 'p_line': {'line': 'SG Productions', 'year': 2018}, 'c_line': {'line': 'SG Productions', 'year': 2018}, 'title_language': 'ENG', 'product_code': 'G010000025264A', 'imprint': '19 Recordings', }, 'deals': None, 'bucket': 'ddex-bucket', 'key': 'key', 'message_id': '234524523', 'message_thread_id': 'G014523452345', 'party_id': 'PADPIDA2012041004F', 'update_indicator': 'OriginalMessage', 'project': { 'project_code': 'FAKE project_code', 'name': 'FAKE name', 'description': 'FAKE description', 'artist': None } } @pytest.fixture def s3_prep_ddex_multiple_spotify_uri(): """S3 json file.""" return {'project': {'name': 'Follow Her', 'project_code': '1593389', 'description': None, 'artist': {'name': 'Blaqbonez feat. Kizz Daniel', 'sequence_number': 1, 'spotify_uri': 'test_1', 'apple_id': None, 'roles': None, 'localized_names': None}, 'marketing_highlights': None}, 'product': {'upc': '196873137155', 'is_main_release': True, 'release_type': 'Single', 'artwork': None, 'release_reference': 'R0', 'sale_start_date': None, 'original_release_date': '2025-05-02', 'grid': 'A10301A0005520932N', 'catalog_number': 'G010005520932N', 'display_artist_name': 'Blaqbonez feat. Kizz Daniel', 'product_name': 'Follow Her', 'display_artists': [{'name': 'Blaqbonez', 'sequence_number': 1, 'spotify_uri': 'test_2', 'apple_id': None, 'roles': ['MainArtist'], 'localized_names': []}, {'name': 'Kizz Daniel', 'sequence_number': 2, 'spotify_uri': 'test_3', 'apple_id': None, 'roles': ['FeaturedArtist'], 'localized_names': []}], 'metadata_language': 'ENG', 'product_version': None, 'genres': [{'genre': 'Afrobeats', 'subgenre': None}, {'genre': 'Afro Pop', 'subgenre': None}], 'is_confidential': False}, 'tracks': [ {'isrc': 'QMEU32506588', 'release_type': 'TrackRelease', 'sequence_number': 1, 'volume': 1, 'asset': None, 'explicit': 'Y', 'recording_country_code': 'NG', 'us_publishing_obligation': 'HUNDREDPERCENTCONTROLLED', 'publishers': ['Electric Field'], 'display_artists': [{'name': 'Blaqbonez', 'sequence_number': 1, 'spotify_uri': 'spotify:artist:12kjvw4e3gLp6qVHO65n7W', 'apple_id': None, 'roles': ['AssociatedPerformer', 'MainArtist'], 'localized_names': []}, {'name': 'Kizz Daniel', 'sequence_number': 2, 'spotify_uri': 'spotify:artist:1X6cBGnXpEpN7CmflLKmLV', 'apple_id': None, 'roles': ['AssociatedPerformer', 'FeaturedArtist'], 'localized_names': []}], 'copyright_owner_country': 'NG', 'localized_titles': [], 'preview_start_time': None, 'resource_reference': 'A1', 'content_type': 'Music with vocals', 'offer_type': None, 'is_instrumental': False}], 'video': None, 'bucket': 'qwe', 'key': 'sme_analytics_ddex/qwe/', 'message_id': '355801802', 'message_thread_id': 'qwe', 'party_id': 'qwe', 'update_indicator': 'UpdateMessage', 'execution_name': 'qwe-e85d-4083-8330-9d9d6aaafb17', 'state_machine_name': 'qwer-sfn', 'execution_start_time': '2025-05-06T08:00:05.769Z'}