1 package com.networknt.schema; 2 3 import com.fasterxml.jackson.databind.JsonNode; 4 import com.fasterxml.jackson.databind.ObjectMapper; 5 import com.networknt.schema.walk.JsonSchemaWalkListener; 6 import com.networknt.schema.walk.WalkEvent; 7 import com.networknt.schema.walk.WalkFlow; 8 import org.junit.jupiter.api.Assertions; 9 import org.junit.jupiter.api.Test; 10 11 import java.io.InputStream; 12 import java.util.HashMap; 13 import java.util.Map; 14 import java.util.Set; 15 16 /** 17 * Validating anyOf walker 18 */ 19 public class Issue451Test { 20 21 private static final String COLLECTOR_ID = "collector-451"; 22 getJsonSchemaFromStreamContentV7(InputStream schemaContent)23 protected JsonSchema getJsonSchemaFromStreamContentV7(InputStream schemaContent) { 24 JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V7); 25 SchemaValidatorsConfig svc = new SchemaValidatorsConfig(); 26 svc.addPropertyWalkListener(new CountingWalker()); 27 return factory.getSchema(schemaContent, svc); 28 } 29 getJsonNodeFromStreamContent(InputStream content)30 protected JsonNode getJsonNodeFromStreamContent(InputStream content) throws Exception { 31 ObjectMapper mapper = new ObjectMapper(); 32 return mapper.readTree(content); 33 } 34 35 @Test shouldWalkAnyOfProperties()36 public void shouldWalkAnyOfProperties() { 37 walk(null, false); 38 } 39 40 @Test shouldWalkAnyOfPropertiesWithWithPayloadAndValidation()41 public void shouldWalkAnyOfPropertiesWithWithPayloadAndValidation() throws Exception { 42 JsonNode data = getJsonNodeFromStreamContent(Issue451Test.class.getResourceAsStream( 43 "/data/issue451.json")); 44 walk(data,true); 45 } 46 47 @Test shouldWalkAnyOfPropertiesWithWithPayload()48 public void shouldWalkAnyOfPropertiesWithWithPayload() throws Exception { 49 JsonNode data = getJsonNodeFromStreamContent(Issue451Test.class.getResourceAsStream( 50 "/data/issue451.json")); 51 walk(data, false); 52 } 53 54 @SuppressWarnings("unchecked") walk(JsonNode data, boolean shouldValidate)55 private void walk(JsonNode data, boolean shouldValidate) { 56 String schemaPath = "/schema/issue451-v7.json"; 57 InputStream schemaInputStream = getClass().getResourceAsStream(schemaPath); 58 JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream); 59 60 CollectorContext collectorContext = schema.walk(data, shouldValidate).getCollectorContext(); 61 62 Map<String, Integer> collector = (Map<String, Integer>) collectorContext.get(COLLECTOR_ID); 63 Assertions.assertEquals(2, 64 collector.get("https://example.com/issue-451.json#/definitions/definition1/properties/a")); 65 Assertions.assertEquals(2, 66 collector.get("https://example.com/issue-451.json#/definitions/definition2/properties/x")); 67 } 68 69 70 private static class CountingWalker implements JsonSchemaWalkListener { 71 @Override onWalkStart(WalkEvent walkEvent)72 public WalkFlow onWalkStart(WalkEvent walkEvent) { 73 SchemaLocation path = walkEvent.getSchema().getSchemaLocation(); 74 collector(walkEvent.getExecutionContext()).compute(path.toString(), (k, v) -> v == null ? 1 : v + 1); 75 return WalkFlow.CONTINUE; 76 } 77 78 @Override onWalkEnd(WalkEvent walkEvent, Set<ValidationMessage> validationMessages)79 public void onWalkEnd(WalkEvent walkEvent, Set<ValidationMessage> validationMessages) { 80 81 } 82 collector(ExecutionContext executionContext)83 private Map<String, Integer> collector(ExecutionContext executionContext) { 84 @SuppressWarnings("unchecked") 85 Map<String, Integer> collector = (Map<String, Integer>) executionContext.getCollectorContext().get(COLLECTOR_ID); 86 if(collector == null) { 87 collector = new HashMap<>(); 88 executionContext.getCollectorContext().add(COLLECTOR_ID, collector); 89 } 90 91 return collector; 92 } 93 } 94 } 95 96