Преглед изворни кода

Add tests for string schemas

Sam Jaffe пре 6 година
родитељ
комит
d5ab7fb85c

+ 12 - 0
src/main/lombok/org/leumasjaffe/json/schema/Schema.java

@@ -25,6 +25,8 @@ public class Schema implements Tester {
 	private static final List<String> NUMBER_MATCHERS = Arrays.asList(
 		"multipleOf", "minimum", "exclusiveMinimum", "maximum",
 		"exclusiveMaximum");
+	private static final List<String> STRING_MATCHERS = Arrays.asList(
+			"maxLength", "minLength", "pattern", "format");
 	Map<String, Tester> children = new HashMap<>();
 	
 	public Schema(Tester self) {
@@ -55,6 +57,7 @@ public class Schema implements Tester {
 		}
 		switch (node.getNodeType()) {
 		case NUMBER: return acceptsNumber(node);
+		case STRING: return acceptsString(node);
 		default: break;
 		}
 		// TODO
@@ -69,6 +72,15 @@ public class Schema implements Tester {
 		}
 		return acceptsUniversal(node);
 	}
+	
+	private boolean acceptsString(JsonNode node) {
+		for (String key : getKeys(STRING_MATCHERS)) {
+			if (!children.get(key).accepts(node)) {
+				return false;
+			}
+		}
+		return acceptsUniversal(node);
+	}
 
 	private boolean acceptsUniversal(JsonNode node) {
 		for (String key : getKeys(UNIVERSAL_MATCHERS)) {

+ 40 - 2
src/test/java/org/leumasjaffe/json/schema/SchemaTest.java

@@ -1,5 +1,6 @@
 package org.leumasjaffe.json.schema;
 
+import static com.fasterxml.jackson.databind.node.JsonNodeType.*;
 import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.*;
 
@@ -8,11 +9,17 @@ import java.util.Map;
 
 import org.junit.Test;
 import org.leumasjaffe.json.schema.tester.EqualsTester;
+import org.leumasjaffe.json.schema.tester.FixedTester;
+import org.leumasjaffe.json.schema.tester.FormatTester;
+import org.leumasjaffe.json.schema.tester.MockTester;
 import org.leumasjaffe.json.schema.tester.NumberTester;
+import org.leumasjaffe.json.schema.tester.SizeTester;
+import org.leumasjaffe.json.schema.tester.StubTester;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.DoubleNode;
 import com.fasterxml.jackson.databind.node.NullNode;
+import com.fasterxml.jackson.databind.node.TextNode;
 
 public class SchemaTest {
 	private Schema getConstSchema(JsonNode json) {
@@ -35,6 +42,15 @@ public class SchemaTest {
 		return new Schema(tests);
 	}
 	
+	private Schema getStringSchema() {
+		Map<String, Tester> tests = new HashMap<>();
+		tests.put("maxLength", new SizeTester(STRING, s -> s <= 30));
+		tests.put("minLength", new SizeTester(STRING, s -> s >= 10));
+		tests.put("pattern", (StubTester) j -> j.asText().matches("^https://.*"));
+		tests.put("format", FormatTester.forCode("uri"));
+		return new Schema(tests);
+	}
+	
 	@Test
 	public void testAcceptsAnyIfNoMatchers() {
 		assertThat(new Schema().acceptedTypes(), is(Tester.ANY));
@@ -42,7 +58,9 @@ public class SchemaTest {
 
 	@Test
 	public void testRejectsWrongType() {
-		assertFalse(getNumberSchema().accepts(NullNode.getInstance()));
+		Map<String, Tester> tests = new HashMap<>();
+		tests.put("example", new MockTester(STRING, FixedTester.ACCEPT));
+		assertFalse(new Schema(tests).accepts(NullNode.getInstance()));
 	}
 
 	@Test
@@ -69,7 +87,7 @@ public class SchemaTest {
 	}
 
 	@Test
-	public void testHandlesUniversalChecks() {		
+	public void testHandlesUniversalChecksForNumber() {
 		assertTrue(getConstSchema(new DoubleNode(0.0)).accepts(new DoubleNode(0.0)));
 		assertFalse(getConstSchema(new DoubleNode(0.0)).accepts(new DoubleNode(0.5)));
 		assertTrue(getEnumSchema(new DoubleNode(0.0), new DoubleNode(1.0))
@@ -79,5 +97,25 @@ public class SchemaTest {
 		assertFalse(getEnumSchema(new DoubleNode(0.0), new DoubleNode(1.0))
 				.accepts(new DoubleNode(0.5)));
 	}
+	
+	@Test
+	public void testHandlesMultipleTestsForString() {
+		assertFalse(getStringSchema().accepts(new TextNode("https://a")));
+		assertTrue(getStringSchema().accepts(new TextNode("https://google.com")));
+		assertFalse(getStringSchema().accepts(new TextNode("http://google.com")));
+		assertFalse(getStringSchema().accepts(new TextNode("https://google.com/query?q=Hippopotomonstrosesquippedaliophobia")));
+	}
+	
+	@Test
+	public void testHandlesUniversalChecksForString() {
+		assertTrue(getConstSchema(new TextNode("A")).accepts(new TextNode("A")));
+		assertFalse(getConstSchema(new TextNode("A")).accepts(new TextNode("C")));
+		assertTrue(getEnumSchema(new TextNode("A"), new TextNode("B"))
+				.accepts(new TextNode("A")));
+		assertTrue(getEnumSchema(new TextNode("A"), new TextNode("B"))
+				.accepts(new TextNode("B")));
+		assertFalse(getEnumSchema(new TextNode("A"), new TextNode("B"))
+				.accepts(new TextNode("C")));
+	}
 
 }

+ 1 - 1
src/test/java/org/leumasjaffe/json/schema/tester/StubTester.java

@@ -4,6 +4,6 @@ import org.leumasjaffe.json.schema.Tester;
 
 import com.fasterxml.jackson.databind.node.JsonNodeType;
 
-interface StubTester extends Tester {
+public interface StubTester extends Tester {
 	default JsonNodeType[] acceptedTypes() { return ANY; }
 }