From fb87de3ff5b7636355ade10254bb435e007bcc4a Mon Sep 17 00:00:00 2001 From: p1c2u Date: Wed, 4 Mar 2026 00:14:02 +0000 Subject: [PATCH] Include root cause in request body validation errors --- openapi_core/validation/request/exceptions.py | 2 ++ .../validation/test_strict_json_validation.py | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/openapi_core/validation/request/exceptions.py b/openapi_core/validation/request/exceptions.py index 95b35805..ae562125 100644 --- a/openapi_core/validation/request/exceptions.py +++ b/openapi_core/validation/request/exceptions.py @@ -21,6 +21,8 @@ class RequestValidationError(ValidationError): class RequestBodyValidationError(RequestValidationError): def __str__(self) -> str: + if self.__cause__ is not None: + return f"Request body validation error: {self.__cause__}" return "Request body validation error" diff --git a/tests/integration/validation/test_strict_json_validation.py b/tests/integration/validation/test_strict_json_validation.py index 939f57f8..738ba9c9 100644 --- a/tests/integration/validation/test_strict_json_validation.py +++ b/tests/integration/validation/test_strict_json_validation.py @@ -167,6 +167,31 @@ def test_request_validator_urlencoded_json_part_strict() -> None: validator.validate(request) +def test_request_validator_error_message_includes_cause_details() -> None: + spec = _spec_schema_path() + validator = V30RequestValidator(spec) + + request_json = { + "id": "123e4567-e89b-12d3-a456-426614174000", + "username": "Test User", + "age": "30", + } + request = MockRequest( + "http://example.com", + "post", + "/users", + content_type="application/json", + data=json.dumps(request_json).encode("utf-8"), + ) + + with pytest.raises(InvalidRequestBody) as exc_info: + validator.validate(request) + + error_message = str(exc_info.value) + assert error_message.startswith("Request body validation error:") + assert "'30' is not of type 'integer'" in error_message + + def test_response_validator_strict_json_nested_types() -> None: """Test that nested JSON structures (arrays, objects) remain strict.""" spec_dict = {