Skip to content

Commit 1c163d9

Browse files
committed
Implement failure reporting for ConditionalSchema.
1 parent f939a70 commit 1c163d9

File tree

2 files changed

+76
-16
lines changed

2 files changed

+76
-16
lines changed

core/src/main/java/org/everit/json/schema/ValidatingVisitor.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static org.everit.json.schema.EnumSchema.toJavaValue;
55

66
import java.util.ArrayList;
7+
import java.util.Arrays;
78
import java.util.Collection;
89
import java.util.List;
910

@@ -144,12 +145,33 @@ void visitConditionalSchema(ConditionalSchema conditionalSchema) {
144145
(!conditionalSchema.getThenSchema().isPresent() && !conditionalSchema.getElseSchema().isPresent())) {
145146
return;
146147
}
147-
ValidationException exception = getFailureOfSchema(conditionalSchema.getIfSchema().get(), subject);
148-
if (exception != null) {
149-
conditionalSchema.getElseSchema().ifPresent(elseSchema -> elseSchema.validate(subject));
148+
ValidationException ifSchemaException = getFailureOfSchema(conditionalSchema.getIfSchema().get(), subject);
149+
if (ifSchemaException != null) {
150+
if (conditionalSchema.getElseSchema().isPresent()) {
151+
ValidationException elseSchemaException = getFailureOfSchema(conditionalSchema.getElseSchema().get(), subject);
152+
if (elseSchemaException != null) {
153+
failureReporter.failure(new ValidationException(conditionalSchema,
154+
new StringBuilder(new StringBuilder("#")),
155+
"Data is invalid for schema of both \"if\" and \"else\" ",
156+
Arrays.asList(ifSchemaException, elseSchemaException),
157+
"else",
158+
conditionalSchema.getSchemaLocation()));
159+
}
160+
}
150161
return;
151162
}
152-
conditionalSchema.getThenSchema().ifPresent(schema -> schema.validate(subject));
163+
if (conditionalSchema.getThenSchema().isPresent()) {
164+
Schema schema = conditionalSchema.getThenSchema().get();
165+
ValidationException thenSchemaException = getFailureOfSchema(schema, subject);
166+
if (thenSchemaException != null) {
167+
failureReporter.failure(new ValidationException(conditionalSchema,
168+
new StringBuilder(new StringBuilder("#")),
169+
"Data is invalid for schema of \"then\" ",
170+
Arrays.asList(thenSchemaException),
171+
"then",
172+
conditionalSchema.getSchemaLocation()));
173+
}
174+
}
153175
}
154176

155177
ValidationException getFailureOfSchema(Schema schema, Object input) {

core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import org.junit.Test;
44

5+
import static org.everit.json.schema.TestSupport.buildWithLocation;
6+
57
public class ConditionalSchemaTest {
68

79
private static final StringSchema MAX_LENGTH_STRING_SCHEMA = StringSchema.builder().maxLength(4).build();
@@ -46,9 +48,15 @@ public void onlyElseSuccess() {
4648

4749
// if-then
4850

49-
@Test(expected = ValidationException.class)
51+
@Test
5052
public void ifSubschemaSuccessThenSubschemaFailure() {
51-
ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).thenSchema(PATTERN_STRING_SCHEMA).build().validate("bar");
53+
ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).thenSchema(PATTERN_STRING_SCHEMA));
54+
TestSupport.failureOf(subject)
55+
.expectedKeyword("then")
56+
.expectedPointer("#")
57+
.expectedViolatedSchema(subject)
58+
.input("bar")
59+
.expect();
5260
}
5361

5462
@Test
@@ -73,9 +81,15 @@ public void ifSubschemaSuccessElseSubschemaFailure() {
7381
ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(PATTERN_STRING_SCHEMA).build().validate("bar");
7482
}
7583

76-
@Test(expected = ValidationException.class)
84+
@Test
7785
public void ifSubschemaFailureElseSubschemaFailure() {
78-
ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("barbar");
86+
ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA));
87+
TestSupport.failureOf(subject)
88+
.expectedKeyword("else")
89+
.expectedPointer("#")
90+
.expectedViolatedSchema(subject)
91+
.input("barbar")
92+
.expect();
7993
}
8094

8195
@Test
@@ -122,34 +136,58 @@ public void ifSubschemaSuccessThenSubschemaSuccessElseSubSchemaFailure() {
122136
ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("foo");
123137
}
124138

125-
@Test(expected = ValidationException.class)
139+
@Test
126140
public void ifSubschemaSuccessThenSubschemaFailureElseSubSchemaSuccess() {
127-
ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("foobar");
141+
ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA));
142+
TestSupport.failureOf(subject)
143+
.expectedKeyword("then")
144+
.expectedPointer("#")
145+
.expectedViolatedSchema(subject)
146+
.input("foobar")
147+
.expect();
128148
}
129149

130-
@Test(expected = ValidationException.class)
150+
@Test
131151
public void ifSubschemaSuccessThenSubschemaFailureElseSubSchemaFailure() {
132-
ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("foooo");
152+
ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA));
153+
TestSupport.failureOf(subject)
154+
.expectedKeyword("then")
155+
.expectedPointer("#")
156+
.expectedViolatedSchema(subject)
157+
.input("foooo")
158+
.expect();
133159
}
134160

135161
@Test
136162
public void ifSubschemaFailureThenSubschemaSuccessElseSubSchemaSuccess() {
137163
ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).thenSchema(PATTERN_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("foobar");
138164
}
139165

140-
@Test(expected = ValidationException.class)
166+
@Test
141167
public void ifSubschemaFailureThenSubschemaSuccessElseSubSchemaFailure() {
142-
ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("bar");
168+
ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA));
169+
TestSupport.failureOf(subject)
170+
.expectedKeyword("else")
171+
.expectedPointer("#")
172+
.expectedViolatedSchema(subject)
173+
.input("bar")
174+
.expect();
143175
}
144176

145177
@Test
146178
public void ifSubschemaFailureThenSubschemaFailureElseSubSchemaSuccess() {
147179
ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MIN_LENGTH_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("bar");
148180
}
149181

150-
@Test(expected = ValidationException.class)
182+
@Test
151183
public void ifSubschemaFailureThenSubschemaFailureElseSubSchemaFailure() {
152-
ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MIN_LENGTH_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("barbarbar");
184+
ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MIN_LENGTH_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA));
185+
TestSupport.failureOf(subject)
186+
.expectedKeyword("else")
187+
.expectedPointer("#")
188+
.expectedViolatedSchema(subject)
189+
.input("barbarbar")
190+
.expect();
153191
}
154192

155193
}

0 commit comments

Comments
 (0)