"""Cache invalidation tests.""" import json import unittest import boto3 from moto import mock_aws import application from manualadjustment import config from manualadjustment.models.manual_adjustment import ManualAdjustment from utils import db_ops class TestCacheInvalidation(unittest.TestCase): """Test POST and PUT scenarios. Involves pushing messages to SQS to trigger cache invalidation. """ def setUp(self): """Test setup procedure.""" db_ops.create_tables() db_ops.seed_art_relations() self.app = application.app.test_client() self.headers = [('Content-Type', 'application/json')] ma_id = db_ops.ar_session.query(ManualAdjustment).first().id self.put_url = '/manual_adjustment/{}'.format(ma_id) self.post_url = '/manual_adjustment' self.json_data = { 'amount': 234.56, 'category_id': 0, 'comment': 'test comment', 'adjust_for_period_id': 156, 'apply_to_period_id': 156, 'parent_id': 16031, 'parent_type': 'vendor', 'created_by': 261, 'currencies_id': 1, 'amount_in_original_currency': 456.78} def tearDown(self): """Test teardown procedure.""" self.json_data = {} db_ops.create_tables() @mock_aws def test_post_sends_message_to_sqs(self): """Assert posting data causes a cache invalidation message to sqs.""" client = boto3.client('sqs', region_name=config.AWS_REGION) client.create_queue(QueueName=config.queue_name) queue_url = client.get_queue_url( QueueName=config.queue_name).get('QueueUrl') self.app.post( self.post_url, data=json.dumps(self.json_data), headers=self.headers) message = client.receive_message(QueueUrl=queue_url)['Messages'][0] message_body = message['Body'] expected_queue_msg = json.dumps( {'vendor': self.json_data['parent_id']}) self.assertEqual(message_body, expected_queue_msg) @mock_aws def test_put_sends_message_to_sqs(self): """Test putting data with valid manual adj id. Asserting for a single cache invalidation to be pushed to SQS. """ client = boto3.client('sqs', region_name=config.AWS_REGION) client.create_queue(QueueName=config.queue_name) self.app.put( self.put_url, data=json.dumps(self.json_data), headers=self.headers) queue_url = client.get_queue_url( QueueName=config.queue_name).get('QueueUrl') message = client.receive_message(QueueUrl=queue_url)['Messages'][0] message_body = message['Body'] expected_queue_msg = json.dumps( {'vendor': self.json_data['parent_id']}) self.assertEqual(message_body, expected_queue_msg) @mock_aws def test_put_nonexistent_id_no_message_to_sqs(self): """Test putting data with non-existent manual adj id. Asserting this does NOT send a message to SQS. """ client = boto3.client('sqs', region_name=config.AWS_REGION) client.create_queue(QueueName=config.queue_name) self.app.put( '/manual_adjustment/1234567890', data=json.dumps(self.json_data), headers=self.headers) queue_url = client.get_queue_url( QueueName=config.queue_name).get('QueueUrl') msg_list = client.receive_message(QueueUrl=queue_url) self.assertEqual(len(msg_list), 1)