From 916d9fd0d07cec3b0ed9856002b9b290d1e82f57 Mon Sep 17 00:00:00 2001 From: Kamil Krzywanski Date: Sat, 25 Jul 2026 08:44:07 +0200 Subject: [PATCH 1/2] Fix ClassCastException when allOf array changes to type array Fixes #887 --- .../openapidiff/core/compare/SchemaDiff.java | 3 ++ .../ArraySchemaDiffResult.java | 8 ++--- .../openapidiff/core/Issue887Test.java | 31 ++++++++++++++++++ core/src/test/resources/issue-887-1.yaml | 32 +++++++++++++++++++ core/src/test/resources/issue-887-2.yaml | 31 ++++++++++++++++++ 5 files changed, 99 insertions(+), 6 deletions(-) create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/Issue887Test.java create mode 100644 core/src/test/resources/issue-887-1.yaml create mode 100644 core/src/test/resources/issue-887-2.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java index 295cd9c6..fadae7a1 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java @@ -240,6 +240,9 @@ protected static Schema addSchema(Schema schema, Schema fromSche if (fromSchema.getMinItems() != null) { schema.setMinItems(fromSchema.getMinItems()); } + if (fromSchema.getItems() != null) { + schema.setItems(fromSchema.getItems()); + } if (fromSchema.getMaxProperties() != null) { schema.setMaxProperties(fromSchema.getMaxProperties()); } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/ArraySchemaDiffResult.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/ArraySchemaDiffResult.java index eafe632c..f5157829 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/ArraySchemaDiffResult.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/ArraySchemaDiffResult.java @@ -1,7 +1,6 @@ package org.openapitools.openapidiff.core.compare.schemadiffresult; import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.Schema; import org.openapitools.openapidiff.core.compare.OpenApiDiff; import org.openapitools.openapidiff.core.model.ChangedSchema; @@ -22,9 +21,6 @@ public , X> DeferredChanged diff( T left, T right, DiffContext context) { - ArraySchema leftArraySchema = (ArraySchema) left; - ArraySchema rightArraySchema = (ArraySchema) right; - DeferredChanged superSchemaDiff = super.diff(refSet, leftComponents, rightComponents, left, right, context) .flatMap( @@ -34,8 +30,8 @@ public , X> DeferredChanged diff( .getSchemaDiff() .diff( refSet, - leftArraySchema.getItems(), - rightArraySchema.getItems(), + left.getItems(), + right.getItems(), context.copyWithRequired(true)); itemsDiff.ifPresent(changedSchema::setItems); return itemsDiff; diff --git a/core/src/test/java/org/openapitools/openapidiff/core/Issue887Test.java b/core/src/test/java/org/openapitools/openapidiff/core/Issue887Test.java new file mode 100644 index 00000000..c408c980 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/Issue887Test.java @@ -0,0 +1,31 @@ +package org.openapitools.openapidiff.core; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; + +import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; + +public class Issue887Test { + + private final String ALLOF_ARRAY = "issue-887-1.yaml"; + private final String DIRECT_ARRAY = "issue-887-2.yaml"; + + @Test + public void testAllOfArrayToDirectArrayDoesNotThrow() { + assertThatCode(() -> OpenApiCompare.fromLocations(ALLOF_ARRAY, DIRECT_ARRAY)) + .doesNotThrowAnyException(); + } + + @Test + public void testDirectArrayToAllOfArrayDoesNotThrow() { + assertThatCode(() -> OpenApiCompare.fromLocations(DIRECT_ARRAY, ALLOF_ARRAY)) + .doesNotThrowAnyException(); + } + + @Test + public void testAllOfArrayToDirectArrayIsCompatible() { + ChangedOpenApi diff = OpenApiCompare.fromLocations(ALLOF_ARRAY, DIRECT_ARRAY); + assertThat(diff.isCompatible()).isTrue(); + } +} diff --git a/core/src/test/resources/issue-887-1.yaml b/core/src/test/resources/issue-887-1.yaml new file mode 100644 index 00000000..30ebc232 --- /dev/null +++ b/core/src/test/resources/issue-887-1.yaml @@ -0,0 +1,32 @@ +openapi: 3.0.3 +info: + title: Test API + version: 1.0.0 + +paths: + /test: + get: + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/TestResponse' + +components: + schemas: + TestResponse: + type: object + properties: + valuations: + allOf: + - $ref: '#/components/schemas/Valuations' + + Valuations: + type: array + items: + type: object + properties: + value: + type: string diff --git a/core/src/test/resources/issue-887-2.yaml b/core/src/test/resources/issue-887-2.yaml new file mode 100644 index 00000000..3237bda6 --- /dev/null +++ b/core/src/test/resources/issue-887-2.yaml @@ -0,0 +1,31 @@ +openapi: 3.0.3 +info: + title: Test API + version: 1.0.0 + +paths: + /test: + get: + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/TestResponse' + +components: + schemas: + TestResponse: + type: object + properties: + valuations: + type: array + items: + $ref: '#/components/schemas/Valuation' + + Valuation: + type: object + properties: + value: + type: string From 99b2f79c7bf273a898d7710293f50e37e71248c6 Mon Sep 17 00:00:00 2001 From: Kamil Krzywanski Date: Sat, 25 Jul 2026 08:54:36 +0200 Subject: [PATCH 2/2] Strengthen issue 887 regression assertion Assert the allOf-array and direct-array specs compare equal instead of only checking isCompatible(), which is also true for no changes. --- .../org/openapitools/openapidiff/core/Issue887Test.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/core/src/test/java/org/openapitools/openapidiff/core/Issue887Test.java b/core/src/test/java/org/openapitools/openapidiff/core/Issue887Test.java index c408c980..f1406b8b 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/Issue887Test.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/Issue887Test.java @@ -1,10 +1,9 @@ package org.openapitools.openapidiff.core; -import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; import org.junit.jupiter.api.Test; -import org.openapitools.openapidiff.core.model.ChangedOpenApi; public class Issue887Test { @@ -24,8 +23,7 @@ public void testDirectArrayToAllOfArrayDoesNotThrow() { } @Test - public void testAllOfArrayToDirectArrayIsCompatible() { - ChangedOpenApi diff = OpenApiCompare.fromLocations(ALLOF_ARRAY, DIRECT_ARRAY); - assertThat(diff.isCompatible()).isTrue(); + public void testAllOfArrayToDirectArrayAreEquals() { + assertOpenApiAreEquals(ALLOF_ARRAY, DIRECT_ARRAY); } }