"""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