|
|
@@ -4,10 +4,12 @@ import static com.fasterxml.jackson.databind.node.JsonNodeType.*;
|
|
|
import static org.hamcrest.core.Is.is;
|
|
|
import static org.junit.Assert.*;
|
|
|
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.Map;
|
|
|
|
|
|
import org.junit.Test;
|
|
|
+import org.leumasjaffe.json.schema.tester.AllItemsTester;
|
|
|
import org.leumasjaffe.json.schema.tester.ContainsTester;
|
|
|
import org.leumasjaffe.json.schema.tester.EqualsTester;
|
|
|
import org.leumasjaffe.json.schema.tester.FixedTester;
|
|
|
@@ -15,8 +17,11 @@ import org.leumasjaffe.json.schema.tester.FormatTester;
|
|
|
import org.leumasjaffe.json.schema.tester.ItemsTester;
|
|
|
import org.leumasjaffe.json.schema.tester.MockTester;
|
|
|
import org.leumasjaffe.json.schema.tester.NumberTester;
|
|
|
+import org.leumasjaffe.json.schema.tester.PropertyNameTester;
|
|
|
+import org.leumasjaffe.json.schema.tester.PropertyTester;
|
|
|
import org.leumasjaffe.json.schema.tester.SizeTester;
|
|
|
import org.leumasjaffe.json.schema.tester.StubTester;
|
|
|
+import org.leumasjaffe.json.schema.tester.TypeTester;
|
|
|
import org.leumasjaffe.json.schema.tester.UniqueItemTester;
|
|
|
|
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
|
@@ -25,8 +30,13 @@ import com.fasterxml.jackson.databind.node.BooleanNode;
|
|
|
import com.fasterxml.jackson.databind.node.DoubleNode;
|
|
|
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
|
|
|
import com.fasterxml.jackson.databind.node.NullNode;
|
|
|
+import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
|
import com.fasterxml.jackson.databind.node.TextNode;
|
|
|
|
|
|
+// TODO: patternProperties
|
|
|
+// TODO: dependencies
|
|
|
+// TODO: $ref
|
|
|
+// TODO: additionalItems with mixed results
|
|
|
public class SchemaTest {
|
|
|
private Schema getConstSchema(JsonNode json) {
|
|
|
Map<String, Tester> tests = new HashMap<>();
|
|
|
@@ -65,7 +75,17 @@ public class SchemaTest {
|
|
|
tests.put("contains", new ContainsTester(getNumberSchema()));
|
|
|
return new Schema(tests);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ private Schema getObjectSchema() {
|
|
|
+ Map<String, Tester> tests = new HashMap<>();
|
|
|
+ tests.put("maxProperties", new SizeTester(OBJECT, s -> s <= 3));
|
|
|
+ tests.put("minProperties", new SizeTester(OBJECT, s -> s >= 2));
|
|
|
+ tests.put("required", (StubTester) json -> json.has("string"));
|
|
|
+ tests.put("propertyNames", new PropertyNameTester((StubTester) j -> j.asText().matches("^[a-z]*$")));
|
|
|
+ // TODO Dependencies
|
|
|
+ return new Schema(tests);
|
|
|
+ }
|
|
|
+
|
|
|
@Test
|
|
|
public void testAcceptsAnyIfNoMatchers() {
|
|
|
assertThat(new Schema().acceptedTypes().length, is(Tester.ANY.length));
|
|
|
@@ -162,7 +182,7 @@ public class SchemaTest {
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
- public void testHandlesAdditionalItemsMatcherWhenArrayItems() {
|
|
|
+ public void testHandlesAdditionalMatcherWhenArrayItems() {
|
|
|
Map<String, Tester> tests = new HashMap<>();
|
|
|
tests.put("items", new ItemsTester(getNumberSchema(), getStringSchema()));
|
|
|
tests.put("additionalItems", FixedTester.REJECT);
|
|
|
@@ -183,7 +203,7 @@ public class SchemaTest {
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
- public void testHandlesAdditionalItemsNotCalledIfFailsInItems() {
|
|
|
+ public void testHandlesAdditionalNotCalledIfFailsInItems() {
|
|
|
Map<String, Tester> tests = new HashMap<>();
|
|
|
tests.put("items", new ItemsTester(getNumberSchema(), getStringSchema()));
|
|
|
tests.put("additionalItems", FixedTester.ACCEPT);
|
|
|
@@ -211,4 +231,88 @@ public class SchemaTest {
|
|
|
assertTrue(schema.accepts(node));
|
|
|
}
|
|
|
|
|
|
-}
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testHandlesMultipleTestsForObject() {
|
|
|
+ final ObjectNode object = new ObjectNode(JsonNodeFactory.instance);
|
|
|
+ assertFalse(getObjectSchema().accepts(object));
|
|
|
+ object.set("string", new TextNode("https://google.com"));
|
|
|
+ assertFalse(getObjectSchema().accepts(object));
|
|
|
+ object.set("float", new DoubleNode(0.5));
|
|
|
+ assertTrue(getObjectSchema().accepts(object));
|
|
|
+ object.set("Caps", BooleanNode.TRUE);
|
|
|
+ assertFalse(getObjectSchema().accepts(object));
|
|
|
+ object.remove("Caps");
|
|
|
+ object.set("bool", BooleanNode.TRUE);
|
|
|
+ assertTrue(getObjectSchema().accepts(object));
|
|
|
+ object.set("null", NullNode.getInstance());
|
|
|
+ assertFalse(getObjectSchema().accepts(object));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testHandlesAdditionalMatcherWhenObjectProps() {
|
|
|
+ Map<String, Tester> tests = new HashMap<>();
|
|
|
+ tests.put("properties", new PropertyTester(Arrays.asList(
|
|
|
+ new PropertyTester.Pair("float"::equals, getNumberSchema()),
|
|
|
+ new PropertyTester.Pair("string"::equals, getStringSchema()))));
|
|
|
+ tests.put("additionalProperties", FixedTester.REJECT);
|
|
|
+ Schema schema = new Schema(tests);
|
|
|
+
|
|
|
+ final ObjectNode node = new ObjectNode(JsonNodeFactory.instance);
|
|
|
+ node.set("float", new DoubleNode(0.5));
|
|
|
+ node.set("string", new TextNode("https://google.com"));
|
|
|
+ assertTrue(schema.accepts(node));
|
|
|
+ node.set("boolean", BooleanNode.TRUE);
|
|
|
+ assertFalse(schema.accepts(node));
|
|
|
+
|
|
|
+ tests.put("additionalProperties", FixedTester.ACCEPT);
|
|
|
+ assertTrue(new Schema(tests).accepts(node));
|
|
|
+
|
|
|
+ tests.remove("additionalProperties");
|
|
|
+ assertTrue(new Schema(tests).accepts(node));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testAdditionalPropertiesRunsOnEachUnmatched() {
|
|
|
+ Map<String, Tester> tests = new HashMap<>();
|
|
|
+ tests.put("additionalProperties", new AllItemsTester(OBJECT,
|
|
|
+ TypeTester.fromType("string")));
|
|
|
+ Schema schema = new Schema(tests);
|
|
|
+
|
|
|
+ final ObjectNode node = new ObjectNode(JsonNodeFactory.instance);
|
|
|
+ node.set("string", new TextNode("https://google.com"));
|
|
|
+ assertTrue(schema.accepts(node));
|
|
|
+ node.set("float", new DoubleNode(0.5));
|
|
|
+ assertFalse(schema.accepts(node));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testHandlesAdditionalNotCalledIfFailsInProps() {
|
|
|
+ Map<String, Tester> tests = new HashMap<>();
|
|
|
+ tests.put("properties", new PropertyTester(Arrays.asList(
|
|
|
+ new PropertyTester.Pair("float"::equals, getNumberSchema()),
|
|
|
+ new PropertyTester.Pair("string"::equals, getStringSchema()))));
|
|
|
+ tests.put("additionalProperties", FixedTester.ACCEPT);
|
|
|
+ Schema schema = new Schema(tests);
|
|
|
+
|
|
|
+ final ObjectNode node = new ObjectNode(JsonNodeFactory.instance);
|
|
|
+ node.set("float", new DoubleNode(0.5));
|
|
|
+ node.set("string", new TextNode("https://a"));
|
|
|
+ node.set("boolean", BooleanNode.TRUE);
|
|
|
+ assertFalse(schema.accepts(node));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testHandlesUniversalChecksForObject() {
|
|
|
+ final ObjectNode expected = new ObjectNode(JsonNodeFactory.instance);
|
|
|
+ expected.set("A", BooleanNode.TRUE);
|
|
|
+
|
|
|
+ Map<String, Tester> tests = new HashMap<>();
|
|
|
+ tests.put("const", new EqualsTester(expected));
|
|
|
+ Schema schema = new Schema(tests);
|
|
|
+
|
|
|
+ final ObjectNode node = new ObjectNode(JsonNodeFactory.instance);
|
|
|
+ assertFalse(schema.accepts(node));
|
|
|
+ node.set("A", BooleanNode.TRUE);
|
|
|
+ assertTrue(schema.accepts(node));
|
|
|
+ }}
|