"""Lambda test module.""" import boto3 import pytest from botocore.stub import Stubber import config from src import app as index test_sql = 'test sql' test_upcs = [ { 'upc': '194491961480' }, { 'upc': '194491961497' } ] test_upcs_list = ['194491961480', '194491961497'] def patch_session_scope(mocker, select_upcs_return_value): """Patch session scope function.""" # session mock mocked_session = mocker.Mock() mocked_session.execute.return_value = select_upcs_return_value # context mock mocked_context = mocker.Mock() mocked_context.__enter__ = mocker.Mock( return_value=mocked_session) mocked_context.__exit__ = mocker.Mock(return_value=None) # session scope function mock mocked_session_scope = mocker.patch( 'src.connectors.art_relations.session_scope') mocked_session_scope.return_value = mocked_context return mocked_session @pytest.mark.parametrize( 'upcs_found, upcs_to_download', [('100', 4900), ('5500', 0)]) def test_select_and_add_upcs_to_sqs(mocker, upcs_found, upcs_to_download): """Test select_and_add_upcs_to_sqs function.""" mocked_session = patch_session_scope(mocker, test_upcs) mocked_add_messages_to_sqs = mocker.patch.object(index.sqs, 'add_messages_to_sqs') mocked_sqlalchemy_text = mocker.patch.object(index.sqlalchemy, 'text') mocked_sqlalchemy_text.return_value = test_sql mocked_logger = mocker.patch.object(index.logger, 'get_current_logger') sqs = boto3.client('sqs', region_name='us-east-1') stubber = Stubber(sqs) s3_get_queue_response = { 'Attributes': { 'ApproximateNumberOfMessages': upcs_found } } expected_params = { 'QueueUrl': config.QUEUE_NAME_UPC_PROVISIONER, 'AttributeNames': ['ApproximateNumberOfMessages'] } stubber.add_response( 'get_queue_attributes', s3_get_queue_response, expected_params ) with stubber: boto3_mock = mocker.patch.object(index.boto3, 'client') boto3_mock.return_value = sqs index.select_and_add_upcs_to_sqs('Scheduled Event', mocked_logger) if upcs_to_download == 0: mocked_logger.info.assert_called_with('No upcs needed') else: # assert that the correct number of UPCs are selected and claimed mocked_add_messages_to_sqs.assert_called_with( config.QUEUE_NAME_UPC_PROVISIONER, test_upcs_list) assert mocked_session.execute.call_args_list[0] == mocker.call( 'test sql', { 'limit': upcs_to_download, 'offset': config.UPCS_AR_SELECT_OFFSET } ) assert mocked_session.execute.call_args_list[1] == mocker.call( 'test sql', {'list': test_upcs_list}) expected_log_message = f'Number of UPCs claimed: {len(test_upcs_list)}' # noqa mocked_logger.info.assert_called_with(expected_log_message)