"""Tests for salessheets_daemon model.""" import json import uuid import boto3 from botocore.exceptions import ClientError from flexmock import flexmock from moto import mock_aws import pytest from salessheets import config from salessheets.connectors import sqs from salessheets.constants import daemon from salessheets.constants import error from salessheets.constants import salessheets from salessheets.models import salessheets_daemon @pytest.mark.parametrize( 'template_type, localized_template_type_id', [ (None, None), ('orchard', 3), ('orchard', '3') ]) @mock_aws def test_put_job_to_sqs_success(template_type, localized_template_type_id): """Test put_job_to_sqs for successful result.""" test_queue_name = config.SALESSHEETS_SQS_QUEUE correlation_id = '123' product_ids = [12341234] user_id = 'alw:435465' generation_method = salessheets.ALLOWED_GENERATION_METHODS[0] job_id = 1 payload = { daemon.PRODUCT_ID: product_ids, daemon.OUTPUT_TYPE: generation_method, daemon.JOB_ID: job_id} if template_type is not None: payload[salessheets.TEMPLATE_TYPE] = 'orchard' if localized_template_type_id is not None: payload[salessheets.LOCALIZED_TEMPLATE_TYPE_ID] = ( int(localized_template_type_id)) assert isinstance(payload[salessheets.LOCALIZED_TEMPLATE_TYPE_ID], int) client = boto3.client('sqs', region_name='us-east-1') queue_url = client.create_queue(QueueName=test_queue_name).get('QueueUrl') (flexmock(sqs) .should_receive('get_queue') .and_return(queue_url) .once()) result = salessheets_daemon.put_job_to_sqs( job_id, product_ids, generation_method, correlation_id, user_id, template_type, localized_template_type_id) assert result @pytest.mark.parametrize('template_type', [None, 'orchard']) def test_put_job_to_sqs_failed(template_type): """Test put_job_to_sqs for failed result.""" correlation_id = '123' product_ids = [12341234] generation_method = salessheets.ALLOWED_GENERATION_METHODS[0] job_id = 1 queue = None (flexmock(sqs) .should_receive('get_queue') .and_return(queue) .once()) result = salessheets_daemon.put_job_to_sqs( job_id, product_ids, generation_method, correlation_id, template_type) assert not result assert result.errors['message'] == error.ERROR_MESSAGE_WRONG_SQS_QUEUE def test_put_job_to_sqs_wrong_localized_template_type_id(): """Expect put_job_to_sqs to fail if localized_template_type_id is wrong. Expect put_job_to_sqs to fail if localized_template_type_id has incorrect format and can't be converted to int. """ correlation_id = '123' product_ids = [12341234] template_type = 'orchard' user_id = 'alw:435465' localized_template_type_id_of_wrong_format = 'aaaa33' generation_method = salessheets.ALLOWED_GENERATION_METHODS[0] job_id = 1 queue = flexmock(send_message=lambda message: None) (flexmock(sqs) .should_receive('get_queue') .and_return(queue) .once()) result = salessheets_daemon.put_job_to_sqs( job_id=job_id, product_ids=product_ids, generation_method=generation_method, correlation_id=correlation_id, user_id=user_id, template_type=template_type, localized_template_type_id=localized_template_type_id_of_wrong_format) assert not result assert result.errors['message'] == ( error.ERROR_MSG_WRONG_LOCALIZED_TEMPLATE_TYPE_ID) @pytest.mark.parametrize('template_type', [None, 'orchard']) def test_put_job_to_sqs_exception(template_type): """Test put_job_to_sqs for write exception.""" correlation_id = '123' product_ids = [12341234] generation_method = salessheets.ALLOWED_GENERATION_METHODS[0] job_id = 1 error_response = { 'Error': { 'Code': 500, 'Message': 'Mocked error'}} expected_error = 'Can not connect to provided SQS queue' def write(*args, **kwargs): raise ClientError( error_response=error_response, operation_name='get_connection') queue = flexmock(write=write) (flexmock(sqs) .should_receive('get_connection') .and_return(queue) .at_least().twice()) result = salessheets_daemon.put_job_to_sqs( job_id, product_ids, generation_method, correlation_id, template_type) assert not result assert result.errors['message'] == expected_error @pytest.mark.parametrize( 'user_id, expected_feature_flag_user_context, localized_template_type_id', [(None, None, None), ('alw:987543', {'DataType': 'String', 'StringValue': 'alw:987543'}, 1)] ) @mock_aws def test_put_message_to_sqs_success( user_id, expected_feature_flag_user_context, localized_template_type_id): """Expect put job to sqs queue add correct localized template attribute.""" product_ids = [12341234] generation_method = salessheets.ALLOWED_GENERATION_METHODS[0] job_id = 1 template_type = 'orchard' payload = { daemon.PRODUCT_ID: product_ids, daemon.OUTPUT_TYPE: generation_method, daemon.JOB_ID: job_id, salessheets.TEMPLATE_TYPE: template_type } if localized_template_type_id: payload[salessheets.LOCALIZED_TEMPLATE_TYPE_ID] = ( localized_template_type_id) client = boto3.client('sqs', region_name='us-east-1') queue_url = client.create_queue(QueueName=config.SALESSHEETS_SQS_QUEUE).get('QueueUrl') correlation_id = str(uuid.uuid1()) result = salessheets_daemon.put_job_to_sqs( job_id, product_ids, generation_method, correlation_id, user_id, template_type, localized_template_type_id) message = client.receive_message( QueueUrl=queue_url, MessageAttributeNames=['All'])['Messages'][0] result_msg = message['Body'] payload = json.dumps(payload) message_attrs = message['MessageAttributes'] assert result_msg == payload assert message_attrs.get(salessheets.FEATURE_FLAG_USER_CONTEXT) == ( expected_feature_flag_user_context) assert result.status == 200