From bccb97a41e506fbfa22603d5a0fb5ccd5e1ff4b6 Mon Sep 17 00:00:00 2001 From: David DE CARVALHO Date: Tue, 29 Mar 2022 22:47:36 +0200 Subject: [PATCH 1/2] fix #358 - formatting code with fmt-maven-plugin --- .../openapidiff/core/compare/PathsDiff.java | 21 +++++------ .../core/ParametersOverloadingTest.java | 35 ++++++++++--------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java index e09a4557b..73321a98f 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java @@ -3,11 +3,11 @@ import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.Paths; +import io.swagger.v3.oas.models.parameters.Parameter; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.IntStream; -import io.swagger.v3.oas.models.parameters.Parameter; import org.openapitools.openapidiff.core.model.Changed; import org.openapitools.openapidiff.core.model.ChangedPaths; import org.openapitools.openapidiff.core.model.DiffContext; @@ -103,12 +103,10 @@ public static Paths valOrEmpty(Paths path) { } /** - * * @param a a path form the open api spec * @param b another path from the same open api spec - * @return true in case both paths are of the same method AND their templated parameters are of the same type; - * false otherwise - * + * @return true in case both paths are of the same method AND their templated + * parameters are of the same type; false otherwise */ private static boolean methodsAndParametersIntersect(PathItem a, PathItem b) { Set methodsA = a.readOperationsMap().keySet(); @@ -126,15 +124,18 @@ private static boolean methodsAndParametersIntersect(PathItem a, PathItem b) { } /** - * * @param left parameters from the first compared method * @param right parameters from the second compared method - * @return true in case each parameter pair is of the same type; false otherwise + * @return true in case each parameter pair is of the same type; false + * otherwise */ - private static boolean parametersIntersect(List left, List right) {; + private static boolean parametersIntersect(List left, List right) { + ; int parametersSize = left.size(); - long intersectedParameters = IntStream.range(0, left.size()) - .filter(i -> left.get(i).getSchema().getType().equals(right.get(i).getSchema().getType())) + long intersectedParameters = + IntStream.range(0, left.size()) + .filter( + i -> left.get(i).getSchema().getType().equals(right.get(i).getSchema().getType())) .count(); return parametersSize == intersectedParameters; } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java index e3c4bb53a..bc779be56 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java @@ -1,26 +1,27 @@ package org.openapitools.openapidiff.core; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.*; import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; +import org.junit.jupiter.api.Test; + class ParametersOverloadingTest { - private final String OVERLOADED_PARAMETERS = "parameters_overloading.yaml"; - private final String DUPLICATED_PARAMETER_TYPES = "parameters_overloading_2.yaml"; + private final String OVERLOADED_PARAMETERS = "parameters_overloading.yaml"; + private final String DUPLICATED_PARAMETER_TYPES = "parameters_overloading_2.yaml"; - @Test - void testDiffWithOverloadedParameterTypes() { - assertDoesNotThrow(() -> OpenApiCompare.fromLocations(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS)); - assertOpenApiAreEquals(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS); - } + @Test + void testDiffWithOverloadedParameterTypes() { + assertDoesNotThrow( + () -> OpenApiCompare.fromLocations(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS)); + assertOpenApiAreEquals(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS); + } - @Test - void testDiffWithDuplicatedParameterTypes() { - assertThrows( - IllegalArgumentException.class, - () -> OpenApiCompare.fromLocations(DUPLICATED_PARAMETER_TYPES, DUPLICATED_PARAMETER_TYPES), - "Two path items have the same signature: /projects/{}"); - } -} \ No newline at end of file + @Test + void testDiffWithDuplicatedParameterTypes() { + assertThrows( + IllegalArgumentException.class, + () -> OpenApiCompare.fromLocations(DUPLICATED_PARAMETER_TYPES, DUPLICATED_PARAMETER_TYPES), + "Two path items have the same signature: /projects/{}"); + } +} From 8d825f6553b855e7d008934c90d8f791931f4b24 Mon Sep 17 00:00:00 2001 From: David DE CARVALHO Date: Tue, 29 Mar 2022 22:53:30 +0200 Subject: [PATCH 2/2] fix #358 - correction of regex problem + tests --- .../openapidiff/core/compare/PathsDiff.java | 2 +- .../openapidiff/core/PathDiffTest.java | 16 ++++ core/src/test/resources/path_5.yaml | 92 +++++++++++++++++++ core/src/test/resources/path_6.yaml | 92 +++++++++++++++++++ 4 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 core/src/test/resources/path_5.yaml create mode 100644 core/src/test/resources/path_6.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java index 73321a98f..b1e8e7b50 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java @@ -15,7 +15,7 @@ import org.openapitools.openapidiff.core.model.deferred.DeferredChanged; public class PathsDiff { - private static final String REGEX_PATH = "\\{([^/]+)}"; + private static final String REGEX_PATH = "\\{([^/{}]+)}"; private final OpenApiDiff openApiDiff; public PathsDiff(OpenApiDiff openApiDiff) { diff --git a/core/src/test/java/org/openapitools/openapidiff/core/PathDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/PathDiffTest.java index 1c8168c41..a20d20f64 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/PathDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/PathDiffTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.fail; import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; import org.junit.jupiter.api.Test; @@ -13,6 +14,8 @@ public class PathDiffTest { private final String OPENAPI_PATH2 = "path_2.yaml"; private final String OPENAPI_PATH3 = "path_3.yaml"; private final String OPENAPI_PATH4 = "path_4.yaml"; + private final String OPENAPI_PATH5 = "path_5.yaml"; + private final String OPENAPI_PATH6 = "path_6.yaml"; @Test public void testEqual() { @@ -35,4 +38,17 @@ public void testSameTemplateDifferentMethods() { assertThat(endpoint.getOperation().getOperationId()).isEqualTo("deletePet")); assertThat(changedOpenApi.isCompatible()).isTrue(); } + + @Test + public void testDiffWithSimilarBeginningPaths() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_PATH5, OPENAPI_PATH6); + try { + ChangedOpenApi diff = + OpenApiCompare.fromSpecifications( + changedOpenApi.getOldSpecOpenApi(), changedOpenApi.getNewSpecOpenApi()); + assertThat(diff.getChangedOperations()).hasSize(4); + } catch (IllegalArgumentException e) { + fail(e.getMessage()); + } + } } diff --git a/core/src/test/resources/path_5.yaml b/core/src/test/resources/path_5.yaml new file mode 100644 index 000000000..9e44371c3 --- /dev/null +++ b/core/src/test/resources/path_5.yaml @@ -0,0 +1,92 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server. You can find out more about + Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, + #swagger](http://swagger.io/irc/). For this sample, you can use the api key + `special-key` to test the authorization filters. + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /pet/{petId}: + get: + tags: + - pet + summary: gets a pet by id + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/{petId2}: + post: + tags: + - pet + summary: deletes a pet + description: '' + operationId: deletePet + parameters: + - name: petId2 + in: path + description: Pet ID to delete + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/by_owner-{ownerId}: + get: + tags: + - pet + summary: gets a pet by its owner id + description: '' + operationId: getPetFromOwner + parameters: + - ownerid: ownerId + in: path + description: Owner id of pet that needs to be get + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/by_owner-{ownerId}_name-{petName}: + get: + tags: + - pet + summary: gets a pet by its owner id and its name + description: '' + operationId: getPetFromOwnerAndPetName + parameters: + - ownerid: ownerId + in: path + description: Owner id of pet that needs to be get + required: true + schema: + type: integer + - name: petName + in: path + description: Name of pet that needs to be get + required: true + schema: + type: string + responses: + '405': + description: Invalid input diff --git a/core/src/test/resources/path_6.yaml b/core/src/test/resources/path_6.yaml new file mode 100644 index 000000000..9e44371c3 --- /dev/null +++ b/core/src/test/resources/path_6.yaml @@ -0,0 +1,92 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server. You can find out more about + Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, + #swagger](http://swagger.io/irc/). For this sample, you can use the api key + `special-key` to test the authorization filters. + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /pet/{petId}: + get: + tags: + - pet + summary: gets a pet by id + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/{petId2}: + post: + tags: + - pet + summary: deletes a pet + description: '' + operationId: deletePet + parameters: + - name: petId2 + in: path + description: Pet ID to delete + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/by_owner-{ownerId}: + get: + tags: + - pet + summary: gets a pet by its owner id + description: '' + operationId: getPetFromOwner + parameters: + - ownerid: ownerId + in: path + description: Owner id of pet that needs to be get + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/by_owner-{ownerId}_name-{petName}: + get: + tags: + - pet + summary: gets a pet by its owner id and its name + description: '' + operationId: getPetFromOwnerAndPetName + parameters: + - ownerid: ownerId + in: path + description: Owner id of pet that needs to be get + required: true + schema: + type: integer + - name: petName + in: path + description: Name of pet that needs to be get + required: true + schema: + type: string + responses: + '405': + description: Invalid input