"""Test prep_sme_ddex handler.""" from unittest.mock import patch from constants.genre import SME_ANALYTICS_PROVIDER_GENRE_ID, \ SME_ANALYTICS_PROVIDER_SUBGENRE_ID from ddex_ingester_common.constants.ddex_providers import \ SME, SME_ANALYTICS_PROVIDER, SOM_LIVRE_VENDOR_ID from ddex_ingester_common.schemas.s3_schema import S3Schema import index import pytest @patch('index.genre_mapping_util.get_orchard_genre_mapping_for_itunes') @patch('index.load_ddex_json') @patch('index.save_s3_context') @patch('index.is_ccm_som_livre_grps_ddex_ingestion_enabled') def test_handler( mock_is_ccm_som_livre_grps_ddex_ingestion_enabled, mock_save_s3_context, mock_load_ddex_json, mock_genre_mapping, context_object, s3_ddex): """Test handler.""" mock_is_ccm_som_livre_grps_ddex_ingestion_enabled.return_value = True mock_load_ddex_json.return_value = s3_ddex mock_genre_mapping.return_value = { 'genre_id': 20, 'subgenre_id': 662 } context = index.handler(context_object, None) assert context['product']['genre_id'] == 20 assert context['product']['subgenre_id'] == 662 assert context['ddex_provider'] == 'SME' @patch('index.load_ddex_json') @patch('index.save_s3_context') @patch('index.is_ccm_som_livre_grps_ddex_ingestion_enabled') def test_handler_genre_mapping_itunes( mock_is_ccm_som_livre_grps_ddex_ingestion_enabled, mock_save_s3_context, mock_load_ddex_json, context_object, s3_ddex): """Test handler for genre mapping with iTunes genre.""" mock_is_ccm_som_livre_grps_ddex_ingestion_enabled.return_value = True mock_load_ddex_json.return_value = s3_ddex s3_ddex['product']['genres'][0]['genre'] = 'R-B-SOUL-00' context = index.handler(context_object, None) assert context['product']['genre_id'] == 25 assert context['product']['subgenre_id'] == 187 assert context['ddex_provider'] == 'SME' @patch('index.load_ddex_json') @patch('index.save_s3_context') @patch('index.is_ccm_som_livre_grps_ddex_ingestion_enabled') @patch('helpers.genre_mapping.get_genre_and_subgenre_for_grps_rows') def test_handler_genre_mapping_grps( mock_get_genre_and_subgenre_for_grps_rows, mock_is_ccm_som_livre_grps_ddex_ingestion_enabled, mock_save_s3_context, mock_load_ddex_json, context_object, s3_ddex): """Test handler for genre mapping with GRPS genre.""" mock_get_genre_and_subgenre_for_grps_rows.return_value = [{ 'genre_id': 11, 'subgenre_id': 1086 }] mock_is_ccm_som_livre_grps_ddex_ingestion_enabled.return_value = True mock_load_ddex_json.return_value = s3_ddex s3_ddex['product']['genres'][0]['genre'] = 'Cumbia Sonidera' context = index.handler(context_object, None) assert context['product']['genre_id'] == 11 assert context['product']['subgenre_id'] == 1086 assert context['ddex_provider'] == 'SME' @patch('index.load_ddex_json') @patch('index.save_s3_context') @patch('index.is_ccm_som_livre_grps_ddex_ingestion_enabled') @patch('helpers.genre_mapping.get_genre_and_subgenre_for_grps_rows') @patch('helpers.genre_mapping.get_default_genre_and_subgenre_for_major_label') @pytest.mark.parametrize('ddex_provider', [ SME, SME_ANALYTICS_PROVIDER]) def test_handler_genre_mapping_grps_no_genre( mock_get_default_genre_and_subgenre_for_major_label, mock_get_genre_and_subgenre_for_grps_rows, mock_is_ccm_som_livre_grps_ddex_ingestion_enabled, mock_save_s3_context, mock_load_ddex_json, context_object, s3_ddex, ddex_provider): """Test handler for default mapping with no given GRPS genre.""" mock_get_default_genre_and_subgenre_for_major_label.return_value = [{ 'genre_id': 11, 'subgenre_id': 133 }] mock_get_genre_and_subgenre_for_grps_rows.return_value = None mock_is_ccm_som_livre_grps_ddex_ingestion_enabled.return_value = True mock_load_ddex_json.return_value = s3_ddex s3_ddex['product']['genres'][0]['genre'] = 'UnknownGenre' s3_ddex['product']['subaccount_id'] = 1 context_object['ddex_provider'] = ddex_provider context = index.handler(context_object, None) # Currently defaults to World Music / Brazilian assert context['product']['genre_id'] == 11 assert context['product']['subgenre_id'] == 133 assert context['ddex_provider'] == ddex_provider expected_exception = ('The GRPS genre was unable to be mapped ' + 'so a default was chosen.') assert context['warnings'] == [{ 'field': 'genre', 'warning_type': 'GenreMappingNotFoundException', 'exception': expected_exception }] @patch('index.genre_mapping_util.get_orchard_genre_mapping') @patch('index.load_ddex_json') @patch('index.save_s3_context') @patch('index.is_ccm_som_livre_grps_ddex_ingestion_enabled') def test_handler_duplicate_japanese_codes( mock_is_ccm_som_livre_grps_ddex_ingestion_enabled, mock_save_s3_context, mock_load_ddex_json, mock_genre_mapping, context_object, s3_ddex_japanese_localizations): """Test handler with Japanese duplicate language codes.""" mock_is_ccm_som_livre_grps_ddex_ingestion_enabled.return_value = True expected_lang_codes = ['RU', 'JA-JPAN'] mock_load_ddex_json.return_value = s3_ddex_japanese_localizations index.handler(context_object, None) mock_save_s3_context.assert_called_once() s3_context = mock_save_s3_context.call_args[0][1] product_title_lang_codes = [ localized_title.language_code.upper() for localized_title in s3_context.product.localized_titles ] for display_artist in s3_context.product.display_artists: display_artist_lang_codes = [ localized_name.language_code.upper() for localized_name in display_artist.localized_names ] assert display_artist_lang_codes == expected_lang_codes, 'Product display artist has mismatching lang codes' # noqa for track in s3_context.tracks: track_title_lang_codes = [ localized_title.language_code.upper() for localized_title in track.localized_titles ] for artist in track.display_artists: track_artist_lang_codes = [ localized_name.language_code.upper() for localized_name in artist.localized_names ] assert track_artist_lang_codes == expected_lang_codes, 'Track artist has mismatching lang codes' # noqa assert track_title_lang_codes == expected_lang_codes, 'Track title has mismatching lang codes' # noqa assert product_title_lang_codes == expected_lang_codes, 'Product title has mismatching lang codes' # noqa @patch('index.load_ddex_json') @patch('index.save_s3_context') @patch('index.is_ccm_som_livre_grps_ddex_ingestion_enabled') @patch('helpers.genre_mapping.get_genre_and_subgenre_for_grps_rows') def test_handler_genre_mapping_default_genre_sme_analytics( mock_get_genre_and_subgenre_for_grps_rows, mock_is_ccm_som_livre_grps_ddex_ingestion_enabled, mock_save_s3_context, mock_load_ddex_json, context_object, s3_ddex): """Test handler for default mapping for sme_analytics.""" mock_get_genre_and_subgenre_for_grps_rows.return_value = None mock_is_ccm_som_livre_grps_ddex_ingestion_enabled.return_value = True mock_load_ddex_json.return_value = s3_ddex s3_ddex['product']['genres'][0]['genre'] = 'UnknownGenre' context_object['ddex_provider'] = SME_ANALYTICS_PROVIDER context = index.handler(context_object, None) assert context['product']['genre_id'] == SME_ANALYTICS_PROVIDER_GENRE_ID assert context['product']['subgenre_id'] == SME_ANALYTICS_PROVIDER_SUBGENRE_ID # noqa assert context['ddex_provider'] == SME_ANALYTICS_PROVIDER expected_exception = ('We could not map the GRPS genre "UnknownGenre"' ' so we defaulted the product to Pop/Pop') assert context['warnings'] == [{ 'field': 'genre', 'warning_type': 'GenreMappingNotFoundException', 'exception': expected_exception }] @patch('index.genre_mapping_util.get_orchard_genre_mapping_for_itunes') @patch('index.load_ddex_json') @patch('index.save_s3_context') @patch('index.is_ccm_som_livre_grps_ddex_ingestion_enabled') @pytest.mark.parametrize( 'artwork_ingestion_only, tracks_empty', [ (True, True), (False, False), ] ) def test_artwork_ingestion_only( mock_is_ccm_som_livre_grps_ddex_ingestion_enabled, mock_save_s3_context, mock_load_ddex_json, mock_genre_mapping, context_object, s3_ddex, artwork_ingestion_only, tracks_empty): """Test handler.""" mock_is_ccm_som_livre_grps_ddex_ingestion_enabled.return_value = True context_object['artwork_ingestion_only'] = artwork_ingestion_only context_object['ddex_provider'] = SME_ANALYTICS_PROVIDER s3_ddex['ddex_provider'] = SME_ANALYTICS_PROVIDER s3_ddex['product']['is_confidential'] = True mock_load_ddex_json.return_value = s3_ddex context = index.handler(context_object, None) assert (context['tracks'] == []) == tracks_empty def test_convert_duration_str_to_seconds(): """Test converting duration string to seconds.""" duration_string = 'PT0H23M19S' expected_seconds = 1399 result = index.convert_duration_str_to_seconds(duration_string) assert result == expected_seconds @patch('index.load_ddex_json') @patch('index.save_s3_context') @patch('index.is_ccm_som_livre_grps_ddex_ingestion_enabled') def test_handler_som_livre_release_type( mock_is_ccm_som_livre_grps_ddex_ingestion_enabled, mock_save_s3_context, mock_load_ddex_json, context_object, s3_ddex): """Test handler for updating release type for Som Livre.""" mock_is_ccm_som_livre_grps_ddex_ingestion_enabled.return_value = True mock_load_ddex_json.return_value = s3_ddex # Update vendor to Som Livre for test s3_ddex['product']['vendor_id'] = SOM_LIVRE_VENDOR_ID context = index.handler(context_object, None) # Check that release type 'Album' is overwritten by Som Livre rules to 'EP' assert context['product']['release_type'] == 'EP' def test_add_product_level_producers(s3_ddex): """Test add_product_level_producers.""" s3_ddex['product']['display_artists'] = [ { 'name': 'Luccas Carlos', 'sequence_number': 1, 'spotify_uri': None, 'apple_id': None, 'roles': [ 'MainArtist' ], 'localized_names': [] } ] s3_ddex['tracks'][0]['display_artists'] = [ { 'name': 'Luccas Carlos', 'sequence_number': 1, 'spotify_uri': None, 'apple_id': None, 'roles': [ 'MainArtist', 'Producer' ], 'localized_names': [] }, { 'name': 'Carlos Luccas', 'sequence_number': 2, 'spotify_uri': None, 'apple_id': None, 'roles': ['Producer'], 'localized_names': [] } ] s3_context = S3Schema().load(s3_ddex) index.add_product_level_producers(s3_context) assert len(s3_context.product.display_artists) == 2 assert 'Producer' in s3_context.product.display_artists[0].roles assert 'Producer' in s3_context.product.display_artists[1].roles def test_add_product_level_remixers(s3_ddex): """Test add_product_level_remixers.""" s3_ddex['product']['display_artists'] = [ { 'name': 'Luccas Carlos', 'sequence_number': 1, 'spotify_uri': None, 'apple_id': None, 'roles': [ 'MainArtist' ], 'localized_names': [] } ] s3_ddex['tracks'][0]['display_artists'] = [ { 'name': 'Luccas Carlos', 'sequence_number': 1, 'spotify_uri': None, 'apple_id': None, 'roles': [ 'MainArtist', 'Remixer' ], 'localized_names': [] }, { 'name': 'Carlos Luccas', 'sequence_number': 2, 'spotify_uri': None, 'apple_id': None, 'roles': ['Remixer'], 'localized_names': [] } ] s3_context = S3Schema().load(s3_ddex) index.add_product_level_remixers(s3_context) assert len(s3_context.product.display_artists) == 2 assert 'Remixer' in s3_context.product.display_artists[0].roles assert 'Remixer' in s3_context.product.display_artists[1].roles