From bec9933f844c8da14d2c626a994d2918efd34663 Mon Sep 17 00:00:00 2001 From: orange-buffalo Date: Mon, 10 Jan 2022 18:48:19 +1100 Subject: [PATCH] Fixing false positive breaking change reported when removing an optional field from a response. Closes #198 --- .../openapitools/openapidiff/core/model/ChangedSchema.java | 7 ++++++- .../org/openapitools/openapidiff/core/AddPropDiffTest.java | 4 ++-- core/src/test/resources/recursive_model_1.yaml | 3 ++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java index c6289f17d..22e5a8f08 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java @@ -137,8 +137,13 @@ private DiffResult calculateCoreChanged() { && !discriminatorPropertyChanged) { return DiffResult.NO_CHANGES; } + boolean missingRequiredProperties = + oldSchema != null + && oldSchema.getRequired() != null + && missingProperties.keySet().stream() + .anyMatch(missingProperty -> oldSchema.getRequired().contains(missingProperty)); boolean compatibleForResponse = - missingProperties.isEmpty() && (oldSchema == null || newSchema != null); + !missingRequiredProperties && (oldSchema == null || newSchema != null); if ((context.isRequest() && compatibleForRequest() || context.isResponse() && compatibleForResponse) && !changedType diff --git a/core/src/test/java/org/openapitools/openapidiff/core/AddPropDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/AddPropDiffTest.java index b71d8f039..6d668c115 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/AddPropDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/AddPropDiffTest.java @@ -1,7 +1,7 @@ package org.openapitools.openapidiff.core; import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardCompatible; import org.junit.jupiter.api.Test; @@ -16,6 +16,6 @@ public void testDiffSame() { @Test public void testDiffDifferent() { - assertOpenApiBackwardIncompatible(OPENAPI_DOC1, OPENAPI_DOC2); + assertOpenApiBackwardCompatible(OPENAPI_DOC1, OPENAPI_DOC2, true); } } diff --git a/core/src/test/resources/recursive_model_1.yaml b/core/src/test/resources/recursive_model_1.yaml index 6a05ab0ad..24f545186 100644 --- a/core/src/test/resources/recursive_model_1.yaml +++ b/core/src/test/resources/recursive_model_1.yaml @@ -19,6 +19,7 @@ components: schemas: B: type: object + required: ["message2"] properties: message: type: string @@ -27,4 +28,4 @@ components: details: type: array items: - $ref: '#/components/schemas/B' \ No newline at end of file + $ref: '#/components/schemas/B'