Skip to content

Commit e650512

Browse files
authored
Merge pull request #1159 from python-openapi/fix/stable-error-messages-additional-properties
Fix unstable error message for additional properties
2 parents 8028f14 + d394926 commit e650512

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

openapi_core/validation/schemas/_validators.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def iter_missing_additional_properties_errors(
7676
if "additionalProperties" in schema:
7777
return
7878

79-
extras = set(find_additional_properties(instance, schema))
79+
extras = sorted(set(find_additional_properties(instance, schema)))
8080

8181
if extras:
8282
error = "Additional properties are not allowed (%s %s unexpected)"

tests/integration/validation/test_additional_properties_default_policy.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,43 @@ def test_response_validation_strict_rejects_extra_properties():
134134
openapi.validate_response(request, response)
135135

136136

137+
def test_request_validation_strict_error_message_is_stable():
138+
"""Test that error messages are deterministic when multiple extra properties exist."""
139+
config = Config(additional_properties_default_policy="forbid")
140+
openapi = OpenAPI.from_dict(_spec_dict(), config=config)
141+
142+
request = MockRequest(
143+
"http://example.com",
144+
"post",
145+
"/tags",
146+
content_type="application/json",
147+
data=json.dumps(
148+
{
149+
"tag_name": "my-tag",
150+
"zebra": "z data",
151+
"apple": "a data",
152+
"mango": "m data",
153+
}
154+
).encode("utf-8"),
155+
)
156+
157+
# Collect error messages from multiple validation attempts
158+
messages = []
159+
for _ in range(10):
160+
with pytest.raises(InvalidRequestBody) as exc_info:
161+
openapi.validate_request(request)
162+
messages.append(str(exc_info.value))
163+
164+
assert (
165+
len(set(messages)) == 1
166+
), f"Error messages are not stable: {messages}"
167+
168+
error_message = messages[0]
169+
assert (
170+
"'apple', 'mango', 'zebra'" in error_message
171+
), f"Properties not in alphabetical order: {error_message}"
172+
173+
137174
def test_response_validation_strict_allows_explicit_additional_properties_true():
138175
spec_dict = _spec_dict()
139176
spec_dict["components"]["schemas"]["Tag"]["additionalProperties"] = True

0 commit comments

Comments
 (0)