• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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