"""Test S3 connector.""" import os from tempfile import NamedTemporaryFile import boto3 from moto import mock_aws import pytest import requests from blacklist_manager import config from blacklist_manager.connectors import s3 @pytest.mark.parametrize(('check_file_name', 'expected_result'), [ ('test-folder/test.csv', True), ('test.csv', False), ('dummy.csv', False), ('some-folder/test.csv', False), ('', False), ]) @mock_aws def test_check_if_file_exists(check_file_name, expected_result): """Test check_if_file_exists.""" file = 'test-folder/test.csv' s3_client = boto3.client('s3', region_name='us-east-1') s3_client.create_bucket(Bucket=config.EXPORT_BUCKET_NAME) s3_client.put_object( Bucket=config.EXPORT_BUCKET_NAME, Key=file, Body='hello world!') assert s3.check_if_file_exists(check_file_name) == expected_result @pytest.mark.parametrize(('check_file_name', 'expected_result'), [ ('test-folder/test.csv', 200), ('test-folder/other.csv', 404), ('test.csv', 404), ]) @mock_aws def test_get_signed_url(check_file_name, expected_result): """Test get_signed_url.""" file = 'test-folder/test.csv' file_content = 'hello world!' s3_client = boto3.client('s3', region_name='us-east-1') s3_client.create_bucket(Bucket=config.EXPORT_BUCKET_NAME) s3_client.put_object( Bucket=config.EXPORT_BUCKET_NAME, Key=file, Body=file_content) actual_result = s3.get_signed_url(check_file_name, expires_in=300) assert actual_result.status == expected_result if expected_result == 200: assert file in actual_result.message actual_content = requests.get(actual_result.message) assert actual_content.text == file_content @mock_aws def test_upload_file_from_disk_success(): """Test upload_file_from_disk.""" file_content = 'foo,bar' s3_filename = 'uploaded.csv' file = NamedTemporaryFile(delete=False, mode='w') file.write(file_content) file.close() file_path = file.name s3_client = boto3.client('s3', region_name='us-east-1') s3_client.create_bucket(Bucket=config.EXPORT_BUCKET_NAME) actual_result = s3.upload_file_from_disk(s3_filename, file_path) assert actual_result actual = s3_client.get_object( Bucket=config.EXPORT_BUCKET_NAME, Key=s3_filename) assert actual['Body'].read().decode('utf-8') == file_content os.unlink(file_path) @mock_aws def test_upload_file_from_disk_not_found(): """Test upload_file_from_disk.""" s3_filename = 'upload.csv' file_path = 'dummy.csv' s3_client = boto3.client('s3', region_name='us-east-1') s3_client.create_bucket(Bucket=config.EXPORT_BUCKET_NAME) actual_result = s3.upload_file_from_disk(s3_filename, file_path) assert actual_result.status == 404 assert actual_result.errors['message'] == 'Temp file upload.csv not found'