def _add_openapi_integration(self, api, function, manage_swagger=False): """Adds the path and method for this Api event source to the OpenApi body for the provided RestApi. :param model.apigateway.ApiGatewayRestApi rest_api: the RestApi to which the path and method should be added. """ open_api_body = api.get("DefinitionBody") if open_api_body is None: return function_arn = function.get_runtime_attr('arn') uri = fnSub('arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/' + make_shorthand(function_arn) + '/invocations') editor = OpenApiEditor(open_api_body) if manage_swagger and editor.has_integration(self.Path, self.Method): # Cannot add the Lambda Integration, if it is already present raise InvalidEventException( self.relative_id, "API method '{method}' defined multiple times for path '{path}'.".format( method=self.Method, path=self.Path)) condition = None if CONDITION in function.resource_attributes: condition = function.resource_attributes[CONDITION] editor.add_lambda_integration(self.Path, self.Method, uri, self.Auth, api.get('Auth'), condition=condition) if self.Auth: self._add_auth_to_openapi_integration(api, editor) api["DefinitionBody"] = editor.openapi
class TestOpenApiEditor_has_integration(TestCase): def setUp(self): self.openapi = { "openapi": "3.0.1", "paths": { "/foo": { "get": {_X_INTEGRATION: {"a": "b"}}, "post": {"Fn::If": ["Condition", {_X_INTEGRATION: {"a": "b"}}, {"Ref": "AWS::NoValue"}]}, "delete": {"Fn::If": ["Condition", {"Ref": "AWS::NoValue"}, {_X_INTEGRATION: {"a": "b"}}]}, "somemethod": {"foo": "value"}, "emptyintegration": {_X_INTEGRATION: {}}, "badmethod": "string value", } }, } self.editor = OpenApiEditor(self.openapi) def test_must_find_integration(self): self.assertTrue(self.editor.has_integration("/foo", "get")) def test_must_find_integration_with_condition(self): self.assertTrue(self.editor.has_integration("/foo", "post")) def test_must_find_integration_with_condition2(self): self.assertTrue(self.editor.has_integration("/foo", "delete")) def test_must_not_find_integration(self): self.assertFalse(self.editor.has_integration("/foo", "somemethod")) def test_must_not_find_empty_integration(self): self.assertFalse(self.editor.has_integration("/foo", "emptyintegration")) def test_must_handle_bad_value_for_method(self): self.assertFalse(self.editor.has_integration("/foo", "badmethod"))