summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarald Nezbeda <hn@nezhar.com>2021-06-30 14:05:46 +0200
committerHarald Nezbeda <hn@nezhar.com>2021-07-20 17:08:48 +0200
commit769478dc39395e16bce1943c691abf5719cf5bb7 (patch)
tree2c69032e7933b53f0d3b5e9d7e99a1d28a278637
parent95742b4573b81d0b1e3a4f4be8c1f4238689eb6c (diff)
downloadjsonschema-769478dc39395e16bce1943c691abf5719cf5bb7.tar.gz
Julian/jsonschema#782: Update validation message for unevaluatedProperties and unevaluatedItems
-rw-r--r--jsonschema/_validators.py14
-rw-r--r--jsonschema/tests/test_validators.py34
2 files changed, 46 insertions, 2 deletions
diff --git a/jsonschema/_validators.py b/jsonschema/_validators.py
index 3d4f4b8..c2c136f 100644
--- a/jsonschema/_validators.py
+++ b/jsonschema/_validators.py
@@ -512,12 +512,17 @@ def unevaluatedItems(validator, unevaluatedItems, instance, schema):
evaluated_item_indexes = find_evaluated_item_indexes_by_schema(
validator, instance, schema
)
+ unevaluated_items = []
for k, v in enumerate(instance):
if k not in evaluated_item_indexes:
for error in validator.descend(
v, unevaluatedItems, schema_path="unevaluatedItems"
):
- yield error
+ unevaluated_items.append(v)
+
+ if len(unevaluated_items):
+ error = "Unevaluated items are not allowed (%s %s unexpected)"
+ yield ValidationError(error % extras_msg(unevaluated_items))
def unevaluatedProperties(validator, unevaluatedProperties, instance, schema):
@@ -527,6 +532,7 @@ def unevaluatedProperties(validator, unevaluatedProperties, instance, schema):
evaluated_property_keys = find_evaluated_property_keys_by_schema(
validator, instance, schema
)
+ unevaluated_property_keys = []
for property, subschema in instance.items():
if property not in evaluated_property_keys:
for error in validator.descend(
@@ -535,7 +541,11 @@ def unevaluatedProperties(validator, unevaluatedProperties, instance, schema):
path=property,
schema_path=property,
):
- yield error
+ unevaluated_property_keys.append(property)
+
+ if len(unevaluated_property_keys):
+ error = "Unevaluated properties are not allowed (%s %s unexpected)"
+ yield ValidationError(error % extras_msg(unevaluated_property_keys))
def prefixItems(validator, prefixItems, instance, schema):
diff --git a/jsonschema/tests/test_validators.py b/jsonschema/tests/test_validators.py
index fc6a239..bb3fefb 100644
--- a/jsonschema/tests/test_validators.py
+++ b/jsonschema/tests/test_validators.py
@@ -383,6 +383,40 @@ class TestValidationErrorMessages(TestCase):
)
self.assertIn("False schema does not allow 'something'", message)
+ def test_unevaluated_properties(self):
+ schema = {
+ "type": "object",
+ "unevaluatedProperties": False
+ }
+ message = self.message_for(
+ instance={
+ "foo": "foo",
+ "bar": "bar",
+ },
+ schema=schema,
+ cls=validators.Draft202012Validator,
+ )
+ self.assertIn(
+ "Unevaluated properties are not allowed "
+ "('foo', 'bar' were unexpected)",
+ message,
+ )
+
+ def test_unevaluated_items(self):
+ schema = {
+ "type": "array",
+ "unevaluatedItems": False
+ }
+ message = self.message_for(
+ instance=["foo", "bar"],
+ schema=schema,
+ cls=validators.Draft202012Validator,
+ )
+ self.assertIn(
+ "Unevaluated items are not allowed ('foo', 'bar' were unexpected)",
+ message,
+ )
+
class TestValidationErrorDetails(TestCase):
# TODO: These really need unit tests for each individual validator, rather