"""Test s3 file upload.""" import tempfile import boto from flexmock import flexmock from moto import mock_s3 import pytest from label_copy_export import config from label_copy_export.connectors import s3 from label_copy_export.connectors import sentry from label_copy_export.constants import s3 as s3_constants @mock_s3 def test_upload_file_to_s3_no_bucket(): """Test s3 upload to unavailable bucket.""" (flexmock(sentry.sentry_client) .should_receive('captureException') .once()) with tempfile.NamedTemporaryFile( mode='w', suffix='.csv') as named_temp_csv_file: temp_csv_file = named_temp_csv_file.name filename = 'flnm' result = s3.upload_file_to_s3(temp_csv_file, filename) assert result.status == 404 assert result.errors['code'] == 'NoSuchBucket' @mock_s3 def test_upload_file_to_s3_no_file(): """Test s3 upload file doesnt exist.""" conn = boto.connect_s3() conn.create_bucket(config.S3_BUCKET_PATH.split('/', maxsplit=1)[0]) file_path = '/var/does-not-exist.csv' s3_filename = 'key' result = s3.upload_file_to_s3(file_path, s3_filename) assert result.status == 500 assert result.errors['message'] == '{csv} file doesn\'t exist'.format( csv=file_path) @mock_s3 def test_upload_file_to_s3_valid(): """Test valid s3 upload.""" conn = boto.connect_s3() bucket_name, path = config.S3_BUCKET_PATH.split('/', maxsplit=1) bucket = conn.create_bucket(bucket_name) with tempfile.NamedTemporaryFile( mode='w', suffix='.csv') as named_temp_csv_file: temp_csv_file = named_temp_csv_file.name s3_key_name = 'Test' s3_key_full_path = '{path}/{key}'.format( path=path, key=s3_key_name) result = s3.upload_file_to_s3(temp_csv_file, s3_filename=s3_key_name) key_in_bucket = bucket.get_key(s3_key_full_path) assert s3_key_full_path == key_in_bucket.name assert result @pytest.mark.parametrize( 'test_metadata_for_s3_upload', [ {}, {'test_metadata_key': 'test_value'} ]) @mock_s3 def test_set_content_disposition(test_metadata_for_s3_upload): """Test valid s3 upload Content-Disposition is added to metadata.""" conn = boto.connect_s3() bucket_name, path = config.S3_BUCKET_PATH.split('/', maxsplit=1) bucket = conn.create_bucket(bucket_name) with tempfile.NamedTemporaryFile( mode='w', suffix='.csv') as named_temp_csv_file: temp_csv_file = named_temp_csv_file.name s3_key_name = 'Test' s3_key_full_path = '{path}/{key}'.format( path=path, key=s3_key_name) result = s3.upload_file_to_s3(temp_csv_file, s3_filename=s3_key_name, metadata=test_metadata_for_s3_upload) key_in_bucket = bucket.get_key(s3_key_full_path) assert result assert key_in_bucket.content_disposition == s3_constants.ATTACHMENT