From 1cb15284476641b7692182e91faf9c613649e17f Mon Sep 17 00:00:00 2001 From: Justin Black Date: Tue, 1 Sep 2020 08:55:18 -0700 Subject: [PATCH 1/4] Adds fix for issue7262 and a test of it --- .../openapitools/codegen/DefaultCodegen.java | 5 +-- .../codegen/DefaultCodegenTest.java | 23 +++++++++- .../src/test/resources/3_0/issue7262.yaml | 42 +++++++++++++++++++ 3 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 modules/openapi-generator/src/test/resources/3_0/issue7262.yaml diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 0b4cee1b87eb..a9bb1318147f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -2826,9 +2826,8 @@ protected List getAllOfDescendants(String thisSchemaName, OpenAPI o if (ref == null) { // for schemas with no ref, it is not possible to build the discriminator map // because ref is how we get the model name - // we only hit this use case for a schema with inline composed schemas, and one of those - // schemas also has inline composed schemas - throw new RuntimeException("Invalid inline schema defined in allOf in '" + childName + "'. Per the OpenApi spec, for this case when a composed schema defines a discriminator, the allOf schemas must use $ref. Change this inline definition to a $ref definition"); + // we hit this use case when an allOf composed schema contains an inline schema + continue; } String parentName = ModelUtils.getSimpleRef(ref); if (parentName.equals(currentSchemaName)) { diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 472ee64f586a..97ec9b3136d4 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -33,7 +33,6 @@ import io.swagger.v3.oas.models.responses.ApiResponses; import io.swagger.v3.parser.core.models.ParseOptions; -import org.openapitools.codegen.languages.JavaClientCodegen; import org.openapitools.codegen.templating.mustache.CamelCaseLambda; import org.openapitools.codegen.templating.mustache.IndentedLambda; import org.openapitools.codegen.templating.mustache.LowercaseLambda; @@ -2231,4 +2230,26 @@ public void testFormComposedSchema() { assertTrue(names.contains("passwordConfirmation")); assertTrue(names.contains("oldPassword")); } + + @Test + public void inlineAllOfSchemaDoesNotThrowException() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/issue7262.yaml"); + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setOpenAPI(openAPI); + + String modelName = "UserTimeBase"; + Schema sc = openAPI.getComponents().getSchemas().get(modelName); + CodegenModel cm = codegen.fromModel(modelName, sc); + + final Set expectedMappedModels = new HashSet<>(Arrays.asList(new CodegenDiscriminator.MappedModel("UserSleep", "UserSleep"))); + final Set mappedModels = cm.getDiscriminator().getMappedModels(); + assertEquals(mappedModels, expectedMappedModels); + + modelName = "UserSleep"; + sc = openAPI.getComponents().getSchemas().get(modelName); + cm = codegen.fromModel(modelName, sc); + final Set expectedAllOf = new HashSet<>(Arrays.asList("UserTimeBase", "UserSleepAllOf")); + assertEquals(cm.allOf, expectedAllOf); + assertEquals(openAPI.getComponents().getSchemas().size(), 3); + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/issue7262.yaml b/modules/openapi-generator/src/test/resources/3_0/issue7262.yaml new file mode 100644 index 000000000000..834e91e27103 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue7262.yaml @@ -0,0 +1,42 @@ +openapi: "3.0.1" +info: + version: 1.0.0 + title: allOf discriminator issue +paths: + /sleep: + patch: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserSleep' + responses: + '200': + description: Updated +components: + schemas: + UserSleep: + allOf: + - $ref: '#/components/schemas/UserTimeBase' + - type: object + properties: + break: + type: string + nullable: true + additionalProperties: true + UserTimeBase: + required: + - "$type" + type: object + properties: + "$type": + type: string + start: + type: string + nullable: true + end: + type: string + nullable: true + additionalProperties: true + discriminator: + propertyName: "$type" \ No newline at end of file From 7b1b7a8216b3a63d44fb4a8fcbbd7754c086697b Mon Sep 17 00:00:00 2001 From: Justin Black Date: Tue, 1 Sep 2020 09:03:35 -0700 Subject: [PATCH 2/4] Updates inline schema to not include properties --- .../java/org/openapitools/codegen/DefaultCodegenTest.java | 4 ++-- .../src/test/resources/3_0/issue7262.yaml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 97ec9b3136d4..b0eec5db1004 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -2248,8 +2248,8 @@ public void inlineAllOfSchemaDoesNotThrowException() { modelName = "UserSleep"; sc = openAPI.getComponents().getSchemas().get(modelName); cm = codegen.fromModel(modelName, sc); - final Set expectedAllOf = new HashSet<>(Arrays.asList("UserTimeBase", "UserSleepAllOf")); + final Set expectedAllOf = new HashSet<>(Arrays.asList("UserTimeBase")); assertEquals(cm.allOf, expectedAllOf); - assertEquals(openAPI.getComponents().getSchemas().size(), 3); + assertEquals(openAPI.getComponents().getSchemas().size(), 2); } } diff --git a/modules/openapi-generator/src/test/resources/3_0/issue7262.yaml b/modules/openapi-generator/src/test/resources/3_0/issue7262.yaml index 834e91e27103..8687aea8fcd3 100644 --- a/modules/openapi-generator/src/test/resources/3_0/issue7262.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/issue7262.yaml @@ -19,10 +19,10 @@ components: allOf: - $ref: '#/components/schemas/UserTimeBase' - type: object - properties: - break: - type: string - nullable: true +# properties: +# break: +# type: string +# nullable: true additionalProperties: true UserTimeBase: required: From 9604b21c5fc5968856ab4d504346194d02228bc1 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Tue, 1 Sep 2020 09:05:39 -0700 Subject: [PATCH 3/4] Adds null check of discriminator --- .../test/java/org/openapitools/codegen/DefaultCodegenTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index b0eec5db1004..4dec1cb34417 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -2251,5 +2251,6 @@ public void inlineAllOfSchemaDoesNotThrowException() { final Set expectedAllOf = new HashSet<>(Arrays.asList("UserTimeBase")); assertEquals(cm.allOf, expectedAllOf); assertEquals(openAPI.getComponents().getSchemas().size(), 2); + assertNull(cm.getDiscriminator()); } } From 91adeda8ae3585bd660d398e0119f8dcc09b65a4 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Tue, 1 Sep 2020 10:02:29 -0700 Subject: [PATCH 4/4] Updates issue sample file --- .../openapi-generator/src/test/resources/3_0/issue7262.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/openapi-generator/src/test/resources/3_0/issue7262.yaml b/modules/openapi-generator/src/test/resources/3_0/issue7262.yaml index 8687aea8fcd3..6c5ea413fa6e 100644 --- a/modules/openapi-generator/src/test/resources/3_0/issue7262.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/issue7262.yaml @@ -19,10 +19,6 @@ components: allOf: - $ref: '#/components/schemas/UserTimeBase' - type: object -# properties: -# break: -# type: string -# nullable: true additionalProperties: true UserTimeBase: required: