"""Module with tests for get_metadata method.""" import json from unittest.mock import patch from src import app as index from src.common.lambda_exceptions import S3Error import pytest test_filename = 'test_filename' test_bucket = 'test_bucket' asset_metadata = { 'Metadata': { 'asset_type': 'image', 'object_id': '123', 'object_type': 'episode', 'original_filename': 'original_filename.ext' } } @patch('src.common.s3.client') def test_get_metadata(s3_client_mock): """Test for get_metadata success.""" s3_client_mock.head_object.return_value = asset_metadata result = index.get_file_metadata(test_bucket, test_filename) assert result == asset_metadata['Metadata'] @patch('src.common.s3.client') def test_get_metadata_with_no_metadata(s3_client_mock): """Test for get_metadata without Metadata key.""" s3_client_mock.head_object.return_value = {} with pytest.raises(S3Error) as err: index.get_file_metadata(test_bucket, test_filename) assert err.value.error_code == 's3_metadata_missing' assert str(err.value) == 'Metadata not found in {filename} object (bucket {bucket})'.format( filename=test_filename, bucket=test_bucket) asset_metadatas = [ ('asset_type', {'object_id': asset_metadata['Metadata']['object_id']}), ('object_type', { 'asset_type': asset_metadata['Metadata']['asset_type'], 'object_id': asset_metadata['Metadata']['object_id']}), ('original_filename', { 'asset_type': asset_metadata['Metadata']['asset_type'], 'object_id': asset_metadata['Metadata']['object_id'], 'object_type': asset_metadata['Metadata']['object_type']}) ] @patch('src.common.s3.client') @pytest.mark.parametrize('missed_key,expected_input_data', asset_metadatas) def test_get_metadata_with_no_required_key(s3_client_mock, missed_key, expected_input_data): """Test for get_metadata without Metadata key.""" metadata = {'Metadata': asset_metadata['Metadata'].copy()} del metadata['Metadata'][missed_key] s3_client_mock.head_object.return_value = metadata with pytest.raises(S3Error) as err: index.get_file_metadata(test_bucket, test_filename) validation_err = dict() validation_err[missed_key] = ['Missing data for required field.'] expected_err_msg = 'test_filename object (bucket test_bucket) has invalid metadata: {}'.format( json.dumps(validation_err)) assert err.value.error_code == 's3_metadata_validation_error' assert str(err.value) == expected_err_msg