"""AWS connector unit tests.""" import json from unittest.mock import MagicMock, patch import pytest from botocore.exceptions import ClientError from abacus_event.config import Config from abacus_event.connectors.aws import _get_lambda_client, invoke_lambda from abacus_event.utils.ows_error import OwsError @patch('abacus_event.connectors.aws._get_lambda_client') def test_invoke_lambda_success(mock_get_lambda_client): """Test successfully invoking a lambda.""" function_name = 'lambda-abacus-blah' payload = {'key': 'value'} qualifier = 'provisioned' mock_lambda_client = MagicMock() mock_lambda_client.invoke.return_value = 'SUCCESS' mock_get_lambda_client.return_value = mock_lambda_client invoke_lambda(function_name, payload, qualifier) mock_get_lambda_client.assert_called_once() mock_lambda_client.invoke.assert_called_once_with( FunctionName=f'{Config.ENVIRONMENT.lower()}-{function_name}', InvocationType='Event', LogType='None', Payload=json.dumps(payload), Qualifier=qualifier, ) @patch('abacus_event.connectors.aws._get_lambda_client') def test_invoke_lambda_error(mock_get_lambda_client): """Test error is raised when invoking lambda fails.""" function_name = 'lambda-abacus-blah' payload = {'key': 'value'} qualifier = 'provisioned' mock_error_response = { 'Error': { 'Code': 'SomeServiceException', 'Message': 'Details about why the error occurred', }, 'ResponseMetadata': {'HTTPStatusCode': 400}, } mock_lambda_client = MagicMock() mock_lambda_client.invoke.return_value = mock_error_response mock_get_lambda_client.return_value = mock_lambda_client mock_lambda_client.invoke.side_effect = ClientError(mock_error_response, 'invoke') with pytest.raises(OwsError) as error: invoke_lambda(function_name, payload, qualifier) mock_get_lambda_client.assert_called_once() mock_lambda_client.invoke.assert_called_once_with( FunctionName=f'{Config.ENVIRONMENT.lower()}-{function_name}', InvocationType='Event', LogType='None', Payload=json.dumps(payload), Qualifier=qualifier, ) assert mock_error_response['Error']['Code'] in error.value.message assert mock_error_response['Error']['Message'] in error.value.message assert ( mock_error_response['ResponseMetadata']['HTTPStatusCode'] == error.value.status ) @patch('abacus_event.connectors.aws.boto3') def test_get_lambda_client(mock_boto): """Test creating an aws lambda client.""" mock_boto.client.return_value = MagicMock() client = _get_lambda_client() assert client mock_boto.client.assert_called_once_with('lambda', region_name=Config.AWS_REGION)