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 = {