"""Test common fetching of assets from S3.""" import os from unittest import mock import pytest from src.common.connectors import s3_assets from botocore.exceptions import ResponseStreamingError from src.common.exceptions import exceptions @mock.patch.dict(os.environ, {'ENVIRONMENT': 'dev'}, clear=True) @mock.patch('src.common.connectors.s3_assets.s3_client') def test_asset_download(mock_s3): """Test normal download.""" mock_s3.head_object.return_value = { 'ContentLength': 1024 } mock_read = mock.MagicMock() mock_read.read.return_value = b'music' mock_s3.get_object.return_value = { 'Body': mock_read } result = s3_assets.download_asset('file123', 'flac') assert mock_s3.head_object.call_args_list == [ mock.call( Bucket='dev-orcd-raw-assets', Key='fingerprinting/acrcloud/file123.flac' ) ] assert mock_s3.get_object.call_args_list == [ mock.call( Bucket='dev-orcd-raw-assets', Key='fingerprinting/acrcloud/file123.flac' ) ] assert result == b'music' @mock.patch.dict(os.environ, {'ENVIRONMENT': 'dev'}, clear=True) @mock.patch('src.common.connectors.s3_assets.s3_client') def test_asset_download_streaming_error(mock_s3): """Test streaming error.""" mock_s3.head_object.return_value = { 'ContentLength': 1024 } mock_read = mock.MagicMock() mock_read.read.return_value = b'music' mock_s3_response = mock_s3.get_object.return_value mock_s3_response['Body'].read.side_effect = ResponseStreamingError(error='error') # noqa:E501 with pytest.raises(exceptions.RetryableException): s3_assets.download_asset('file123', 'flac') @mock.patch.dict(os.environ, {'ENVIRONMENT': 'dev'}, clear=True) @mock.patch('src.common.connectors.s3_assets.s3_client') def test_too_large_file(mock_s3): """Test too large file.""" mock_s3.head_object.return_value = { 'ContentLength': s3_assets.MAX_FILESIZE_BYTES + 1 } with pytest.raises(s3_assets.FileTooLarge): s3_assets.download_asset('file123', 'flac') assert mock_s3.head_object.called assert not mock_s3.get_object.called