APIGateway: Add response parameters to integration response (#5675)

This commit is contained in:
Cesar Alvernaz 2022-11-16 23:46:50 +00:00 committed by GitHub
parent fa77d22d72
commit db47aeeb02
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 2 deletions

View File

@ -114,6 +114,7 @@ class IntegrationResponse(BaseModel):
status_code: Union[str, int],
selection_pattern: Optional[str] = None,
response_templates: Optional[Dict[str, Any]] = None,
response_parameters: Optional[Dict[str, str]] = None,
content_handling: Optional[Any] = None,
):
if response_templates is None:
@ -126,6 +127,7 @@ class IntegrationResponse(BaseModel):
self.response_templates = response_templates
self.status_code = status_code
self.selection_pattern = selection_pattern
self.response_parameters = response_parameters
self.content_handling = content_handling
def to_json(self) -> Dict[str, Any]:
@ -137,6 +139,8 @@ class IntegrationResponse(BaseModel):
resp["selectionPattern"] = self.selection_pattern
if self.content_handling:
resp["contentHandling"] = self.content_handling
if self.response_parameters:
resp["responseParameters"] = self.response_parameters
return resp
@ -191,10 +195,15 @@ class Integration(BaseModel):
status_code: str,
selection_pattern: str,
response_templates: Dict[str, str],
response_parameters: Dict[str, str],
content_handling: str,
) -> IntegrationResponse:
integration_response = IntegrationResponse(
status_code, selection_pattern, response_templates or None, content_handling
status_code,
selection_pattern,
response_templates or None,
response_parameters,
content_handling,
)
if self.integration_responses is None:
self.integration_responses = {}
@ -1895,12 +1904,17 @@ class APIGatewayBackend(BaseBackend):
status_code: str,
selection_pattern: str,
response_templates: Dict[str, str],
response_parameters: Dict[str, str],
content_handling: str,
) -> IntegrationResponse:
integration = self.get_integration(function_id, resource_id, method_type)
if integration:
return integration.create_integration_response(
status_code, selection_pattern, response_templates, content_handling
status_code,
selection_pattern,
response_templates,
response_parameters,
content_handling,
)
raise NoIntegrationResponseDefined()

View File

@ -498,6 +498,7 @@ class APIGatewayResponse(BaseResponse):
selection_pattern = self._get_param("selectionPattern")
response_templates = self._get_param("responseTemplates")
response_parameters = self._get_param("responseParameters")
content_handling = self._get_param("contentHandling")
integration_response = self.backend.put_integration_response(
function_id,
@ -506,6 +507,7 @@ class APIGatewayResponse(BaseResponse):
status_code,
selection_pattern,
response_templates,
response_parameters,
content_handling,
)
return 201, {}, json.dumps(integration_response.to_json())

View File

@ -652,6 +652,10 @@ def test_integration_response():
httpMethod="GET",
statusCode="200",
selectionPattern="foobar",
responseParameters={
"method.response.header.Location": "integration.response.body.redirect.url",
"method.response.header.x-user-id": "integration.response.header.x-userid",
},
responseTemplates={},
)
@ -664,6 +668,10 @@ def test_integration_response():
"selectionPattern": "foobar",
"ResponseMetadata": {"HTTPStatusCode": 201},
"responseTemplates": {}, # Note: TF compatibility
"responseParameters": {
"method.response.header.Location": "integration.response.body.redirect.url",
"method.response.header.x-user-id": "integration.response.header.x-userid",
},
}
)
@ -679,6 +687,10 @@ def test_integration_response():
"selectionPattern": "foobar",
"ResponseMetadata": {"HTTPStatusCode": 200},
"responseTemplates": {}, # Note: TF compatibility
"responseParameters": {
"method.response.header.Location": "integration.response.body.redirect.url",
"method.response.header.x-user-id": "integration.response.header.x-userid",
},
}
)
@ -692,6 +704,10 @@ def test_integration_response():
"responseTemplates": {}, # Note: TF compatibility
"selectionPattern": "foobar",
"statusCode": "200",
"responseParameters": {
"method.response.header.Location": "integration.response.body.redirect.url",
"method.response.header.x-user-id": "integration.response.header.x-userid",
},
}
}
)
@ -1052,6 +1068,10 @@ def test_put_integration_response_with_response_template():
httpMethod="GET",
statusCode="200",
selectionPattern="foobar",
responseParameters={
"method.response.header.Location": "integration.response.body.redirect.url",
"method.response.header.x-user-id": "integration.response.header.x-userid",
},
responseTemplates={"application/json": json.dumps({"data": "test"})},
)
@ -1068,6 +1088,10 @@ def test_put_integration_response_with_response_template():
"selectionPattern": "foobar",
"ResponseMetadata": {"HTTPStatusCode": 200},
"responseTemplates": {"application/json": json.dumps({"data": "test"})},
"responseParameters": {
"method.response.header.Location": "integration.response.body.redirect.url",
"method.response.header.x-user-id": "integration.response.header.x-userid",
},
}
)