1 package com.networknt.schema; 2 3 import com.fasterxml.jackson.core.JsonProcessingException; 4 import com.fasterxml.jackson.databind.ObjectMapper; 5 import org.junit.jupiter.api.Test; 6 7 import java.io.IOException; 8 import java.util.Set; 9 import java.util.stream.Collectors; 10 11 import static org.hamcrest.MatcherAssert.assertThat; 12 import static org.hamcrest.Matchers.contains; 13 import static org.hamcrest.Matchers.empty; 14 15 class DependentRequiredTest { 16 17 public static final String SCHEMA = 18 "{ " + 19 " \"$schema\":\"https://json-schema.org/draft/2019-09/schema\"," + 20 " \"type\": \"object\"," + 21 " \"properties\": {" + 22 " \"optional\": \"string\"," + 23 " \"requiredWhenOptionalPresent\": \"string\"" + 24 " }," + 25 " \"dependentRequired\": {" + 26 " \"optional\": [ \"requiredWhenOptionalPresent\" ]," + 27 " \"otherOptional\": [ \"otherDependentRequired\" ]" + 28 " }" + 29 "}"; 30 31 private static final JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V201909); 32 private static final JsonSchema schema = factory.getSchema(SCHEMA); 33 private static final ObjectMapper mapper = new ObjectMapper(); 34 35 @Test shouldReturnNoErrorMessagesForObjectWithoutOptionalField()36 void shouldReturnNoErrorMessagesForObjectWithoutOptionalField() throws IOException { 37 38 Set<ValidationMessage> messages = whenValidate("{}"); 39 40 assertThat(messages, empty()); 41 } 42 43 @Test shouldReturnErrorMessageForObjectWithoutDependentRequiredField()44 void shouldReturnErrorMessageForObjectWithoutDependentRequiredField() throws IOException { 45 46 Set<ValidationMessage> messages = whenValidate("{ \"optional\": \"present\" }"); 47 48 assertThat( 49 messages.stream().map(ValidationMessage::getMessage).collect(Collectors.toList()), 50 contains("$: has a missing property 'requiredWhenOptionalPresent' which is dependent required because 'optional' is present")); 51 } 52 53 @Test shouldReturnNoErrorMessagesForObjectWithOptionalAndDependentRequiredFieldSet()54 void shouldReturnNoErrorMessagesForObjectWithOptionalAndDependentRequiredFieldSet() throws JsonProcessingException { 55 56 Set<ValidationMessage> messages = 57 whenValidate("{ \"optional\": \"present\", \"requiredWhenOptionalPresent\": \"present\" }"); 58 59 assertThat(messages, empty()); 60 } 61 whenValidate(String content)62 private static Set<ValidationMessage> whenValidate(String content) throws JsonProcessingException { 63 return schema.validate(mapper.readTree(content)); 64 } 65 66 }