Skip to content

Commit 29ddf86

Browse files
feat: make ambiguous oneOf violations configurable
1 parent 9f52f9c commit 29ddf86

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,20 +4,31 @@
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 falsePositive404(violation)
1627
|| falsePositive405(violation)
1728
|| falsePositive406(violation)
1829
|| falsePositiveRequestWith4xxResponse(violation)
1930
|| customViolationExclusions.isExcluded(violation)
20-
|| oneOfMatchesMoreThanOneSchema(violation)
31+
|| (ignoreAmbiguousOneOfViolations && oneOfMatchesMoreThanOneSchema(violation))
2132
|| isConcurrentModificationExceptionInLibrary(violation)
2233
|| isUnhandledUncheckedExecutionExceptionInLibrary(violation);
2334
}

‎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
@@ -58,6 +58,27 @@ public void whenInstanceFailedToMatchExactlyOneThenViolationExcluded() {
5858
.message("[Path '/v1/endpoint'] Instance failed to match exactly one schema (matched 2 out of 4)").build());
5959
}
6060

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

0 commit comments

Comments
 (0)