"""Module with tests for post_asset method.""" from unittest.mock import patch from unittest.mock import Mock import pytest from constants import general from constants import errors from src import app @pytest.fixture def fixture_correct_post_asset_args(): """Fixture with correct post_asset call args.""" return { 'upc': '000123', 'track_unique_id': '12345', 'product_id': '54321', 'filename': 'unique_filename.wav', 'bucket': 'bucket', 'original_filename': 'original_filename.ext', 'is_correction': 1 } @pytest.mark.parametrize(( 'test_description', 'metadata', 'expected_process_call_kwargs', ), [ ( 'Full metadata', { 'product_id': 1, 'upc': '123456789012', 'track_unique_id': 5, 'is_correction': 1, 'original_filename': 'original_filename.wav', 'filename': 'filename', 'bucket': 'bucket' }, { 'application': 'lambda-assets-acknowledge', 'environment': 'dev', 'method': 'POST', 'path': '/v2/asset', 'service_name': 'ows-assets', 'json': { 'upc': '123456789012', 'track_unique_id': 5, 'product_id': 1, 'original_filename': 'original_filename.wav', 'is_correction': True, 'filename': 'filename', }, } ), ( 'No product_id', { 'product_id': None, 'upc': '123456789012', 'track_unique_id': 5, 'is_correction': 1, 'original_filename': 'original_filename.wav', 'filename': 'filename', 'bucket': 'bucket' }, { 'application': 'lambda-assets-acknowledge', 'environment': 'dev', 'method': 'POST', 'path': '/v2/asset', 'service_name': 'ows-assets', 'json': { 'filename': 'filename', } } ) ]) @patch('owsrequest.request.process', return_value=Mock(status_code=200)) def test_post_asset_success( process, test_description, metadata, expected_process_call_kwargs, ): """Test for post_asset success.""" result = app.post_asset(**metadata) is True process.assert_called_once_with(**expected_process_call_kwargs) assert result is True @patch('owsrequest.request.process') @patch('src.lambda_exceptions.notify_and_raise') def test_post_asset_request_bad_status_failure( notify_and_raise, process, fixture_correct_post_asset_args): """Test for post_asset ows-assets 500 failure..""" expected_input_params = fixture_correct_post_asset_args.copy() del expected_input_params['bucket'] process.return_value = Mock(status_code=500) app.post_asset(**fixture_correct_post_asset_args) expected_input_params['product_id'] = 54321 expected_input_params['track_unique_id'] = 12345 expected_input_params['is_correction'] = True notify_and_raise.assert_called_with( general.LAMBDA_NAME, general.ACKNOWLEDGE_ERROR_STATUS, errors.POST_ASSET_ERROR_CODE, fixture_correct_post_asset_args['filename'], fixture_correct_post_asset_args['bucket'], { 'code': 500}, expected_input_params) @patch('owsrequest.request.process') def test_post_asset_request_exception_failure( process, fixture_correct_post_asset_args): """Test for post_asset ows-assets 500 failure..""" process.side_effect = Exception('error') with pytest.raises(Exception): app.post_asset(**fixture_correct_post_asset_args)