"""Test parse_ddex handler.""" import json from unittest.mock import MagicMock from unittest.mock import patch from common.lambda_exceptions import AudioException from lambdacommon.graphql.graphql import GraphQLError import pytest from src.index import construct_s3_metadata from src.index import handle_track_asset from src.index import handler def test_construct_s3_metadata(loaded_json): """Test s3 metadata formatting.""" output = construct_s3_metadata(loaded_json.product, loaded_json.product.track) assert output['asset_type'] == 'WAV' assert output['product_id'] == str(loaded_json.product.product_id) assert output['upc'] == loaded_json.product.upc assert output['track_unique_id'] == loaded_json.product.track.tuid assert output['original_filename'] == loaded_json.product.track.filename assert output['is_correction'] == '0' @patch('src.index.config.get_current_logger') @patch('src.index.create_asset_token') @patch('src.index.copy_asset') @patch('src.index.graphql_gateway') def test_handler(mock_graphql_gateway, mock_copy_asset, mock_create_asset_token, mock_logger, context_json_audio, loaded_json): """Test handler.""" filename = '12345678-abcdefgh' token = 'token' bucket = 'test-bucket' mock_create_asset_token.return_value = { 'filename': filename, 'credentials': { 'token': token }, 'bucket': bucket } handler(json.loads(context_json_audio), None) mock_create_asset_token.assert_called_once_with( mock_graphql_gateway, 'audio') mock_copy_asset.assert_called_once() @patch('src.index.config.get_current_logger') @patch('src.index.create_asset_token') @patch('src.index.copy_asset') @patch('src.index.graphql_gateway') def test_handler_v2( mock_graphql_gateway, mock_copy_asset, mock_create_asset_token, mock_logger, context_json_audio, loaded_json): """Test handler.""" filename = '12345678-abcdefgh' token = 'token' bucket = 'test-bucket' mock_create_asset_token.return_value = { 'filename': filename, 'credentials': { 'token': token }, 'bucket': bucket } handler(json.loads(context_json_audio), None) mock_create_asset_token.assert_called_once_with( mock_graphql_gateway, 'audio') @patch('src.index.config.get_current_logger') @patch('src.index.load_bulk_asset_json') def test_exception_raised_when_tuid_missing(mock_load_bulk_asset_json, mock_logger, context_json_audio, loaded_json): """Test handler raises AudioException when no TUID.""" loaded_json.product.track.tuid = None mock_load_bulk_asset_json.return_value = loaded_json with pytest.raises(AudioException): handle_track_asset(json.loads(context_json_audio)) @patch('src.index.config.get_current_logger') @patch('src.index.create_asset_token') @patch('src.index.graphql_gateway') def test_handler_create_token_fails( mock_graphql_gateway, mock_create_asset_token, mock_logger, context_json_audio): """Test handler.""" filename = '12345678-abcdefgh' token = 'token' bucket = 'test-bucket' mock_create_asset_token.return_value = { 'filename': filename, 'credentials': { 'token': token }, 'bucket': bucket } mock_create_asset_token.side_effect = GraphQLError( [ { 'message': 'Mock GraphQL Error' } ] ) mock_log_error = MagicMock() mock_logger.return_value = mock_log_error with pytest.raises(GraphQLError): handler(json.loads(context_json_audio), None) mock_log_error.error.assert_called_once() @patch('src.index.config.get_current_logger') @patch('src.index.create_asset_token') @patch('src.index.copy_asset') @patch('src.index.graphql_gateway') def test_handler_copy_asset_fails( mock_graphql_gateway, mock_copy_asset, mock_create_asset_token, mock_logger, context_json_audio): """Test handler when copying asset fails.""" filename = '12345678-abcdefgh' token = 'token' bucket = 'test-bucket' mock_create_asset_token.return_value = { 'filename': filename, 'credentials': { 'token': token }, 'bucket': bucket } mock_copy_asset.side_effect = Exception() mock_log_error = MagicMock() mock_logger.return_value = mock_log_error with pytest.raises(Exception): handler(json.loads(context_json_audio), None) mock_log_error.error.assert_called_once()