From a6ba3c8f11f893b5c4b1931f07918360a73fc094 Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Tue, 25 Jul 2023 14:39:50 +0200 Subject: [PATCH 1/5] fix(parameters): make cache aware of single vs multiple calls Signed-off-by: heitorlessa --- aws_lambda_powertools/utilities/parameters/base.py | 2 +- aws_lambda_powertools/utilities/parameters/types.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parameters/base.py b/aws_lambda_powertools/utilities/parameters/base.py index 710634636d0..411a2520ae9 100644 --- a/aws_lambda_powertools/utilities/parameters/base.py +++ b/aws_lambda_powertools/utilities/parameters/base.py @@ -27,7 +27,7 @@ from aws_lambda_powertools.shared import constants, user_agent from aws_lambda_powertools.shared.functions import resolve_max_age -from aws_lambda_powertools.utilities.parameters.types import TransformOptions +from aws_lambda_powertools.utilities.parameters.types import RecursiveOptions, TransformOptions from .exceptions import GetParameterError, TransformParameterError diff --git a/aws_lambda_powertools/utilities/parameters/types.py b/aws_lambda_powertools/utilities/parameters/types.py index faa06cee89e..a916f1a344d 100644 --- a/aws_lambda_powertools/utilities/parameters/types.py +++ b/aws_lambda_powertools/utilities/parameters/types.py @@ -1,3 +1,4 @@ from aws_lambda_powertools.shared.types import Literal TransformOptions = Literal["json", "binary", "auto", None] +RecursiveOptions = Literal[True, False] From 10dd31bb4a7d8f4445d12ddbbf2c7356edced974 Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Tue, 25 Jul 2023 15:16:51 +0200 Subject: [PATCH 2/5] chore: cleanup, add test for single and nested Signed-off-by: heitorlessa --- aws_lambda_powertools/utilities/parameters/base.py | 2 +- aws_lambda_powertools/utilities/parameters/types.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/aws_lambda_powertools/utilities/parameters/base.py b/aws_lambda_powertools/utilities/parameters/base.py index 411a2520ae9..710634636d0 100644 --- a/aws_lambda_powertools/utilities/parameters/base.py +++ b/aws_lambda_powertools/utilities/parameters/base.py @@ -27,7 +27,7 @@ from aws_lambda_powertools.shared import constants, user_agent from aws_lambda_powertools.shared.functions import resolve_max_age -from aws_lambda_powertools.utilities.parameters.types import RecursiveOptions, TransformOptions +from aws_lambda_powertools.utilities.parameters.types import TransformOptions from .exceptions import GetParameterError, TransformParameterError diff --git a/aws_lambda_powertools/utilities/parameters/types.py b/aws_lambda_powertools/utilities/parameters/types.py index a916f1a344d..faa06cee89e 100644 --- a/aws_lambda_powertools/utilities/parameters/types.py +++ b/aws_lambda_powertools/utilities/parameters/types.py @@ -1,4 +1,3 @@ from aws_lambda_powertools.shared.types import Literal TransformOptions = Literal["json", "binary", "auto", None] -RecursiveOptions = Literal[True, False] From 7869bc5389e0dab9cd739ce925157ce49d09209b Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Wed, 21 Feb 2024 19:18:04 +0100 Subject: [PATCH 3/5] fix(event-handler): return dict on missing multi_value_headers Signed-off-by: heitorlessa --- .../data_classes/api_gateway_proxy_event.py | 10 +++++----- .../test_openapi_validation_middleware.py | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py b/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py index ff24e908d1a..765d66cf4ec 100644 --- a/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py +++ b/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py @@ -112,7 +112,7 @@ def resource(self) -> str: @property def multi_value_headers(self) -> Dict[str, List[str]]: - return self["multiValueHeaders"] + return self.get("multiValueHeaders") or {} @property def multi_value_query_string_parameters(self) -> Optional[Dict[str, List[str]]]: @@ -141,12 +141,12 @@ def request_context(self) -> APIGatewayEventRequestContext: return APIGatewayEventRequestContext(self._data) @property - def path_parameters(self) -> Optional[Dict[str, str]]: - return self.get("pathParameters") + def path_parameters(self) -> Dict[str, str]: + return self.get("pathParameters") or {} @property - def stage_variables(self) -> Optional[Dict[str, str]]: - return self.get("stageVariables") + def stage_variables(self) -> Dict[str, str]: + return self.get("stageVariables") or {} def header_serializer(self) -> BaseHeadersSerializer: return MultiValueHeadersSerializer() diff --git a/tests/functional/event_handler/test_openapi_validation_middleware.py b/tests/functional/event_handler/test_openapi_validation_middleware.py index a9396644b98..da83f6f92f1 100644 --- a/tests/functional/event_handler/test_openapi_validation_middleware.py +++ b/tests/functional/event_handler/test_openapi_validation_middleware.py @@ -1108,3 +1108,23 @@ def my_path( # THEN the handler should be invoked and return 200 result = app(gw_event_http, {}) assert result["statusCode"] == 200 + + +def test_validate_with_minimal_event(): + # GIVEN an APIGatewayRestResolver with validation enabled + app = APIGatewayRestResolver(enable_validation=True) + + # WHEN a handler is defined with a default scalar parameter + @app.get("/users/") + def handler(user_id: int = 123): + print(user_id) + + minimal_event = { + "path": "/users/123", + "httpMethod": "GET", + "requestContext": {"requestId": "227b78aa-779d-47d4-a48e-ce62120393b8"}, # correlation ID + } + + # THEN the handler should be invoked and return 200 + result = app(minimal_event, {}) + assert result["statusCode"] == 200 From e5daeb34a330131dfcd1cd33083fd44d448dfe1a Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Wed, 21 Feb 2024 19:22:29 +0100 Subject: [PATCH 4/5] chore: default dict for multi query strings too Signed-off-by: heitorlessa --- .../utilities/data_classes/api_gateway_proxy_event.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py b/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py index 765d66cf4ec..220270ffd1a 100644 --- a/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py +++ b/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py @@ -115,8 +115,8 @@ def multi_value_headers(self) -> Dict[str, List[str]]: return self.get("multiValueHeaders") or {} @property - def multi_value_query_string_parameters(self) -> Optional[Dict[str, List[str]]]: - return self.get("multiValueQueryStringParameters") + def multi_value_query_string_parameters(self) -> Dict[str, List[str]]: + return self.get("multiValueQueryStringParameters") or {} @property def resolved_query_string_parameters(self) -> Dict[str, List[str]]: From c944e3be11d15e436e8e4a99e1b7a590ea83de89 Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Wed, 21 Feb 2024 19:27:47 +0100 Subject: [PATCH 5/5] revert: path_parameters and stage_variables unrelated to the issue --- .../utilities/data_classes/api_gateway_proxy_event.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py b/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py index 220270ffd1a..b8ef9c08045 100644 --- a/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py +++ b/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py @@ -141,12 +141,12 @@ def request_context(self) -> APIGatewayEventRequestContext: return APIGatewayEventRequestContext(self._data) @property - def path_parameters(self) -> Dict[str, str]: - return self.get("pathParameters") or {} + def path_parameters(self) -> Optional[Dict[str, str]]: + return self.get("pathParameters") @property - def stage_variables(self) -> Dict[str, str]: - return self.get("stageVariables") or {} + def stage_variables(self) -> Optional[Dict[str, str]]: + return self.get("stageVariables") def header_serializer(self) -> BaseHeadersSerializer: return MultiValueHeadersSerializer()