From 9cb2e39819a69dbb06e8beb5c7b42f2d24d20491 Mon Sep 17 00:00:00 2001 From: Chinmesh Manjrekar Date: Fri, 9 Jan 2026 11:38:00 +0000 Subject: [PATCH] Issue #2157 Resolve additionalProperties inside ComposedSchema correctly --- .../swagger/v3/parser/util/ResolverFully.java | 3 ++ .../io/swagger/parser/OpenAPIParserTest.java | 52 +++++++++++++++++++ .../additionalProperties_allOf_v1.yaml | 25 +++++++++ .../additionalProperties_allOf_v2.yaml | 26 ++++++++++ .../additionalProperties_allOf_v3.yaml | 27 ++++++++++ .../additionalProperties_allOf_v4.yaml | 27 ++++++++++ 6 files changed, 160 insertions(+) create mode 100644 modules/swagger-parser/src/test/resources/additionalProperties_allOf_v1.yaml create mode 100644 modules/swagger-parser/src/test/resources/additionalProperties_allOf_v2.yaml create mode 100644 modules/swagger-parser/src/test/resources/additionalProperties_allOf_v3.yaml create mode 100644 modules/swagger-parser/src/test/resources/additionalProperties_allOf_v4.yaml diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java index 3f3e19ec3b..5d9c400e28 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java @@ -683,6 +683,9 @@ private void aggregateSchemaCombinators(ComposedSchema sourceSchema, Schema targ if (resolved.getMinContains() != null) { targetSchema.setMinContains(resolved.getMinContains()); } + if (resolved.getAdditionalProperties() != null) { + targetSchema.setAdditionalProperties(resolved.getAdditionalProperties()); + } } if (requiredProperties.size() > 0) { diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java b/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java index ada569d28d..1e0f3dcbcb 100644 --- a/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java @@ -25,6 +25,7 @@ import java.util.List; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; import static org.testng.AssertJUnit.assertNull; @@ -772,5 +773,56 @@ public void testIssue1552AdditionalProps() throws Exception { "openapi31: false\n"); } + + @Test + public void testAdditionalPropertiesWithAllOfV1() { + ParseOptions options = new ParseOptions(); + options.setResolveFully(true); + SwaggerParseResult result = new OpenAPIParser().readLocation( + "additionalProperties_allOf_v1.yaml", null, options); + assertNotNull(result.getOpenAPI()); + Schema schema = result.getOpenAPI().getComponents().getSchemas().get("TestSchema"); + assertNotNull(schema); + assertNotNull(schema.getAdditionalProperties()); + assertTrue((Boolean) schema.getAdditionalProperties()); + } + @Test + public void testAdditionalPropertiesWithAllOfV2() { + ParseOptions options = new ParseOptions(); + options.setResolveFully(true); + SwaggerParseResult result = new OpenAPIParser().readLocation( + "additionalProperties_allOf_v2.yaml", null, options); + assertNotNull(result.getOpenAPI()); + Schema schema = result.getOpenAPI().getComponents().getSchemas().get("TestSchema"); + assertNotNull(schema); + assertNotNull(schema.getAdditionalProperties()); + assertTrue((Boolean) schema.getAdditionalProperties()); + } + + @Test + public void testAdditionalPropertiesWithAllOfV3() { + ParseOptions options = new ParseOptions(); + options.setResolveFully(true); + SwaggerParseResult result = new OpenAPIParser().readLocation( + "additionalProperties_allOf_v3.yaml", null, options); + assertNotNull(result.getOpenAPI()); + Schema schema = result.getOpenAPI().getComponents().getSchemas().get("TestSchema"); + assertNotNull(schema); + assertNotNull(schema.getAdditionalProperties()); + assertTrue((Boolean) schema.getAdditionalProperties()); + } + + @Test + public void testAdditionalPropertiesWithAllOfV4() { + ParseOptions options = new ParseOptions(); + options.setResolveFully(true); + SwaggerParseResult result = new OpenAPIParser().readLocation( + "additionalProperties_allOf_v4.yaml", null, options); + assertNotNull(result.getOpenAPI()); + Schema schema = result.getOpenAPI().getComponents().getSchemas().get("TestSchema"); + assertNotNull(schema); + assertNotNull(schema.getAdditionalProperties()); + assertFalse((Boolean) schema.getAdditionalProperties()); + } } diff --git a/modules/swagger-parser/src/test/resources/additionalProperties_allOf_v1.yaml b/modules/swagger-parser/src/test/resources/additionalProperties_allOf_v1.yaml new file mode 100644 index 0000000000..216e1f6f8c --- /dev/null +++ b/modules/swagger-parser/src/test/resources/additionalProperties_allOf_v1.yaml @@ -0,0 +1,25 @@ +openapi: 3.0.1 +info: + title: Test API + version: 1.0.0 +paths: + /test: + get: + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/TestSchema' +components: + schemas: + ObjectWithAdditionalProperties: + type: object + additionalProperties: true + properties: + name: + type: string + TestSchema: + allOf: + - $ref: '#/components/schemas/ObjectWithAdditionalProperties' diff --git a/modules/swagger-parser/src/test/resources/additionalProperties_allOf_v2.yaml b/modules/swagger-parser/src/test/resources/additionalProperties_allOf_v2.yaml new file mode 100644 index 0000000000..0bb630f75d --- /dev/null +++ b/modules/swagger-parser/src/test/resources/additionalProperties_allOf_v2.yaml @@ -0,0 +1,26 @@ +openapi: 3.0.1 +info: + title: Test API + version: 1.0.0 +paths: + /test: + get: + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/TestSchema' +components: + schemas: + ObjectWithAdditionalProperties: + type: object + additionalProperties: true + TestSchema: + allOf: + - $ref: '#/components/schemas/ObjectWithAdditionalProperties' + - type: object + properties: + name: + type: string diff --git a/modules/swagger-parser/src/test/resources/additionalProperties_allOf_v3.yaml b/modules/swagger-parser/src/test/resources/additionalProperties_allOf_v3.yaml new file mode 100644 index 0000000000..e51efb2e81 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/additionalProperties_allOf_v3.yaml @@ -0,0 +1,27 @@ +openapi: 3.0.1 +info: + title: Test API + version: 1.0.0 +paths: + /test: + get: + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/TestSchema' +components: + schemas: + ObjectWithAdditionalProperties: + type: object + additionalProperties: true + TestSchema: + allOf: + - type: object + properties: + name: + type: string + additionalProperties: false + - $ref: '#/components/schemas/ObjectWithAdditionalProperties' diff --git a/modules/swagger-parser/src/test/resources/additionalProperties_allOf_v4.yaml b/modules/swagger-parser/src/test/resources/additionalProperties_allOf_v4.yaml new file mode 100644 index 0000000000..b52821be84 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/additionalProperties_allOf_v4.yaml @@ -0,0 +1,27 @@ +openapi: 3.0.1 +info: + title: Test API + version: 1.0.0 +paths: + /test: + get: + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/TestSchema' +components: + schemas: + ObjectWithAdditionalProperties: + type: object + additionalProperties: true + TestSchema: + allOf: + - $ref: '#/components/schemas/ObjectWithAdditionalProperties' + - type: object + properties: + name: + type: string + additionalProperties: false