From 301af6050b517f518ab534edce3f728e5100dbf8 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Wed, 13 Nov 2024 21:27:19 +0800 Subject: [PATCH] fix allOf with properties for ref as parent rule (#20083) --- .../codegen/OpenAPINormalizer.java | 10 ++++---- .../codegen/OpenAPINormalizerTest.java | 24 +++++++++++++++++++ .../codegen/java/JavaClientCodegenTest.java | 2 +- .../resources/3_0/allOf_extension_parent.yaml | 13 +++++++++- 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java index 6776414d2b10..788e74c42ec1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java @@ -755,6 +755,9 @@ private Schema normalizeAllOfWithProperties(Schema schema, Set visitedSc return schema; } + // process rule to refactor properties into allOf sub-schema + schema = processRefactorAllOfWithPropertiesOnly(schema); + for (Object item : schema.getAllOf()) { if (!(item instanceof Schema)) { throw new RuntimeException("Error! allOf schema is not of the type Schema: " + item); @@ -762,8 +765,6 @@ private Schema normalizeAllOfWithProperties(Schema schema, Set visitedSc // normalize allOf sub schemas one by one normalizeSchema((Schema) item, visitedSchemas); } - // process rules here - schema = processRefactorAllOfWithPropertiesOnly(schema); return schema; } @@ -1325,9 +1326,8 @@ private Schema processRefactorAllOfWithPropertiesOnly(Schema schema) { schema.setTitle(null); // at this point the schema becomes a simple allOf (no properties) with an additional schema containing - // the properties - - return schema; + // the properties. Normalize it before returning. + return normalizeSchema(schema, new HashSet<>()); } /** diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java index f8a4c15c8804..c7713234d74a 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java @@ -56,6 +56,30 @@ public void testOpenAPINormalizerRefAsParentInAllOf() { assertEquals(schema5.getExtensions().get("x-parent"), "abstract"); } + @Test + public void testOpenAPINormalizerRefAsParentInAllOfAndRefactorAllOfWithProperties() { + // to test the both REF_AS_PARENT_IN_ALLOF and REFACTOR_ALLOF_WITH_PROPERTIES_ONLY + OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/allOf_extension_parent.yaml"); + + Schema schema = openAPI.getComponents().getSchemas().get("Child"); + assertNull(schema.getExtensions()); + + Schema schema2 = openAPI.getComponents().getSchemas().get("Ancestor"); + assertNull(schema2.getExtensions()); + + Map options = new HashMap<>(); + options.put("REF_AS_PARENT_IN_ALLOF", "true"); + options.put("REFACTOR_ALLOF_WITH_PROPERTIES_ONLY", "true"); + OpenAPINormalizer openAPINormalizer = new OpenAPINormalizer(openAPI, options); + openAPINormalizer.normalize(); + + Schema schema3 = openAPI.getComponents().getSchemas().get("Ancestor"); + assertEquals(schema3.getExtensions().get("x-parent"), true); + + Schema schema4 = openAPI.getComponents().getSchemas().get("Child"); + assertNull(schema4.getExtensions()); + } + @Test public void testOpenAPINormalizerEnableKeepOnlyFirstTagInOperation() { OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/enableKeepOnlyFirstTagInOperation_test.yaml"); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java index b193ec296628..6789b897591a 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java @@ -1776,7 +1776,7 @@ public void testJdkHttpClientWithAndWithoutParentExtension() { List files = generator.opts(configurator.toClientOptInput()).generate(); validateJavaSourceFiles(files); - assertThat(files).hasSize(27); + assertThat(files).hasSize(33); assertThat(output.resolve("src/main/java/xyz/abcdef/model/Child.java")) .content().contains("public class Child extends Person {"); assertThat(output.resolve("src/main/java/xyz/abcdef/model/Adult.java")) diff --git a/modules/openapi-generator/src/test/resources/3_0/allOf_extension_parent.yaml b/modules/openapi-generator/src/test/resources/3_0/allOf_extension_parent.yaml index 873cc7a3788f..8d9a1146c790 100644 --- a/modules/openapi-generator/src/test/resources/3_0/allOf_extension_parent.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/allOf_extension_parent.yaml @@ -101,4 +101,15 @@ components: description: allOf with a single item nullable: true allOf: - - $ref: '#/components/schemas/AnotherParent' \ No newline at end of file + - $ref: '#/components/schemas/AnotherParent' + Ancestor: + type: object + properties: + p1: + type: integer + Offspring: + properties: + p2: + type: string + allOf: + - $ref: '#/components/schemas/Ancestor' \ No newline at end of file