Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion openapi_core/validation/schemas/_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ def iter_missing_additional_properties_errors(
if "additionalProperties" in schema:
return

extras = set(find_additional_properties(instance, schema))
extras = sorted(set(find_additional_properties(instance, schema)))

if extras:
error = "Additional properties are not allowed (%s %s unexpected)"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,43 @@ def test_response_validation_strict_rejects_extra_properties():
openapi.validate_response(request, response)


def test_request_validation_strict_error_message_is_stable():
"""Test that error messages are deterministic when multiple extra properties exist."""
config = Config(additional_properties_default_policy="forbid")
openapi = OpenAPI.from_dict(_spec_dict(), config=config)

request = MockRequest(
"http://example.com",
"post",
"/tags",
content_type="application/json",
data=json.dumps(
{
"tag_name": "my-tag",
"zebra": "z data",
"apple": "a data",
"mango": "m data",
}
).encode("utf-8"),
)

# Collect error messages from multiple validation attempts
messages = []
for _ in range(10):
with pytest.raises(InvalidRequestBody) as exc_info:
openapi.validate_request(request)
messages.append(str(exc_info.value))

assert (
len(set(messages)) == 1
), f"Error messages are not stable: {messages}"

error_message = messages[0]
assert (
"'apple', 'mango', 'zebra'" in error_message
), f"Properties not in alphabetical order: {error_message}"


def test_response_validation_strict_allows_explicit_additional_properties_true():
spec_dict = _spec_dict()
spec_dict["components"]["schemas"]["Tag"]["additionalProperties"] = True
Expand Down
Loading