"""Test handler.""" import json from unittest.mock import call, patch from ddex_ingester_common.helpers.catalog_ingestion import ( CatalogIngestionValidationResult ) import index @patch('index.get_release_track_list') @patch('index.graphql_gateway.execute') @patch('index.config.catalog_ingestion_session') def test_handler_with_errors( mock_catalog_ingestion_session, mock_graphql, mock_retrieve_release, test_release_json): """Test handler.""" release_idx_dict = json.loads(test_release_json)['7892920191004_____1362655'] # noqa mock_retrieve_release.return_value = release_idx_dict graphql_return = { 'data': { 'product': { 'validation': { 'isValid': False, 'errors': [ { 'code': 'RELEASE_DATE_REQUIRED', 'reason': "'release_date' is a required property" }, { 'code': 'SALE_START_DATE_REQUIRED', 'reason': "'sale_start_date' is a required property" # noqa } ], }, 'tracks': [{ 'isrc': 'ABC123', 'validation': { 'isValid': False, 'errors': [ { 'code': 'TRACK_NAME_VERSION_ALREADY_IN_USE', 'reason': 'Track Name + Version already used in a previous track' # noqa }, { 'code': 'MISSING_OWNERSHIP_RIGHTS', 'reason': 'Field `ownership_rights` is required' # noqa }, { 'code': 'MISSING_WRITERS', 'reason': 'Field `writers` is required' }, ], }, }], } } } expected_calls = [ call([ CatalogIngestionValidationResult( state_machine_name='hardcoded_machine_name', state_machine_execution_name='hardcoded_execution_name', validation_rule_id=0, response='Warning', message="'release_date' is a required property", isrc=None, category='RELEASE_DATE_REQUIRED'), CatalogIngestionValidationResult( state_machine_name='hardcoded_machine_name', state_machine_execution_name='hardcoded_execution_name', validation_rule_id=0, response='Warning', message="'sale_start_date' is a required property", isrc=None, category='SALE_START_DATE_REQUIRED'), ]), call([ CatalogIngestionValidationResult( state_machine_name='hardcoded_machine_name', state_machine_execution_name='hardcoded_execution_name', validation_rule_id=0, response='Warning', message='Track Name + Version already used in a previous track', # noqa isrc='ABC123', category='TRACK_NAME_VERSION_ALREADY_IN_USE'), CatalogIngestionValidationResult( state_machine_name='hardcoded_machine_name', state_machine_execution_name='hardcoded_execution_name', validation_rule_id=0, response='Warning', message='Field `ownership_rights` is required', isrc='ABC123', category='MISSING_OWNERSHIP_RIGHTS'), CatalogIngestionValidationResult( state_machine_name='hardcoded_machine_name', state_machine_execution_name='hardcoded_execution_name', validation_rule_id=0, response='Warning', message='Field `writers` is required', isrc='ABC123', category='MISSING_WRITERS') ]), ] mock_graphql.return_value = graphql_return index.handler({'validate_product': True}, None) calls = mock_catalog_ingestion_session.add.call_args_list assert calls == expected_calls def test_flatten_product_errors(): """Test flatten_errors for product.""" errors = [ [ { 'code': 'ARTWORK', 'reason': 'Artwork has not been uploaded successfully.' } ], ] errors = index.flatten_errors(errors) assert errors == [ 'Artwork has not been uploaded successfully.', ] def test_flatten_track_errors(): """Test flatten_errors for tracks.""" errors = [ [ { 'code': 'MISSING_AUDIO_FILE', 'reason': 'Field `audio_file` is required' }, { 'code': 'MISSING_BOTH_CHINESE_LANGUAGES', 'reason': 'Simplified and Traditional variations are required' } ] ] errors = index.flatten_errors(errors, 'US34523452435') assert errors == [ 'ISRC: US34523452435: Field `audio_file` is required', 'ISRC: US34523452435: Simplified and Traditional variations are required' # noqa ]