From c0d3a287d3f473ebb4e942040610d3e071cc1d71 Mon Sep 17 00:00:00 2001 From: Patrick Boettcher
Date: Thu, 2 May 2019 17:11:38 +0200 Subject: [PATCH] fix #55: make additionalProperties-error-message clearer Done this by using sub-error-handler of type first_error_handler and constructing a message. --- src/json-validator.cpp | 9 +++++++-- test/errors.cpp | 21 +++++++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/json-validator.cpp b/src/json-validator.cpp index 783c8d1..5db8b23 100644 --- a/src/json-validator.cpp +++ b/src/json-validator.cpp @@ -791,9 +791,14 @@ class object : public schema a_prop_or_pattern_matched = true; schema_pp.second->validate(ptr / p.key(), p.value(), e); } + // check additionalProperties as a last resort - if (!a_prop_or_pattern_matched && additionalProperties_) - additionalProperties_->validate(ptr / p.key(), p.value(), e); + if (!a_prop_or_pattern_matched && additionalProperties_) { + first_error_handler additional_prop_err; + additionalProperties_->validate(ptr / p.key(), p.value(), additional_prop_err); + if (additional_prop_err) + e.error(ptr, instance, "validation failed for additional property '" + p.key() + "': " + additional_prop_err.message_); + } } for (auto &dep : dependencies_) { diff --git a/test/errors.cpp b/test/errors.cpp index dfa6b88..e862379 100644 --- a/test/errors.cpp +++ b/test/errors.cpp @@ -45,6 +45,7 @@ static json person_schema = R"( "name", "age" ], + "additionalProperties": false, "type": "object" })"_json; @@ -88,19 +89,20 @@ int main(void) validator.validate({{"age", 42}}, err); // no name - EXPECT_EQ(err.failed_pointers[0].to_string(), ""); EXPECT_EQ(err.failed_pointers.size(), 1); + EXPECT_EQ(err.failed_pointers[0].to_string(), ""); err.reset(); validator.validate({{"street", "Boulevard"}}, err); // no name and no age + EXPECT_EQ(err.failed_pointers.size(), 3); EXPECT_EQ(err.failed_pointers[0].to_string(), ""); EXPECT_EQ(err.failed_pointers[1].to_string(), ""); - EXPECT_EQ(err.failed_pointers.size(), 2); + EXPECT_EQ(err.failed_pointers[2].to_string(), ""); err.reset(); validator.validate({{"age", 42}, {"name", 12}}, err); // name must be a string - EXPECT_EQ(err.failed_pointers[0].to_string(), "/name"); EXPECT_EQ(err.failed_pointers.size(), 1); + EXPECT_EQ(err.failed_pointers[0].to_string(), "/name"); err.reset(); validator.validate({ @@ -109,8 +111,19 @@ int main(void) {"phones", {1234, "223"}}, }, err); // name must be a string - EXPECT_EQ(err.failed_pointers[0].to_string(), "/phones/1"); EXPECT_EQ(err.failed_pointers.size(), 1); + EXPECT_EQ(err.failed_pointers[0].to_string(), "/phones/1"); + err.reset(); + + validator.validate({ + {"age", 42}, + {"name", "John"}, + {"phones", {0}}, + {"post-code", 12345}, + }, + err); // name must be a string + EXPECT_EQ(err.failed_pointers.size(), 1); + EXPECT_EQ(err.failed_pointers[0].to_string(), ""); err.reset(); return error_count;