"""Test s3 utilities.""" from unittest.mock import patch import boto3 from moto import mock_s3 import smart_open from prs import config from prs.constants import error from prs.constants import s3 from prs.constants import tools_message from prs.utils import s3 as s3_util @mock_s3 def test_write_csv_to_s3(): """Test write_csv_to_s3 and get_presigned_url for success.""" column_list = ['vendor_id', 'vendor_name'] row_list = [(1, 'vendor_name1'), (2, 'vendor_name2'), (3, 'vendor_name3')] data = {'rows': row_list, 'columns': column_list} s3_client = boto3.client('s3') s3_client.create_bucket(Bucket=config.PRS_BUCKET_NAME) s3_key = 'tool_name/test_case.csv' response = s3_util.write_csv_to_s3(s3_key, data) assert response.message == tools_message.CSV_GENERATION_SUCCESS_MESSAGE csv_data = [] source_url = s3.FILE_URL.format( bucket_name=config.PRS_BUCKET_NAME, file_path=s3_key) [csv_data.append(line) for line in smart_open.smart_open(source_url)] expected_response = [ b'vendor_id,vendor_name\r\n', b'1,vendor_name1\r\n', b'2,vendor_name2\r\n', b'3,vendor_name3\r\n' ] assert csv_data == expected_response url = s3_util.get_presigned_url(s3_key) assert url @mock_s3 def test_write_csv_to_s3_for_s3responserrror(): """Test write_csv_to_s3 for S3ResponseError.""" column_list = ['vendor_id', 'vendor_name'] row_list = [(1, 'vendor_name1'), (2, 'vendor_name2'), (3, 'vendor_name3')] data = {'rows': row_list, 'columns': column_list} s3_client = boto3.client('s3') s3_client.create_bucket(Bucket='test123') s3_key = 'tool_name/test_case.csv' response = s3_util.write_csv_to_s3(s3_key, data) errors = response.errors assert response.status == 404 assert errors['message'] == 'The specified bucket does not exist' assert errors['code'] == 'NoSuchBucket' @patch('prs.utils.s3.smart_open.smart_open') @mock_s3 def test_write_csv_to_s3_for_exception(mock_write_csv_to_s3): """Test write_csv_to_s3 for any exception with smart_open.""" column_list = ['vendor_id', 'vendor_name'] row_list = [(1, 'vendor_name1'), (2, 'vendor_name2'), (3, 'vendor_name3')] data = {'rows': row_list, 'columns': column_list} s3_client = boto3.client('s3') s3_client.create_bucket(Bucket=config.PRS_BUCKET_NAME) s3_key = 'tool_name/test_case.csv' e = Exception('test exception') mock_write_csv_to_s3.side_effect = e response = s3_util.write_csv_to_s3(s3_key, data) errors = response.errors assert response.status == 400 assert errors['message'] == 'test exception' assert errors['code'] == error.ERROR_CODE_CSV_FILE_WRITE