"""Tests for Bulk Update logic.""" import json from unittest.mock import MagicMock import boto3 import mock from moto import mock_s3 import physical_pricing_bulk_utils as ppbu_utils def s3_initialize(key_name='ready_test.json'): """Function to initialize s3 test cases with dependencies.""" bucket_name = 'dev-cucumbers' key_contents = { 'oa_user': {'id': '562', 'email': 'email@domain.com'}, 'submission_date': '2018-03-21 08:33:52', 'override_data': [{'release_id': '2253210', 'orchard_price_tier': { 'id': 79, 'name': 'Vinyl Tier #16'}, 'store_pricing': { '696': '', '738': '24', '739': '0.34', '737': '34.78', '740': '3'}}]} s3 = boto3.resource('s3', region_name='eu-west-1') bucket = s3.create_bucket(Bucket=bucket_name) batchfile = s3.Object(bucket_name, key_name) batchfile.put(Body=json.dumps(key_contents)) return bucket, batchfile @mock.patch('physical_pricing_bulk_utils.Session') def test_getS3connection(mock_session): """Test to read pricing data from batch file.""" mock_conn = MagicMock() mock_conn.resource.return_value = 's3' mock_session.return_value = mock_conn s3conn = ppbu_utils.getS3connection() assert s3conn == 's3' @mock.patch('physical_pricing_bulk_utils.send_email_with_ses') def test_send_email(mock_sendemail): """Test to send mail and notify user.""" sender = 'donotreply@theorchard.com' receivers = ['email@domain.com'] subject = 'Batch successfully ingested' logger = '' messagebody = """ {}
Cheers,
Orchard Physical Pricing Robot """.format(subject) ppbu_utils.send_email(subject, subject, receivers, logger) mock_sendemail.assert_called_once_with( sender, subject, messagebody, receivers) @mock.patch('physical_pricing_bulk_utils.boto3') def test_send_email_with_ses(boto3): """Test to send an email using AWS SES.""" mock_client = mock.MagicMock() boto3.client.return_value = mock_client recipients = 'test@email.com' sender = 'test@theorchard.com' subject = 'test email subject' message = 'test message' charset = 'utf-8' ppbu_utils.send_email_with_ses(sender, subject, message, recipients) mock_client.send_email.assert_called_once_with( Source=sender, Destination={'ToAddresses': recipients}, Message={ 'Subject': { 'Data': subject, 'Charset': charset }, 'Body': { 'Html': { 'Data': message, 'Charset': charset } } }, ReplyToAddresses=[sender] ) @mock_s3 def test_get_pricing_data(): """Test to read pricing data from batch file.""" key_contents = { 'oa_user': {'id': '562', 'email': 'email@domain.com'}, 'submission_date': '2018-03-21 08:33:52', 'override_data': [{'release_id': '2253210', 'orchard_price_tier': { 'id': 79, 'name': 'Vinyl Tier #16'}, 'store_pricing': { '696': '', '738': '24', '739': '0.34', '737': '34.78', '740': '3'}}]} key_name = 'ready_test.json' bucket, batchfile = s3_initialize(key_name) pricing_data_response = ppbu_utils.get_pricing_data(batchfile) assert pricing_data_response == key_contents @mock_s3 def test_rename_ingest_batch(): """Test to rename ingest batch.""" key_name = 'ready_test.json' bucket, batchfile = s3_initialize(key_name) session_res = ppbu_utils.getS3connection() new_name = 'running_test.json' ppbu_utils.rename_ingest_batch(bucket, session_res, key_name, new_name) renamed_filename = [f.key for f in bucket.objects.all()][0] assert new_name == renamed_filename @mock_s3 def test_archive_batch(): """Test to archive ingest batch.""" key_name = 'bulk-physical-pricing-ingest/complete_test.json' completed_filename = \ 'bulk-physical-pricing-ingest-archive/complete_test.json' bucket, batchfile = s3_initialize(key_name) session_res = ppbu_utils.getS3connection() ppbu_utils.archive_batch( bucket, session_res, key_name, completed_filename) renamed_filename = [f.key for f in bucket.objects.all()][0] assert completed_filename == renamed_filename @mock_s3 def test_get_oldest_batch_to_ingest(): """Test to get oldest ingest batch.""" key_name = 'bulk-physical-pricing-ingest/ready_test.json' bucket, batchfile = s3_initialize(key_name) oldest_ingestable_batch = ppbu_utils.get_oldest_batch_to_ingest( bucket, 'bulk-physical-pricing-ingest') assert key_name == oldest_ingestable_batch.key