From 37556c2d9679b16ea65ebc493b2efeb992fc8ce9 Mon Sep 17 00:00:00 2001 From: Akihito Nakano Date: Wed, 19 Feb 2020 15:54:54 +0900 Subject: [PATCH] Fix: "isAlias" of CodegenModel (#2758) * Add test case to reproduce the issue https://github.com/OpenAPITools/openapi-generator/issues/2574 * Fix: an alias of "an alias of simple OAS type" has an incorrect property `isAlias: false` * Use ModelUtils instead of referring the "type" value directly * Delete an unnecessary condition * Tweak: the order of conditions * Fix wrong "isAlias" value on ComposedSchema --- .../openapitools/codegen/DefaultCodegen.java | 18 +++++--- .../codegen/DefaultCodegenTest.java | 22 ++++++++++ .../src/test/resources/3_0/type_alias.yaml | 44 +++++++++++++++++++ 3 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 modules/openapi-generator/src/test/resources/3_0/type_alias.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 41fef60a4cc..fe54c87dcb6 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 @@ -2047,7 +2047,8 @@ public class DefaultCodegen implements CodegenConfig { if (schema.getExtensions() != null && !schema.getExtensions().isEmpty()) { m.getVendorExtensions().putAll(schema.getExtensions()); } - m.isAlias = typeAliases.containsKey(name); + m.isAlias = (typeAliases.containsKey(name) + || isAliasOfSimpleTypes(schema)); // check if the unaliased schema is an alias of simple OAS types m.discriminator = createDiscriminator(name, schema); if (schema.getXml() != null) { @@ -4204,11 +4205,10 @@ public class DefaultCodegen implements CodegenConfig { Map aliases = new HashMap<>(); for (Map.Entry entry : schemas.entrySet()) { - String oasName = entry.getKey(); Schema schema = entry.getValue(); - String schemaType = getPrimitiveType(schema); - if (schemaType != null && !schemaType.equals("object") && !schemaType.equals("array") - && schema.getEnum() == null && !ModelUtils.isMapSchema(schema)) { + if (isAliasOfSimpleTypes(schema)) { + String oasName = entry.getKey(); + String schemaType = getPrimitiveType(schema); aliases.put(oasName, schemaType); } @@ -4217,6 +4217,14 @@ public class DefaultCodegen implements CodegenConfig { return aliases; } + private static Boolean isAliasOfSimpleTypes(Schema schema) { + return (!ModelUtils.isObjectSchema(schema) + && !ModelUtils.isArraySchema(schema) + && !ModelUtils.isMapSchema(schema) + && !ModelUtils.isComposedSchema(schema) + && schema.getEnum() == null); + } + /** * Remove characters not suitable for variable or method name from the input and camelize it * 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 d2118046372..3e48b0fc1d5 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 @@ -950,6 +950,28 @@ public class DefaultCodegenTest { Assert.assertTrue(cm.isDouble); } + @Test + public void testAlias() { + final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/type_alias.yaml"); + new InlineModelResolver().flatten(openAPI); + + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setOpenAPI(openAPI); + + CodegenModel typeAliasModel = codegen.fromModel( + "MyParameterTextField", + openAPI.getComponents().getSchemas().get("MyParameterTextField") + ); + Assert.assertTrue(typeAliasModel.isAlias); + Assert.assertEquals("string", typeAliasModel.dataType); + + CodegenModel composedModel = codegen.fromModel( + "ComposedModel", + openAPI.getComponents().getSchemas().get("ComposedModel") + ); + Assert.assertFalse(composedModel.isAlias); + } + private void verifyPersonDiscriminator(CodegenDiscriminator discriminator) { CodegenDiscriminator test = new CodegenDiscriminator(); test.setPropertyName("DollarUnderscoretype"); diff --git a/modules/openapi-generator/src/test/resources/3_0/type_alias.yaml b/modules/openapi-generator/src/test/resources/3_0/type_alias.yaml new file mode 100644 index 00000000000..a44c82d7b3f --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/type_alias.yaml @@ -0,0 +1,44 @@ +openapi: "3.0.1" +info: + version: 0.0.1 + title: broken API +paths: + /test: + put: + summary: No description + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MyParameter' + responses: + 200: + description: "OK" +components: + schemas: + MyParameter: + type: object + properties: + text_field: + $ref: '#/components/schemas/MyParameterTextField' + MyParameterTextField: + $ref: '#/components/schemas/TypeAliasToString' + TypeAliasToString: + type: string + minLength: 1 + maxLength: 50 + BaseModel: + type: object + discriminator: className + required: + - className + properties: + className: + type: string + ComposedModel: + allOf: + - $ref: '#/components/schemas/BaseModel' + - type: object + properties: + testProperty: + type: string \ No newline at end of file