diff --git a/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py b/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py index 5420d76469f..fc0db9a3b3f 100644 --- a/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +++ b/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py @@ -136,9 +136,8 @@ def handler(self, app: EventHandlerInstance, next_middleware: NextMiddleware) -> return self._handle_response(route=route, response=response) def _handle_response(self, *, route: Route, response: Response): - # Check if we have a return type defined - if route.dependant.return_param: - # Validate and serialize the response, including None + # Process the response body if it exists + if response.body and response.is_json(): response.body = self._serialize_response( field=route.dependant.return_param, response_content=response.body, diff --git a/tests/functional/event_handler/_pydantic/test_openapi_validation_middleware.py b/tests/functional/event_handler/_pydantic/test_openapi_validation_middleware.py index f0b4acc94ad..54425f34986 100644 --- a/tests/functional/event_handler/_pydantic/test_openapi_validation_middleware.py +++ b/tests/functional/event_handler/_pydantic/test_openapi_validation_middleware.py @@ -1128,76 +1128,3 @@ def handler(user_id: int = 123): # THEN the handler should be invoked and return 200 result = app(minimal_event, {}) assert result["statusCode"] == 200 - - -def test_validation_error_none_returned_non_optional_type(gw_event): - # GIVEN an APIGatewayRestResolver with validation enabled - app = APIGatewayRestResolver(enable_validation=True) - - class Model(BaseModel): - name: str - age: int - - @app.get("/none_not_allowed") - def handler_none_not_allowed() -> Model: - return None # type: ignore - - # WHEN returning None for a non-Optional type - gw_event["path"] = "/none_not_allowed" - result = app(gw_event, {}) - - # THEN it should return a validation error - assert result["statusCode"] == 422 - body = json.loads(result["body"]) - assert "model_attributes_type" in body["detail"][0]["type"] - - -def test_none_returned_for_optional_type(gw_event): - # GIVEN an APIGatewayRestResolver with validation enabled - app = APIGatewayRestResolver(enable_validation=True) - - class Model(BaseModel): - name: str - age: int - - @app.get("/none_allowed") - def handler_none_allowed() -> Optional[Model]: - return None - - # WHEN returning None for an Optional type - gw_event["path"] = "/none_allowed" - result = app(gw_event, {}) - - # THEN it should succeed - assert result["statusCode"] == 200 - assert result["body"] == "null" - - -@pytest.mark.parametrize( - "path, body", - [ - ("/empty_dict", {}), - ("/empty_list", []), - ("/none", "null"), - ("/empty_string", ""), - ], - ids=["empty_dict", "empty_list", "none", "empty_string"], -) -def test_none_returned_for_falsy_return(gw_event, path, body): - # GIVEN an APIGatewayRestResolver with validation enabled - app = APIGatewayRestResolver(enable_validation=True) - - class Model(BaseModel): - name: str - age: int - - @app.get(path) - def handler_none_allowed() -> Model: - return body - - # WHEN returning None for an Optional type - gw_event["path"] = path - result = app(gw_event, {}) - - # THEN it should succeed - assert result["statusCode"] == 422