You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2021/10/08 08:53:17 UTC

[johnzon] branch master updated: JOHNZON-353 enum jsonschema validation nulable fix

This is an automated email from the ASF dual-hosted git repository.

rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git


The following commit(s) were added to refs/heads/master by this push:
     new c3360bd  JOHNZON-353 enum jsonschema validation nulable fix
c3360bd is described below

commit c3360bd35e98ff951f19c4eb99a5ff2d567a4673
Author: Romain Manni-Bucau <rm...@gmail.com>
AuthorDate: Fri Oct 8 10:53:14 2021 +0200

    JOHNZON-353 enum jsonschema validation nulable fix
---
 .../jsonschema/spi/builtin/BaseValidation.java     |  4 +-
 .../jsonschema/spi/builtin/EnumValidation.java     |  8 +--
 .../jsonschema/JsonSchemaValidatorTest.java        |  2 +-
 .../jsonschema/spi/builtin/EnumValidationTest.java | 60 ++++++++++++++++++++++
 4 files changed, 68 insertions(+), 6 deletions(-)

diff --git a/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/spi/builtin/BaseValidation.java b/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/spi/builtin/BaseValidation.java
index bb52fbb..35bc621 100644
--- a/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/spi/builtin/BaseValidation.java
+++ b/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/spi/builtin/BaseValidation.java
@@ -29,13 +29,13 @@ import javax.json.JsonValue;
 
 import org.apache.johnzon.jsonschema.ValidationResult;
 
-abstract class BaseValidation implements Function<JsonValue, Stream<ValidationResult.ValidationError>> {
+public abstract class BaseValidation implements Function<JsonValue, Stream<ValidationResult.ValidationError>> {
     protected final String pointer;
     protected final Function<JsonValue, JsonValue> extractor;
     private final JsonValue.ValueType validType;
     private final boolean rootCanBeNull;
 
-    BaseValidation(final String pointer, final Function<JsonValue, JsonValue> extractor, final JsonValue.ValueType validType) {
+    public BaseValidation(final String pointer, final Function<JsonValue, JsonValue> extractor, final JsonValue.ValueType validType) {
         this.pointer = pointer;
         this.extractor = extractor != null ? extractor : v -> v;
         this.rootCanBeNull = extractor != null;
diff --git a/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/spi/builtin/EnumValidation.java b/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/spi/builtin/EnumValidation.java
index 39e6d78..0185841 100644
--- a/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/spi/builtin/EnumValidation.java
+++ b/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/spi/builtin/EnumValidation.java
@@ -37,15 +37,17 @@ public class EnumValidation implements ValidationExtension {
         return ofNullable(model.getSchema().get("enum"))
                 .filter(it -> it.getValueType() == JsonValue.ValueType.ARRAY)
                 .map(JsonValue::asJsonArray)
-                .map(values -> new Impl(values, model.getValueProvider(), model.toPointer()));
+                .map(values -> new Impl(values, model.getValueProvider(), model.toPointer(), JsonValue.TRUE.equals(model.getSchema().get("nullable"))));
     }
 
     private static class Impl extends BaseValidation {
         private final Collection<JsonValue> valid;
+        private final boolean nullable;
 
-        private Impl(final Collection<JsonValue> valid, final Function<JsonValue, JsonValue> extractor, final String pointer) {
+        private Impl(final Collection<JsonValue> valid, final Function<JsonValue, JsonValue> extractor, final String pointer, final boolean nullable) {
             super(pointer, extractor, JsonValue.ValueType.OBJECT /* ignored */);
             this.valid = valid;
+            this.nullable = nullable;
         }
 
         @Override
@@ -54,7 +56,7 @@ public class EnumValidation implements ValidationExtension {
                 return Stream.empty();
             }
             final JsonValue value = extractor.apply(root);
-            if (value != null && JsonValue.ValueType.NULL != value.getValueType()) {
+            if (nullable && (value == null || JsonValue.ValueType.NULL == value.getValueType())) {
                 return Stream.empty();
             }
             if (valid.contains(value)) {
diff --git a/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorTest.java b/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorTest.java
index cefd77b..3331ed3 100644
--- a/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorTest.java
+++ b/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorTest.java
@@ -208,7 +208,7 @@ public class JsonSchemaValidatorTest {
         final ValidationResult failure = validator.apply(jsonFactory.createObjectBuilder().add("name", 5).build());
         assertFalse(failure.isSuccess());
         final Collection<ValidationResult.ValidationError> errors = failure.getErrors();
-        assertEquals(1, errors.size());
+        assertEquals(2, errors.size());
         final ValidationResult.ValidationError error = errors.iterator().next();
         assertEquals("/name", error.getField());
         assertEquals("Expected [NULL, STRING] but got NUMBER", error.getMessage());
diff --git a/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/spi/builtin/EnumValidationTest.java b/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/spi/builtin/EnumValidationTest.java
new file mode 100644
index 0000000..9361483
--- /dev/null
+++ b/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/spi/builtin/EnumValidationTest.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.johnzon.jsonschema.spi.builtin;
+
+import org.apache.johnzon.jsonschema.ValidationResult;
+import org.apache.johnzon.jsonschema.spi.ValidationContext;
+import org.junit.Test;
+
+import javax.json.Json;
+import javax.json.JsonValue;
+import java.util.function.Function;
+import java.util.stream.Stream;
+
+import static org.junit.Assert.assertEquals;
+
+public class EnumValidationTest {
+    @Test
+    public void nullIsValidIfNullable() {
+        final Function<JsonValue, Stream<ValidationResult.ValidationError>> validator = new EnumValidation()
+                .create(new ValidationContext(
+                        new String[]{"/test"},
+                        Json.createObjectBuilder()
+                                .add("type", "string")
+                                .add("nullable", true)
+                                .add("enum", Json.createArrayBuilder()
+                                        .add("A")
+                                        .add("B"))
+                                .build(),
+                        v -> v.asJsonObject().get("test")))
+                .orElseThrow(IllegalStateException::new);
+        assertEquals(0, validator
+                .apply(Json.createObjectBuilder().build())
+                .count());
+        assertEquals(0, validator
+                .apply(Json.createObjectBuilder().addNull("test").build())
+                .count());
+        assertEquals(0, validator
+                .apply(Json.createObjectBuilder().add("test", "A").build())
+                .count());
+        assertEquals(1, validator
+                .apply(Json.createObjectBuilder().add("test", "C").build())
+                .count());
+    }
+}