Skip to content

Commit 2d23d65

Browse files
[Feature]: Make ambiguous oneOf violations configurable (#410)
1 parent 873b594 commit 2d23d65

2 files changed

Lines changed: 35 additions & 3 deletions

File tree

‎openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java‎

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,23 @@
44
import com.getyourguide.openapi.validation.api.exclusions.ViolationExclusions;
55
import com.getyourguide.openapi.validation.api.model.Direction;
66
import com.getyourguide.openapi.validation.api.model.OpenApiViolation;
7-
import lombok.AllArgsConstructor;
87

9-
@AllArgsConstructor
108
public class InternalViolationExclusions {
119

1210
private final ViolationExclusions customViolationExclusions;
11+
private final boolean ignoreAmbiguousOneOfViolations;
12+
13+
public InternalViolationExclusions(ViolationExclusions customViolationExclusions) {
14+
this(customViolationExclusions, true);
15+
}
16+
17+
public InternalViolationExclusions(
18+
ViolationExclusions customViolationExclusions,
19+
boolean ignoreAmbiguousOneOfViolations
20+
) {
21+
this.customViolationExclusions = customViolationExclusions;
22+
this.ignoreAmbiguousOneOfViolations = ignoreAmbiguousOneOfViolations;
23+
}
1324

1425
public boolean isExcluded(OpenApiViolation violation) {
1526
return falsePositive204(violation)
@@ -18,7 +29,7 @@ public boolean isExcluded(OpenApiViolation violation) {
1829
|| falsePositive406(violation)
1930
|| falsePositiveRequestWith4xxResponse(violation)
2031
|| customViolationExclusions.isExcluded(violation)
21-
|| oneOfMatchesMoreThanOneSchema(violation)
32+
|| (ignoreAmbiguousOneOfViolations && oneOfMatchesMoreThanOneSchema(violation))
2233
|| isConcurrentModificationExceptionInLibrary(violation)
2334
|| isUnhandledUncheckedExecutionExceptionInLibrary(violation);
2435
}

‎openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusionsTest.java‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,27 @@ public void whenInstanceFailedToMatchExactlyOneThenViolationExcluded() {
5959
.message("[Path '/v1/endpoint'] Instance failed to match exactly one schema (matched 2 out of 4)").build());
6060
}
6161

62+
@Test
63+
public void whenAmbiguousOneOfViolationsAreIgnoredThenViolationExcluded() {
64+
violationExclusions = new InternalViolationExclusions(customViolationExclusions, true);
65+
when(customViolationExclusions.isExcluded(any())).thenReturn(false);
66+
67+
checkViolationExcluded(OpenApiViolation.builder()
68+
.rule("validation.response.body.schema.oneOf")
69+
.message("[Path '/v1/endpoint'] Instance failed to match exactly one schema (matched 2 out of 4)").build());
70+
}
71+
72+
@Test
73+
public void whenAmbiguousOneOfViolationsAreNotIgnoredThenViolationNotExcluded() {
74+
violationExclusions = new InternalViolationExclusions(customViolationExclusions, false);
75+
when(customViolationExclusions.isExcluded(any())).thenReturn(false);
76+
77+
checkViolationNotExcluded(OpenApiViolation.builder()
78+
.rule("validation.response.body.schema.oneOf")
79+
.message("[Path '/v1/endpoint'] Instance failed to match exactly one schema (matched 2 out of 4)")
80+
.build());
81+
}
82+
6283
@Test
6384
public void whenInstanceFailedToMatchExactlyOneWithOneOf24ThenViolationExcluded() {
6485
when(customViolationExclusions.isExcluded(any())).thenReturn(false);

0 commit comments

Comments
 (0)