"""Test s3 connections.""" from unittest import mock from botocore.exceptions import ClientError import pytest from sound_recordings.utils import s3 as s3_utils @mock.patch('sound_recordings.utils.s3.s3_client') @mock.patch('sound_recordings.config.VERSION_BUCKET', 'test-sr-bucket') @mock.patch('sound_recordings.config.VERSION_BUCKET_KEY_PREFIX', '') def test_get_sound_recording_version(mock_client): """Test get sr for specific version.""" sr_id = 'SR_ID' version_id = 'VERSION_ID' expected_result = { 'version_id': version_id, 'creation_date': 'DATE', 'data': {'json': 'data'} } mock_body = mock.MagicMock() mock_body.read.return_value = b'{"json": "data"}' mock_client.get_object.return_value = { 'VersionId': 'VERSION_ID', 'Body': mock_body, 'LastModified': 'DATE' } result = s3_utils.get_sound_recording_version(sr_id, version_id) assert result == expected_result assert mock_client.get_object.called assert mock_client.get_object.call_args_list == [ mock.call( Bucket='test-sr-bucket', Key=sr_id, VersionId='VERSION_ID' ) ] @mock.patch('sound_recordings.utils.s3.s3_client') @mock.patch('sound_recordings.config.VERSION_BUCKET', 'test-sr-bucket') @mock.patch('sound_recordings.config.VERSION_BUCKET_KEY_PREFIX', '') def test_get_latest_sound_recording_version(mock_client): """Test get lastest sr version.""" sr_id = 'SR_ID' version_id = 'latest' expected_result = { 'version_id': 'LATEST_VERSION_ID', 'creation_date': 'DATE', 'data': {'json': 'data'} } mock_body = mock.MagicMock() mock_body.read.return_value = b'{"json": "data"}' mock_client.get_object.return_value = { 'VersionId': 'LATEST_VERSION_ID', 'Body': mock_body, 'LastModified': 'DATE' } result = s3_utils.get_sound_recording_version(sr_id, version_id) assert result == expected_result assert mock_client.get_object.called assert mock_client.get_object.call_args_list == [ mock.call( Bucket='test-sr-bucket', Key=sr_id ) ] @mock.patch('sound_recordings.utils.s3.s3_client') def test_get_sound_recording_version_key_not_found(mock_client): """Test get sr key version not found.""" sr_id = 'SR_ID' version_id = 'VERSION_ID' mock_client.get_object.side_effect = ClientError( {'Error': {'Code': 'NoSuchKey', 'Message': 'message'}}, 'S3GetObject' ) result = s3_utils.get_sound_recording_version(sr_id, version_id) assert not result @mock.patch('sound_recordings.utils.s3.s3_client') def test_get_sound_recording_version_not_found(mock_client): """Test get sr version not found.""" sr_id = 'SR_ID' version_id = 'VERSION_ID' mock_client.get_object.side_effect = ClientError( {'Error': {'Code': 'code', 'Message': 'Invalid version id specified'}}, 'S3GetObject' ) result = s3_utils.get_sound_recording_version(sr_id, version_id) assert not result @mock.patch('sound_recordings.utils.s3.s3_client') def test_get_sound_recording_version_error(mock_client): """Test get sr version error.""" sr_id = 'SR_ID' version_id = 'VERSION_ID' mock_client.get_object.side_effect = ClientError( {'Error': {'Code': 'ERROR_CODE', 'Message': 'message'}}, 'S3GetObject' ) with pytest.raises(ClientError): s3_utils.get_sound_recording_version(sr_id, version_id) @mock.patch('sound_recordings.utils.s3.s3_client') def test_get_signed_url(mock_client): """Test get signed url from path.""" path = '/path' mock_client.generate_presigned_url.return_value = 'signed url' expected_result = 'signed url' expected_params = { 'Bucket': 'test-bucket', 'Key': '/path' } result = s3_utils.get_signed_url(path) assert result == expected_result assert mock_client.generate_presigned_url.called assert mock_client.generate_presigned_url.call_args_list == [ mock.call('get_object', Params=expected_params, ExpiresIn=86400000) ] @mock.patch('sound_recordings.utils.s3.s3_client') def test_get_signed_url_not_found(mock_client): """Test get signed url not found.""" path = '/path' mock_client.generate_presigned_url.return_value = None expected_result = None expected_params = { 'Bucket': 'test-bucket', 'Key': '/path' } result = s3_utils.get_signed_url(path) assert result == expected_result assert mock_client.generate_presigned_url.called assert mock_client.generate_presigned_url.call_args_list == [ mock.call('get_object', Params=expected_params, ExpiresIn=86400000) ] @mock.patch('sound_recordings.utils.s3.s3_client') def test_get_signed_url_error(mock_client): """Test get signed url error.""" path = '/path' mock_client.generate_presigned_url.side_effect = ClientError( {'Error': {'Code': 'ERROR_CODE', 'Message': 'message'}}, 'S3GetObject' ) with pytest.raises(ClientError): s3_utils.get_signed_url(path)