"""Test s3 connections.""" import pytest from unittest.mock import call from unittest.mock import patch from unittest.mock import MagicMock from botocore.exceptions import ClientError from src.common.connectors import s3_delivery_audit from src.common.connectors import s3_sound_recordings @pytest.mark.parametrize( 'error_code, error_message, expected_result', [ # no exceptions ( None, 'message', b'json-data' ), # no such key exception ( 'NoSuchKey', 'message', None ), # no such bucket exception ( 'NoSuchBucket', 'message', None ), # invalid version exception ( 'InvalidArgument', 'Invalid version id specified', None ) ] ) @patch('src.common.connectors.s3_sound_recordings._config', return_value=('sr-bucket', 'versions/')) # noqa:E501 @patch('src.common.connectors.s3_sound_recordings.s3_client') def test_get_version( mock_client, mock_s3_config, error_code, error_message, expected_result): """Test get sound recording by version.""" sr_id = 'sr-123' v_id = 'v-123' if error_code: mock_client.get_object.side_effect = ClientError( {'Error': {'Code': error_code, 'Message': error_message}}, 'S3GetObject' ) else: mock_body = MagicMock() mock_body.read.return_value = b'json-data' mock_client.get_object.return_value = { 'VersionId': 'sr-new', 'Body': mock_body, 'LastModified': 'blerg' } try: (result_data, last_modified) = s3_sound_recordings.get_sound_recording_version(sr_id, v_id) # noqa:E501 except ClientError: assert not expected_result else: assert result_data == expected_result if expected_result: assert last_modified == 'blerg' else: assert last_modified is None assert mock_client.get_object.called assert mock_client.get_object.call_args_list == [ call( Bucket='sr-bucket', Key=f'versions/{sr_id}', VersionId='v-123' ) ] @patch('io.BytesIO') @patch('src.common.connectors.s3_delivery_audit._config', return_value=('sr-bucket', 'sound_recording_delivery_audit/')) # noqa:E501 @patch('src.common.connectors.s3_delivery_audit.s3_client') def test_write_sr_delivery_audit_xml( mock_client, mock_s3_config, mock_bytes_io): """Test writing sound recording delivery XML to S3.""" mock_bytes_io.return_value = b'test' mock_client.put_object.return_value = {'test_key': 'test_value'} step_function_execution_id = '6ff851fa-d83b-4e6e-9888-66077de9529a' result = s3_delivery_audit.write_sr_delivery_audit_xml( mock_bytes_io, 'batch123/sr-123.xml', step_function_execution_id) assert result == {'test_key': 'test_value'} assert mock_client.put_object.called assert mock_client.put_object.call_args_list == [ call( Bucket='sr-bucket', Key='sound_recording_delivery_audit/6ff851fa-d83b-4e6e-9888-66077de9529a/batch123/sr-123.xml', # noqa:E501 Body=b'test' ) ]