"""Test handler.""" import json from unittest.mock import MagicMock from unittest.mock import patch from common.lambda_exceptions import SetTrackMetadataException from helpers.bulk_asset import load_graphql_product_result from lambdacommon.graphql.graphql import GraphQLError import pytest from src import index @patch('src.index.get_product_metadata') def test_load_graphql_product_result( mock_get_product_metadata, test_graphql_response, test_load_product_response): """Test load_graphql_product_result.""" response = load_graphql_product_result(test_graphql_response) assert response == test_load_product_response @pytest.mark.parametrize( 'event,test_response', [ ('context_json_artwork', 'artwork_response'), ('context_json_audio', 'audio_response') ]) @patch('src.index.config.get_current_logger') @patch('src.index.get_product_metadata') @patch('src.index.boto3.client') def test_handler( mock_boto3_client, mock_get_product_metadata, mock_current_logger, event, test_response, test_fileobj, test_graphql_response, request): """Test the main handler.""" mock_event = request.getfixturevalue(event) mock_s3_client = MagicMock(name='get_object') mock_fileobject = MagicMock(name='read') mock_fileobject.read.return_value = test_fileobj # noqa mock_s3_client.get_object.return_value = { 'Body': mock_fileobject } mock_boto3_client.return_value = mock_s3_client mock_get_product_metadata.return_value = test_graphql_response response = index.handler(json.loads(mock_event), None) assert response == request.getfixturevalue(test_response) @patch('src.index.config.get_current_logger') @patch('src.index.get_product_metadata') @patch('src.index.boto3.client') def test_handler_get_product_metadata_fails( mock_boto3_client, mock_get_product_metadata, mock_current_logger, context_json_artwork, test_fileobj, test_graphql_response, request): """Test the main handler fails.""" mock_s3_client = MagicMock(name='get_object') mock_fileobject = MagicMock(name='read') mock_fileobject.read.return_value = test_fileobj # noqa mock_s3_client.get_object.return_value = { 'Body': mock_fileobject } mock_boto3_client.return_value = mock_s3_client mock_get_product_metadata.side_effect = GraphQLError([ { 'message': 'Mock GraphQL Error' } ]) mock_log_error = MagicMock() mock_current_logger.return_value = mock_log_error with pytest.raises(GraphQLError): index.handler(json.loads(context_json_artwork), None) mock_log_error.error.assert_called_once() @patch('src.index.config.get_current_logger') @patch('src.index.get_product_metadata') @patch('src.index.boto3.client') def test_handler_product_missing( mock_boto3_client, mock_get_product_metadata, mock_current_logger, context_json_artwork, test_fileobj, test_graphql_response, request): """Test the main handler without finding a product.""" mock_s3_client = MagicMock(name='get_object') mock_fileobject = MagicMock(name='read') mock_fileobject.read.return_value = test_fileobj # noqa mock_s3_client.get_object.return_value = { 'Body': mock_fileobject } mock_boto3_client.return_value = mock_s3_client mock_get_product_metadata.return_value = None mock_log_error = MagicMock() mock_current_logger.return_value = mock_log_error with pytest.raises(ValueError): index.handler(json.loads(context_json_artwork), None) mock_log_error.error.assert_called_once() @patch('src.index.graphql_gateway') @patch('src.index.config.get_current_logger') def test_get_product_metadata(mock_logger, mock_graphql_gateway): """Test get_product_metadata.""" upc = '123456789012' product_id = 12345 product_shape = { 'upc': upc, 'productId': product_id } mock_graphql_gateway.execute.return_value = { 'data': { 'productByUpc': product_shape } } result = index.get_product_metadata(upc) assert result == product_shape def test_get_track_metadata_no_tracks(): """Test get_track_metadata when no tracks are found.""" graphql_result = { 'tracks': [], 'upc': 123456789012 } item = { 'seq_num': 1, 'volume_num': 1, 'upc': 123456789012 } with pytest.raises(SetTrackMetadataException): index.get_track_metadata(graphql_result, item) def test_get_track_metadata_no_track_match(): """Test get_track_metadata when no tracks match.""" graphql_result = { 'tracks': [ { 'trackNumber': 20, 'volumeNumber': 10 } ], 'upc': 123456789012 } item = { 'seq_num': 1, 'volume_num': 1, 'upc': 123456789012 } with pytest.raises(SetTrackMetadataException): index.get_track_metadata(graphql_result, item)