From 3e3510282f128cb2f0d6a954624d36c2db17094f Mon Sep 17 00:00:00 2001 From: Patrick Boos Date: Tue, 17 Oct 2023 11:34:04 +0200 Subject: [PATCH 1/9] Add failing test --- .../InternalViolationExclusionsTest.java | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusionsTest.java b/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusionsTest.java index c18526a5..53b0509e 100644 --- a/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusionsTest.java +++ b/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusionsTest.java @@ -24,7 +24,7 @@ public void setup() { } @Test - public void testWhenViolationThenViolationNotExcluded() { + public void whenViolation_thenViolationNotExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(false); checkViolationNotExcluded(buildSimpleViolation(Direction.RESPONSE, 404)); @@ -44,14 +44,14 @@ private static OpenApiViolation buildSimpleViolation(Direction direction, Intege } @Test - public void testWhenCustomViolationExclusionThenViolationExcluded() { + public void whenCustomViolationExclusion_thenViolationExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(true); checkViolationExcluded(OpenApiViolation.builder().build()); } @Test - public void testWhenInstanceFailedToMatchExactlyOneThenViolationExcluded() { + public void whenInstanceFailedToMatchExactlyOne_thenViolationExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(false); checkViolationExcluded(OpenApiViolation.builder() @@ -60,7 +60,7 @@ public void testWhenInstanceFailedToMatchExactlyOneThenViolationExcluded() { } @Test - public void testWhenInstanceFailedToMatchExactlyOneWithOneOf24ThenViolationExcluded() { + public void whenInstanceFailedToMatchExactlyOneWithOneOf24_thenViolationExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(false); checkViolationExcluded(OpenApiViolation.builder() @@ -70,7 +70,7 @@ public void testWhenInstanceFailedToMatchExactlyOneWithOneOf24ThenViolationExclu } @Test - public void testWhen404ResponseWithApiPathNotSpecifiedThenViolationExcluded() { + public void when404ResponseWithApiPathNotSpecified_ThenViolationExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(false); checkViolationExcluded(OpenApiViolation.builder() @@ -82,7 +82,7 @@ public void testWhen404ResponseWithApiPathNotSpecifiedThenViolationExcluded() { } @Test - public void testWhenRequestWithApiPathNotSpecifiedThenViolationExcluded() { + public void whenRequestWithApiPathNotSpecified_thenViolationExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(false); checkViolationExcluded(OpenApiViolation.builder() @@ -94,7 +94,7 @@ public void testWhenRequestWithApiPathNotSpecifiedThenViolationExcluded() { } @Test - public void testWhenRequestViolationsAnd400ThenViolationExcluded() { + public void whenRequestViolationsAnd400_thenViolationExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(false); checkViolationExcluded(OpenApiViolation.builder() @@ -104,6 +104,25 @@ public void testWhenRequestViolationsAnd400ThenViolationExcluded() { .build()); } + @Test + public void when405ResponseCodeWithOperationNotAllowedViolation_thenViolationExcluded() { + when(customViolationExclusions.isExcluded(any())).thenReturn(false); + + checkViolationExcluded(OpenApiViolation.builder() + .direction(Direction.REQUEST) + .rule("validation.request.operation.notAllowed") + .responseStatus(Optional.of(405)) + .message("") + .build()); + + checkViolationExcluded(OpenApiViolation.builder() + .direction(Direction.RESPONSE) + .rule("validation.request.operation.notAllowed") + .responseStatus(Optional.of(405)) + .message("") + .build()); + } + private void checkViolationNotExcluded(OpenApiViolation violation) { var isExcluded = violationExclusions.isExcluded(violation); From 90087e2df3db4766d93f406db70a9b83c7f40202 Mon Sep 17 00:00:00 2001 From: Patrick Boos Date: Tue, 17 Oct 2023 11:34:47 +0200 Subject: [PATCH 2/9] [bugfix] 405 with `operation.notAllowed` should be excluded --- .../core/exclusions/InternalViolationExclusions.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java b/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java index 5c5f9ae2..a198e95e 100644 --- a/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java +++ b/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java @@ -12,6 +12,7 @@ public class InternalViolationExclusions { public boolean isExcluded(OpenApiViolation violation) { return falsePositive404(violation) || falsePositive400(violation) + || falsePositive405(violation) || customViolationExclusions.isExcluded(violation) || oneOfMatchesMoreThanOneSchema(violation); } @@ -36,4 +37,9 @@ private boolean falsePositive404(OpenApiViolation violation) { private boolean falsePositive400(OpenApiViolation violation) { return violation.getDirection() == Direction.REQUEST && violation.getResponseStatus().orElse(0) == 400; } + + private boolean falsePositive405(OpenApiViolation violation) { + return violation.getResponseStatus().orElse(0) == 405 + && "validation.request.operation.notAllowed".equals(violation.getRule()); + } } From 41ac31b5c566cbafa17aaae476b691fcda028491 Mon Sep 17 00:00:00 2001 From: Patrick Boos Date: Tue, 17 Oct 2023 11:51:21 +0200 Subject: [PATCH 3/9] Fix PMD --- .../InternalViolationExclusionsTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusionsTest.java b/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusionsTest.java index 53b0509e..827faa41 100644 --- a/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusionsTest.java +++ b/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusionsTest.java @@ -24,7 +24,7 @@ public void setup() { } @Test - public void whenViolation_thenViolationNotExcluded() { + public void whenViolationThenViolationNotExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(false); checkViolationNotExcluded(buildSimpleViolation(Direction.RESPONSE, 404)); @@ -44,14 +44,14 @@ private static OpenApiViolation buildSimpleViolation(Direction direction, Intege } @Test - public void whenCustomViolationExclusion_thenViolationExcluded() { + public void whenCustomViolationExclusionThenViolationExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(true); checkViolationExcluded(OpenApiViolation.builder().build()); } @Test - public void whenInstanceFailedToMatchExactlyOne_thenViolationExcluded() { + public void whenInstanceFailedToMatchExactlyOneThenViolationExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(false); checkViolationExcluded(OpenApiViolation.builder() @@ -60,7 +60,7 @@ public void whenInstanceFailedToMatchExactlyOne_thenViolationExcluded() { } @Test - public void whenInstanceFailedToMatchExactlyOneWithOneOf24_thenViolationExcluded() { + public void whenInstanceFailedToMatchExactlyOneWithOneOf24ThenViolationExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(false); checkViolationExcluded(OpenApiViolation.builder() @@ -70,7 +70,7 @@ public void whenInstanceFailedToMatchExactlyOneWithOneOf24_thenViolationExcluded } @Test - public void when404ResponseWithApiPathNotSpecified_ThenViolationExcluded() { + public void when404ResponseWithApiPathNotSpecifiedThenViolationExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(false); checkViolationExcluded(OpenApiViolation.builder() @@ -82,7 +82,7 @@ public void when404ResponseWithApiPathNotSpecified_ThenViolationExcluded() { } @Test - public void whenRequestWithApiPathNotSpecified_thenViolationExcluded() { + public void whenRequestWithApiPathNotSpecifiedThenViolationExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(false); checkViolationExcluded(OpenApiViolation.builder() @@ -94,7 +94,7 @@ public void whenRequestWithApiPathNotSpecified_thenViolationExcluded() { } @Test - public void whenRequestViolationsAnd400_thenViolationExcluded() { + public void whenRequestViolationsAnd400ThenViolationExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(false); checkViolationExcluded(OpenApiViolation.builder() @@ -105,7 +105,7 @@ public void whenRequestViolationsAnd400_thenViolationExcluded() { } @Test - public void when405ResponseCodeWithOperationNotAllowedViolation_thenViolationExcluded() { + public void when405ResponseCodeWithOperationNotAllowedViolationThenViolationExcluded() { when(customViolationExclusions.isExcluded(any())).thenReturn(false); checkViolationExcluded(OpenApiViolation.builder() From 4f1e42b6261a559c24cd50f227005d39d3c960c4 Mon Sep 17 00:00:00 2001 From: Patrick Boos Date: Tue, 17 Oct 2023 11:51:44 +0200 Subject: [PATCH 4/9] Fix if optional is null in OpenApiViolation --- .../api/model/OpenApiViolation.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/model/OpenApiViolation.java b/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/model/OpenApiViolation.java index f69c5b60..29835352 100644 --- a/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/model/OpenApiViolation.java +++ b/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/model/OpenApiViolation.java @@ -21,4 +21,34 @@ public class OpenApiViolation { private final Optional responseStatus; private final String message; private final String logMessage; + + public Optional getOperationId() { + return getOptional(operationId); + } + + public Optional getNormalizedPath() { + return getOptional(normalizedPath); + } + + public Optional getInstance() { + return getOptional(instance); + } + + public Optional getParameter() { + return getOptional(parameter); + } + + public Optional getSchema() { + return getOptional(schema); + } + + public Optional getResponseStatus() { + return getOptional(responseStatus); + } + + private Optional getOptional(@SuppressWarnings("OptionalUsedAsFieldOrParameterType") Optional field) { + //noinspection OptionalAssignedToNull + return field != null ? field : Optional.empty(); + } + } From 826996a915e5570efcb4492aa19b42f7d8ec8fac Mon Sep 17 00:00:00 2001 From: Patrick Boos Date: Tue, 17 Oct 2023 11:56:52 +0200 Subject: [PATCH 5/9] Make optional correct --- .../api/model/OpenApiViolation.java | 30 ++++++++----------- .../core/ValidationReportHandler.java | 12 ++++---- .../InternalViolationExclusionsTest.java | 13 ++++---- ...estBasedValidationReportThrottlerTest.java | 9 +++--- 4 files changed, 28 insertions(+), 36 deletions(-) diff --git a/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/model/OpenApiViolation.java b/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/model/OpenApiViolation.java index 29835352..33e4458b 100644 --- a/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/model/OpenApiViolation.java +++ b/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/model/OpenApiViolation.java @@ -13,42 +13,36 @@ public class OpenApiViolation { private final RequestMetaData requestMetaData; private final String body; private final String rule; - private final Optional operationId; - private final Optional normalizedPath; - private final Optional instance; - private final Optional parameter; - private final Optional schema; - private final Optional responseStatus; + private final String operationId; + private final String normalizedPath; + private final String instance; + private final String parameter; + private final String schema; + private final Integer responseStatus; private final String message; private final String logMessage; public Optional getOperationId() { - return getOptional(operationId); + return Optional.ofNullable(operationId) ; } public Optional getNormalizedPath() { - return getOptional(normalizedPath); + return Optional.ofNullable(normalizedPath) ; } public Optional getInstance() { - return getOptional(instance); + return Optional.ofNullable(instance) ; } public Optional getParameter() { - return getOptional(parameter); + return Optional.ofNullable(parameter) ; } public Optional getSchema() { - return getOptional(schema); + return Optional.ofNullable(schema) ; } public Optional getResponseStatus() { - return getOptional(responseStatus); + return Optional.ofNullable(responseStatus) ; } - - private Optional getOptional(@SuppressWarnings("OptionalUsedAsFieldOrParameterType") Optional field) { - //noinspection OptionalAssignedToNull - return field != null ? field : Optional.empty(); - } - } diff --git a/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/ValidationReportHandler.java b/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/ValidationReportHandler.java index defea077..7e514d94 100644 --- a/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/ValidationReportHandler.java +++ b/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/ValidationReportHandler.java @@ -78,12 +78,12 @@ private OpenApiViolation buildOpenApiViolation( .requestMetaData(request) .body(body) .rule(message.getKey()) - .operationId(getOperationId(message)) - .normalizedPath(getNormalizedPath(message)) - .instance(pointersInstance) - .parameter(parameterName) - .schema(getPointersSchema(message)) - .responseStatus(getResponseStatus(response, message)) + .operationId(getOperationId(message).orElse(null)) + .normalizedPath(getNormalizedPath(message).orElse(null)) + .instance(pointersInstance.orElse(null)) + .parameter(parameterName.orElse(null)) + .schema(getPointersSchema(message).orElse(null)) + .responseStatus(getResponseStatus(response, message).orElse(null)) .logMessage(logMessage) .message(message.getMessage()) .build(); diff --git a/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusionsTest.java b/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusionsTest.java index 827faa41..343a1b55 100644 --- a/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusionsTest.java +++ b/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusionsTest.java @@ -9,7 +9,6 @@ import com.getyourguide.openapi.validation.api.exclusions.ViolationExclusions; import com.getyourguide.openapi.validation.api.model.Direction; import com.getyourguide.openapi.validation.api.model.OpenApiViolation; -import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -38,7 +37,7 @@ private static OpenApiViolation buildSimpleViolation(Direction direction, Intege return OpenApiViolation.builder() .direction(direction) .rule("validation." + (direction == Direction.REQUEST ? "request" : "response") + ".something") - .responseStatus(responseStatus != null ? Optional.of(responseStatus) : Optional.empty()) + .responseStatus(responseStatus) .message("Some violation message") .build(); } @@ -76,7 +75,7 @@ public void when404ResponseWithApiPathNotSpecifiedThenViolationExcluded() { checkViolationExcluded(OpenApiViolation.builder() .direction(Direction.RESPONSE) .rule("validation.request.path.missing") - .responseStatus(Optional.of(404)) + .responseStatus(404) .message("No API path found that matches request '/nothing'") .build()); } @@ -88,7 +87,7 @@ public void whenRequestWithApiPathNotSpecifiedThenViolationExcluded() { checkViolationExcluded(OpenApiViolation.builder() .direction(Direction.REQUEST) .rule("validation.request.path.missing") - .responseStatus(Optional.empty()) + .responseStatus(null) .message("No API path found that matches request '/nothing'") .build()); } @@ -99,7 +98,7 @@ public void whenRequestViolationsAnd400ThenViolationExcluded() { checkViolationExcluded(OpenApiViolation.builder() .direction(Direction.REQUEST) - .responseStatus(Optional.of(400)) + .responseStatus(400) .message("") .build()); } @@ -111,14 +110,14 @@ public void when405ResponseCodeWithOperationNotAllowedViolationThenViolationExcl checkViolationExcluded(OpenApiViolation.builder() .direction(Direction.REQUEST) .rule("validation.request.operation.notAllowed") - .responseStatus(Optional.of(405)) + .responseStatus(405) .message("") .build()); checkViolationExcluded(OpenApiViolation.builder() .direction(Direction.RESPONSE) .rule("validation.request.operation.notAllowed") - .responseStatus(Optional.of(405)) + .responseStatus(405) .message("") .build()); } diff --git a/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/throttle/RequestBasedValidationReportThrottlerTest.java b/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/throttle/RequestBasedValidationReportThrottlerTest.java index 87086134..651d7a3a 100644 --- a/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/throttle/RequestBasedValidationReportThrottlerTest.java +++ b/openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/throttle/RequestBasedValidationReportThrottlerTest.java @@ -8,7 +8,6 @@ import com.getyourguide.openapi.validation.api.model.RequestMetaData; import java.net.URI; import java.util.Collections; -import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -89,10 +88,10 @@ private OpenApiViolation buildViolation(Direction direction, Request.Method meth .requestMetaData( new RequestMetaData(method.toString(), URI.create("https://example.com" + path), Collections.emptyMap()) ) - .responseStatus(Optional.of(status)) - .normalizedPath(Optional.of(path)) - .instance(Optional.of(instance)) - .schema(Optional.of(schema)) + .responseStatus(status) + .normalizedPath(path) + .instance(instance) + .schema(schema) .build(); } } From 0849c96eefb4b0a07e2d763656563c58b399e95a Mon Sep 17 00:00:00 2001 From: Patrick Boos Date: Tue, 17 Oct 2023 11:57:42 +0200 Subject: [PATCH 6/9] Remove whitespace --- .../validation/api/model/OpenApiViolation.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/model/OpenApiViolation.java b/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/model/OpenApiViolation.java index 33e4458b..febd4f6a 100644 --- a/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/model/OpenApiViolation.java +++ b/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/model/OpenApiViolation.java @@ -23,26 +23,26 @@ public class OpenApiViolation { private final String logMessage; public Optional getOperationId() { - return Optional.ofNullable(operationId) ; + return Optional.ofNullable(operationId); } public Optional getNormalizedPath() { - return Optional.ofNullable(normalizedPath) ; + return Optional.ofNullable(normalizedPath); } public Optional getInstance() { - return Optional.ofNullable(instance) ; + return Optional.ofNullable(instance); } public Optional getParameter() { - return Optional.ofNullable(parameter) ; + return Optional.ofNullable(parameter); } public Optional getSchema() { - return Optional.ofNullable(schema) ; + return Optional.ofNullable(schema); } public Optional getResponseStatus() { - return Optional.ofNullable(responseStatus) ; + return Optional.ofNullable(responseStatus); } } From 9bcd6ed0d70b7d5db3a38b40ddfdf4c107bdce18 Mon Sep 17 00:00:00 2001 From: Patrick Boos Date: Wed, 18 Oct 2023 09:02:55 +0200 Subject: [PATCH 7/9] Extract rule constants --- .../exclusions/InternalViolationExclusions.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java b/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java index a198e95e..9178927e 100644 --- a/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java +++ b/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java @@ -7,6 +7,11 @@ @AllArgsConstructor public class InternalViolationExclusions { + private static final String RULE_REQUEST_OPERATION_NOT_ALLOWED = "validation.request.operation.notAllowed"; + private static final String RULE_REQUEST_BODY_SCHEMA_ONE_OF = "validation.request.body.schema.oneOf"; + private static final String RULE_REQUEST_PATH_MISSING = "validation.request.path.missing"; + private static final String RULE_RESPONSE_BODY_SCHEMA_ONE_OF = "validation.response.body.schema.oneOf"; + private final ViolationExclusions customViolationExclusions; public boolean isExcluded(OpenApiViolation violation) { @@ -19,15 +24,15 @@ public boolean isExcluded(OpenApiViolation violation) { private static boolean oneOfMatchesMoreThanOneSchema(OpenApiViolation violation) { return ( - "validation.response.body.schema.oneOf".equals(violation.getRule()) - || "validation.request.body.schema.oneOf".equals(violation.getRule()) + RULE_RESPONSE_BODY_SCHEMA_ONE_OF.equals(violation.getRule()) + || RULE_REQUEST_BODY_SCHEMA_ONE_OF.equals(violation.getRule()) ) && violation.getMessage() .matches(".*Instance failed to match exactly one schema \\(matched [1-9][0-9]* out of \\d+\\).*"); } private boolean falsePositive404(OpenApiViolation violation) { - return "validation.request.path.missing".equals(violation.getRule()) + return RULE_REQUEST_PATH_MISSING.equals(violation.getRule()) && ( violation.getDirection() == Direction.REQUEST || (violation.getDirection() == Direction.RESPONSE && violation.getResponseStatus().orElse(0) == 404) @@ -40,6 +45,6 @@ private boolean falsePositive400(OpenApiViolation violation) { private boolean falsePositive405(OpenApiViolation violation) { return violation.getResponseStatus().orElse(0) == 405 - && "validation.request.operation.notAllowed".equals(violation.getRule()); + && RULE_REQUEST_OPERATION_NOT_ALLOWED.equals(violation.getRule()); } } From 487d0f75fd58d067e166952f4d60221088871ae5 Mon Sep 17 00:00:00 2001 From: Patrick Boos Date: Wed, 18 Oct 2023 09:08:29 +0200 Subject: [PATCH 8/9] Extract rule constants to file --- .../getyourguide/openapi/validation/api/Rules.java | 12 ++++++++++++ .../exclusions/InternalViolationExclusions.java | 13 +++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/Rules.java diff --git a/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/Rules.java b/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/Rules.java new file mode 100644 index 00000000..46365679 --- /dev/null +++ b/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/Rules.java @@ -0,0 +1,12 @@ +package com.getyourguide.openapi.validation.api; + +public class Rules { + public static class Request { + public static final String PATH_MISSING = "validation.request.path.missing"; + public static final String OPERATION_NOT_ALLOWED = "validation.request.operation.notAllowed"; + public static final String BODY_SCHEMA_ONE_OF = "validation.request.body.schema.oneOf"; + } + public static class Response { + public static final String BODY_SCHEMA_ONE_OF = "validation.response.body.schema.oneOf"; + } +} diff --git a/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java b/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java index 9178927e..3bacb7cb 100644 --- a/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java +++ b/openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java @@ -1,5 +1,6 @@ package com.getyourguide.openapi.validation.core.exclusions; +import com.getyourguide.openapi.validation.api.Rules; import com.getyourguide.openapi.validation.api.exclusions.ViolationExclusions; import com.getyourguide.openapi.validation.api.model.Direction; import com.getyourguide.openapi.validation.api.model.OpenApiViolation; @@ -7,10 +8,6 @@ @AllArgsConstructor public class InternalViolationExclusions { - private static final String RULE_REQUEST_OPERATION_NOT_ALLOWED = "validation.request.operation.notAllowed"; - private static final String RULE_REQUEST_BODY_SCHEMA_ONE_OF = "validation.request.body.schema.oneOf"; - private static final String RULE_REQUEST_PATH_MISSING = "validation.request.path.missing"; - private static final String RULE_RESPONSE_BODY_SCHEMA_ONE_OF = "validation.response.body.schema.oneOf"; private final ViolationExclusions customViolationExclusions; @@ -24,15 +21,15 @@ public boolean isExcluded(OpenApiViolation violation) { private static boolean oneOfMatchesMoreThanOneSchema(OpenApiViolation violation) { return ( - RULE_RESPONSE_BODY_SCHEMA_ONE_OF.equals(violation.getRule()) - || RULE_REQUEST_BODY_SCHEMA_ONE_OF.equals(violation.getRule()) + Rules.Response.BODY_SCHEMA_ONE_OF.equals(violation.getRule()) + || Rules.Request.BODY_SCHEMA_ONE_OF.equals(violation.getRule()) ) && violation.getMessage() .matches(".*Instance failed to match exactly one schema \\(matched [1-9][0-9]* out of \\d+\\).*"); } private boolean falsePositive404(OpenApiViolation violation) { - return RULE_REQUEST_PATH_MISSING.equals(violation.getRule()) + return Rules.Request.PATH_MISSING.equals(violation.getRule()) && ( violation.getDirection() == Direction.REQUEST || (violation.getDirection() == Direction.RESPONSE && violation.getResponseStatus().orElse(0) == 404) @@ -45,6 +42,6 @@ private boolean falsePositive400(OpenApiViolation violation) { private boolean falsePositive405(OpenApiViolation violation) { return violation.getResponseStatus().orElse(0) == 405 - && RULE_REQUEST_OPERATION_NOT_ALLOWED.equals(violation.getRule()); + && Rules.Request.OPERATION_NOT_ALLOWED.equals(violation.getRule()); } } From 3f11f0368c7cc194c040b8e47d95c8c9dd52feae Mon Sep 17 00:00:00 2001 From: Patrick Boos Date: Wed, 18 Oct 2023 09:11:11 +0200 Subject: [PATCH 9/9] Separate classes by empty line --- .../main/java/com/getyourguide/openapi/validation/api/Rules.java | 1 + 1 file changed, 1 insertion(+) diff --git a/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/Rules.java b/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/Rules.java index 46365679..b9aa85ee 100644 --- a/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/Rules.java +++ b/openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/Rules.java @@ -6,6 +6,7 @@ public static class Request { public static final String OPERATION_NOT_ALLOWED = "validation.request.operation.notAllowed"; public static final String BODY_SCHEMA_ONE_OF = "validation.request.body.schema.oneOf"; } + public static class Response { public static final String BODY_SCHEMA_ONE_OF = "validation.response.body.schema.oneOf"; }