"""Test parse_ddex handler.""" from unittest.mock import call, MagicMock, patch import boto3 import botocore from ddex_ingester_common.utils.read_ddex import combine_ddex_documents, \ extract_extended_doc, extract_extended_metadata_location, \ get_is_purged_release, read_ddex from moto import mock_aws import pytest from tests.conftest import parse_xml_to_dict def test_ddex_extract_metadata(read_ddex_ddex_document): """Test that extended metadata file location can be extracted.""" expected_file_name = 'ORCHARD_EXTENDED_METADATA_A10301A0003223165V.xml' ddex_resources = read_ddex_ddex_document['ernm:NewReleaseMessage'][ 'ResourceList'] ddex_text = ddex_resources['Text'][1]['TextDetailsByTerritory'] assert ddex_text assert ddex_text['TechnicalTextDetails']['File']['FileName'] == \ expected_file_name def test_combine_ddex_documents( read_ddex_ddex_document, read_ddex_extended_metadata, read_ddex_combined_ddex_documents ): """Test that ddex documents are combined properly.""" combined_doc = combine_ddex_documents( read_ddex_ddex_document, read_ddex_extended_metadata ) assert combined_doc == read_ddex_combined_ddex_documents def test_extract_metadata_location(read_ddex_ddex_document): """Test that multiple elements are properly handled.""" logger = MagicMock() key = 'sme_ddex/A10301A00034438105/A10301A00034438105.xml' expected_response = 'sme_ddex/A10301A00034438105/resources/ORCHARD_EXTENDED_METADATA_A10301A0003223165V.xml' # noqa response = extract_extended_metadata_location( key, read_ddex_ddex_document, logger ) assert response == expected_response @pytest.mark.parametrize('document,root', [ ('read_ddex_ddex_document', 'ernm:NewReleaseMessage'), ('read_ddex_awal_ddex_document', 'ern:NewReleaseMessage') ]) def test_extract_metadata_location_no_file(document, root, request): """Test that no location is properly handled.""" logger = MagicMock() ddex_document = request.getfixturevalue(document) ddex_document[root]['ResourceList']['Text'] = None key = 'sme_ddex/A10301A00034438105/A10301A00034438105.xml' response = extract_extended_metadata_location( key, ddex_document, logger ) assert not response def test_get_is_purged_release_with_takedown(read_ddex_awal_ddex_takedown): """Test get_is_purged_release detects TakeDown.""" logger = MagicMock() deal_terms = read_ddex_awal_ddex_takedown['ernm:NewReleaseMessage'][ 'DealList'] assert get_is_purged_release('', deal_terms, logger) def test_get_is_purged_release_no_takedown(read_ddex_ddex_document): """Test get_is_purged_release with no TakeDown set.""" logger = MagicMock() deal_terms = read_ddex_ddex_document['ernm:NewReleaseMessage']['DealList'] assert not get_is_purged_release('', deal_terms, logger) def test_get_is_purged_release_no_takedown_audio( read_ddex_awal_ddex_audio_takedown): """Test get_is_purged_release with no TakeDown set.""" logger = MagicMock() deal_terms = read_ddex_awal_ddex_audio_takedown['ern:NewReleaseMessage'][ 'DealList'] assert get_is_purged_release('', deal_terms, logger) @patch( 'ddex_ingester_common.utils.read_ddex.extract_extended_metadata_location') @patch('ddex_ingester_common.utils.read_ddex.extract_extended_doc') @patch('ddex_ingester_common.utils.read_ddex.xmltodict') @pytest.mark.parametrize( 'file, expected_result', [ ('extended_metadata_confidential_false.xml', False), ('extended_metadata_confidential_None.xml', False), ('extended_metadata_confidential_true.xml', True) ] ) def test_is_confidential_added_using_ext_meta(mock_xmltodict, mock_extract_extended_doc, mock_extended_metadata_location, file, expected_result, read_ddex_ddex_document): """Test is_confidential field is added to doc.""" logger = MagicMock() s3_mock = MagicMock() s3_mock.get_object().get('Body').read.return_value = MagicMock() mock_xmltodict.parse.return_value = read_ddex_ddex_document mock_extended_metadata_location.return_value = file mock_extract_extended_doc.return_value = \ parse_xml_to_dict(f'read_ddex/{file}') doc = read_ddex(s3_mock, 'test_bucket', 'test_key', logger) assert doc.product.is_confidential == expected_result @mock_aws @patch('time.sleep', return_value=None) def test_extract_extended_doc(sleep_mock): """Test retries for extract_extended_doc.""" logger = MagicMock() bucket_name = 'test_bucket' extended_metadata_key = 'extended_metadata_key.xml' s3_client = boto3.client('s3') s3_client.create_bucket(Bucket=bucket_name) try: extract_extended_doc(logger, s3_client, bucket_name, extended_metadata_key) except botocore.exceptions.ClientError as error: print(error) sleep_mock.assert_has_calls([call(10), call(20), call(30)]) @patch( 'ddex_ingester_common.utils.read_ddex.extract_extended_metadata_location') @patch('ddex_ingester_common.utils.read_ddex.extract_extended_doc') @patch('ddex_ingester_common.utils.read_ddex.xmltodict') def test_ddex_read_with_missing_project_in_ext_meta( mock_xmltodict, mock_extract_extended_doc, mock_extended_metadata_location, read_ddex_missing_project, read_extended_metadata_missing_project): """Test read ddex with missing project in extended metadata.""" logger = MagicMock() s3_mock = MagicMock() mock_xmltodict.parse.return_value = read_ddex_missing_project mock_extract_extended_doc.return_value = \ read_extended_metadata_missing_project doc = read_ddex(s3_mock, 'test_bucket', 'test_key', logger) assert doc.project.project_code == '5099767535219' assert doc.project.name == 'Värsta grymma tjejen' assert doc.project.artist.name == 'Magnus Uggla' @patch( 'ddex_ingester_common.utils.read_ddex.extract_extended_metadata_location') @patch('ddex_ingester_common.utils.read_ddex.extract_extended_doc') @patch('ddex_ingester_common.utils.read_ddex.xmltodict') def test_ddex_read_with_missing_project_artist_in_ext_meta( mock_xmltodict, mock_extract_extended_doc, mock_extended_metadata_location, read_ddex_missing_project, read_extended_metadata_missing_project_artist): """Test read ddex with missing project in extended metadata.""" logger = MagicMock() s3_mock = MagicMock() mock_xmltodict.parse.return_value = read_ddex_missing_project mock_extract_extended_doc.return_value = \ read_extended_metadata_missing_project_artist doc = read_ddex(s3_mock, 'test_bucket', 'test_key', logger) assert doc.project.project_code == '5099767535219' assert doc.project.name == 'The Search for Everything' assert doc.project.artist.name == 'Magnus Uggla'