"""Tests for Handlers.""" from unittest.mock import MagicMock from unittest.mock import patch from flask import json from owsresponse import response import pytest from ddex_lambda_proxy import config from ddex_lambda_proxy import handlers test_product_response = response.Response( message={'product_id': 12345}, status=200) test_ddex = 'test_ddex' @pytest.fixture def mocked_invoke(mocker): """Mock boto3 lambda client.""" mocked_boto_client = mocker.patch('boto3.client') mocked_lambda_client = MagicMock() mocked_invoke_function = MagicMock() mocked_lambda_client.invoke = mocked_invoke_function mocked_boto_client.return_value = mocked_lambda_client return mocked_invoke_function @patch('ddex_lambda_proxy.handlers.g') def test_exception_handler(mock_g): """Verify exception_handler returns 500 status code and json payload.""" message = ( 'The server encountered an internal error ' 'and was unable to complete your request.') mock_error = MagicMock() server_response = handlers.exception_handler(mock_error) mock_g.log.exception.assert_called_with(mock_error) # assert status code is 500 assert server_response.status_code == 500 # assert json payload response_message = json.loads(server_response.data.decode()) assert response_message['message'] == message assert response_message['code'] == response.error.ERROR_CODE_INTERNAL_ERROR @patch( 'ddex_lambda_proxy.models.ows_product.get_product_for_upc', return_value=test_product_response) def test_get_rdx_ddex(mocked_get_product, mocked_invoke): """Test that get_rdx_ddex invokes the lambda and returns the data.""" test_upc = '1234567890' mocked_read_function = MagicMock() mocked_read_function.read.return_value = test_ddex mocked_get_function = MagicMock() mocked_get_function.get.return_value = mocked_read_function mocked_invoke.return_value = mocked_get_function response = handlers.get_rdx_ddex(test_upc) assert mocked_invoke.call_count == 1 assert mocked_invoke.call_args[1]['FunctionName'] == ( config.DDEX_RDR_LAMBDA_NAME) assert mocked_invoke.call_args[1]['Payload'] == ( json.dumps( { 'product_id': str(test_product_response.message.get('product_id')) } ) ) assert response == test_ddex