From 1b5494fa4cd41726f0b9379a9cc076778fe66b7b Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Sat, 13 Nov 2021 18:27:16 +0100 Subject: [PATCH 1/2] fix(parser): apigw body can be null --- aws_lambda_powertools/utilities/parser/models/apigw.py | 2 +- tests/functional/parser/test_apigw.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/utilities/parser/models/apigw.py b/aws_lambda_powertools/utilities/parser/models/apigw.py index 44ddda6e4f1..283a73da9c3 100644 --- a/aws_lambda_powertools/utilities/parser/models/apigw.py +++ b/aws_lambda_powertools/utilities/parser/models/apigw.py @@ -89,4 +89,4 @@ class APIGatewayProxyEventModel(BaseModel): pathParameters: Optional[Dict[str, str]] stageVariables: Optional[Dict[str, str]] isBase64Encoded: bool - body: str + body: Optional[str] diff --git a/tests/functional/parser/test_apigw.py b/tests/functional/parser/test_apigw.py index d657a0dbe4d..35b2fdb1926 100644 --- a/tests/functional/parser/test_apigw.py +++ b/tests/functional/parser/test_apigw.py @@ -1,7 +1,7 @@ import pytest from pydantic import ValidationError -from aws_lambda_powertools.utilities.parser import envelopes, event_parser +from aws_lambda_powertools.utilities.parser import envelopes, event_parser, parse from aws_lambda_powertools.utilities.parser.models import APIGatewayProxyEventModel from aws_lambda_powertools.utilities.typing import LambdaContext from tests.functional.parser.schemas import MyApiGatewayBusiness @@ -144,3 +144,9 @@ def test_apigw_event_with_invalid_websocket_request(): expected_msg = "messageId is available only when the `eventType` is `MESSAGE`" assert errors[0]["msg"] == expected_msg assert expected_msg in str(err.value) + + +def test_apigw_event_empty_body(): + event = load_event("apiGatewayProxyEvent.json") + event["body"] = None + parse(event=event, model=APIGatewayProxyEventModel) From 99d5370ae4764ac695b35afb39795438efedbe3a Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Sat, 13 Nov 2021 19:03:06 +0100 Subject: [PATCH 2/2] fix(parser): apigw v2 body and QS can be null --- .../utilities/parser/models/apigwv2.py | 4 ++-- tests/functional/parser/test_apigwv2.py | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/aws_lambda_powertools/utilities/parser/models/apigwv2.py b/aws_lambda_powertools/utilities/parser/models/apigwv2.py index 4243315bb21..36dd85b907e 100644 --- a/aws_lambda_powertools/utilities/parser/models/apigwv2.py +++ b/aws_lambda_powertools/utilities/parser/models/apigwv2.py @@ -63,9 +63,9 @@ class APIGatewayProxyEventV2Model(BaseModel): rawQueryString: str cookies: Optional[List[str]] headers: Dict[str, str] - queryStringParameters: Dict[str, str] + queryStringParameters: Optional[Dict[str, str]] pathParameters: Optional[Dict[str, str]] stageVariables: Optional[Dict[str, str]] requestContext: RequestContextV2 - body: str + body: Optional[str] isBase64Encoded: bool diff --git a/tests/functional/parser/test_apigwv2.py b/tests/functional/parser/test_apigwv2.py index ee6a4790cd4..d3510b185dd 100644 --- a/tests/functional/parser/test_apigwv2.py +++ b/tests/functional/parser/test_apigwv2.py @@ -1,4 +1,4 @@ -from aws_lambda_powertools.utilities.parser import envelopes, event_parser +from aws_lambda_powertools.utilities.parser import envelopes, event_parser, parse from aws_lambda_powertools.utilities.parser.models import ( APIGatewayProxyEventV2Model, RequestContextV2, @@ -90,3 +90,16 @@ def test_api_gateway_proxy_v2_event_iam_authorizer(): assert iam.principalOrgId == "AwsOrgId" assert iam.userArn == "arn:aws:iam::1234567890:user/Admin" assert iam.userId == "AROA2ZJZYVRE7Y3TUXHH6" + + +def test_apigw_event_empty_body(): + event = load_event("apiGatewayProxyV2Event.json") + event.pop("body") # API GW v2 removes certain keys when no data is passed + parse(event=event, model=APIGatewayProxyEventV2Model) + + +def test_apigw_event_empty_query_strings(): + event = load_event("apiGatewayProxyV2Event.json") + event["rawQueryString"] = "" + event.pop("queryStringParameters") # API GW v2 removes certain keys when no data is passed + parse(event=event, model=APIGatewayProxyEventV2Model)