From eb153c6a5211b51e975a49823d71df89502d31f1 Mon Sep 17 00:00:00 2001 From: Ganesh Datta Date: Mon, 11 Jan 2021 13:01:23 -0800 Subject: [PATCH] Fix nullable API response in diff --- .../core/compare/ApiResponseDiff.java | 9 ++++--- .../core/compare/ApiResponseDiffTest.java | 27 +++++++++++++++++++ .../apiResponse_diff_1.yaml | 7 +++++ .../apiResponse_diff_2.yaml | 15 +++++++++++ 4 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/compare/ApiResponseDiffTest.java create mode 100644 core/src/test/resources/backwardCompatibility/apiResponse_diff_1.yaml create mode 100644 core/src/test/resources/backwardCompatibility/apiResponse_diff_2.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/ApiResponseDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/ApiResponseDiff.java index 6c224402f..669a4fded 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/ApiResponseDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/ApiResponseDiff.java @@ -12,6 +12,8 @@ import org.openapitools.openapidiff.core.model.ChangedResponse; import org.openapitools.openapidiff.core.model.DiffContext; +import javax.annotation.Nullable; + /** Created by adarsh.sharma on 04/01/18. */ public class ApiResponseDiff { private final OpenApiDiff openApiDiff; @@ -20,15 +22,14 @@ public ApiResponseDiff(OpenApiDiff openApiDiff) { this.openApiDiff = openApiDiff; } - public Optional diff( - ApiResponses left, ApiResponses right, DiffContext context) { + public Optional diff(@Nullable ApiResponses left, @Nullable ApiResponses right, DiffContext context) { MapKeyDiff responseMapKeyDiff = MapKeyDiff.diff(left, right); List sharedResponseCodes = responseMapKeyDiff.getSharedKey(); Map resps = new LinkedHashMap<>(); for (String responseCode : sharedResponseCodes) { openApiDiff .getResponseDiff() - .diff(left.get(responseCode), right.get(responseCode), context) + .diff(left != null ? left.get(responseCode) : null, right != null ? right.get(responseCode) : null, context) .ifPresent(changedResponse -> resps.put(responseCode, changedResponse)); } ChangedApiResponse changedApiResponse = @@ -38,7 +39,7 @@ public Optional diff( .setChanged(resps); openApiDiff .getExtensionsDiff() - .diff(left.getExtensions(), right.getExtensions(), context) + .diff(left != null ? left.getExtensions() : null, right != null ? right.getExtensions() : null, context) .ifPresent(changedApiResponse::setExtensions); return isChanged(changedApiResponse); } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/compare/ApiResponseDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/compare/ApiResponseDiffTest.java new file mode 100644 index 000000000..59ad6cac7 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/compare/ApiResponseDiffTest.java @@ -0,0 +1,27 @@ +package org.openapitools.openapidiff.core.compare; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; + + +class ApiResponseDiffTest extends Assertions { + /*** + * This is a regression test - when no responses were set, we would get an exception + * since the OpenAPI object has a `null` ApiResponses field. + */ + @Test + public void testNoResponseInPrevious() { + // The previous API had no response, so adding a response shape is still compatible. + assertOpenApiBackwardCompatible( + "backwardCompatibility/apiResponse_diff_1.yaml", + "backwardCompatibility/apiResponse_diff_2.yaml", true); + + // Removing the response shape is backwards incompatible. + assertOpenApiBackwardIncompatible( + "backwardCompatibility/apiResponse_diff_2.yaml", + "backwardCompatibility/apiResponse_diff_1.yaml"); + } +} \ No newline at end of file diff --git a/core/src/test/resources/backwardCompatibility/apiResponse_diff_1.yaml b/core/src/test/resources/backwardCompatibility/apiResponse_diff_1.yaml new file mode 100644 index 000000000..fb1e6047d --- /dev/null +++ b/core/src/test/resources/backwardCompatibility/apiResponse_diff_1.yaml @@ -0,0 +1,7 @@ +openapi: 3.0.0 +info: + title: Swagger Petstore +paths: + /store/inventory: + get: + operationId: asdf \ No newline at end of file diff --git a/core/src/test/resources/backwardCompatibility/apiResponse_diff_2.yaml b/core/src/test/resources/backwardCompatibility/apiResponse_diff_2.yaml new file mode 100644 index 000000000..82da7cfd6 --- /dev/null +++ b/core/src/test/resources/backwardCompatibility/apiResponse_diff_2.yaml @@ -0,0 +1,15 @@ +openapi: 3.0.0 +info: + title: Swagger Petstore +paths: + /store/inventory: + get: + responses: + '200': + content: + application/json: + schema: + type: object + properties: + title: + type: string \ No newline at end of file