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 248ff099e3af..f55e82545ef5 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 @@ -1160,6 +1160,8 @@ public class DefaultCodegen implements CodegenConfig { } } else if (ModelUtils.isMapSchema(schema)) { datatype = "map"; + } else if (ModelUtils.isArraySchema(schema)) { + datatype = "array"; } else if (ModelUtils.isUUIDSchema(schema)) { datatype = "UUID"; } else if (ModelUtils.isStringSchema(schema)) { @@ -2344,7 +2346,11 @@ public class DefaultCodegen implements CodegenConfig { if (ModelUtils.isArraySchema(responseSchema)) { ArraySchema as = (ArraySchema) responseSchema; CodegenProperty innerProperty = fromProperty("response", as.getItems()); - r.baseType = innerProperty.baseType; + CodegenProperty innerCp = innerProperty; + while(innerCp != null) { + r.baseType = innerCp.baseType; + innerCp = innerCp.items; + } } else { if (cp.complexType != null) { r.baseType = cp.complexType; @@ -4051,7 +4057,7 @@ public class DefaultCodegen implements CodegenConfig { Map properties = schema.getProperties(); for (Map.Entry entry : properties.entrySet()) { CodegenParameter codegenParameter = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER); - // key => property anme + // key => property name // value => property schema codegenParameter = fromFormProperty(entry.getKey(), entry.getValue(), imports); @@ -4151,6 +4157,7 @@ public class DefaultCodegen implements CodegenConfig { CodegenParameter codegenParameter = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER); codegenParameter.baseName = "UNKNOWN_BASE_NAME"; codegenParameter.paramName = "UNKNOWN_PARAM_NAME"; + codegenParameter.description = body.getDescription(); codegenParameter.required = body.getRequired() != null ? body.getRequired() : Boolean.FALSE; codegenParameter.isBodyParam = Boolean.TRUE; @@ -4207,10 +4214,7 @@ public class DefaultCodegen implements CodegenConfig { inner = new StringSchema().description("//TODO automatically added by swagger-codegen"); arraySchema.setItems(inner); } - CodegenProperty codegenProperty = fromProperty("inner", inner); - if (codegenProperty.complexType != null) { - imports.add(codegenProperty.complexType); - } + CodegenProperty codegenProperty = fromProperty("property", schema); imports.add(codegenProperty.baseType); CodegenProperty innerCp = codegenProperty; while (innerCp != null) { @@ -4221,12 +4225,11 @@ public class DefaultCodegen implements CodegenConfig { } codegenParameter.baseName = codegenProperty.baseType; codegenParameter.paramName = toParamName(codegenProperty.baseType); - codegenParameter.items = codegenProperty; + codegenParameter.items = codegenProperty.items; codegenParameter.dataType = getTypeDeclaration(arraySchema); - codegenParameter.baseType = codegenProperty.complexType; + codegenParameter.baseType = getSchemaType(arraySchema); codegenParameter.isContainer = Boolean.TRUE; codegenParameter.isListContainer = Boolean.TRUE; - codegenParameter.description = codegenProperty.description; setParameterBooleanFlagWithCodegenProperty(codegenParameter, codegenProperty); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/bash/BashTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/bash/BashTest.java index 1c29ba69e927..edbb4e9eb1d6 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/bash/BashTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/bash/BashTest.java @@ -41,6 +41,9 @@ public class BashTest { op.vendorExtensions.get("x-bash-codegen-description"), "Multiple status 'values' can be provided with comma separated strings"); + Assert.assertEquals(op.allParams.size(), 1); + CodegenParameter p = op.allParams.get(0); + Assert.assertEquals(p.description, "Status values that need to be considered for filter"); } @Test(description = "test basic petstore operation with example body") @@ -63,10 +66,11 @@ public class BashTest { Assert.assertEquals(op.bodyParams.size(), 1); - CodegenParameter pet = op.bodyParams.get(0); + CodegenParameter p = op.bodyParams.get(0); - Assert.assertTrue(pet.vendorExtensions + Assert.assertTrue(p.vendorExtensions .containsKey("x-codegen-body-example")); + Assert.assertEquals(p.description, "Pet object that needs to be added to the store"); } 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 0d75125c579e..7e78e333a959 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 @@ -147,12 +147,18 @@ public class JavaClientCodegenTest { body1.setDescription("A list of ids"); body1.setContent(new Content().addMediaType("application/json", new MediaType().schema(new ArraySchema().items(new StringSchema())))); CodegenParameter codegenParameter1 = codegen.fromRequestBody(body1 , new HashMap(), new HashSet()); + Assert.assertEquals(codegenParameter1.description, "A list of ids"); + Assert.assertEquals(codegenParameter1.dataType, "List"); + Assert.assertEquals(codegenParameter1.baseType, "List"); RequestBody body2 = new RequestBody(); body2.setDescription("A list of list of values"); body2.setContent(new Content().addMediaType("application/json", new MediaType().schema(new ArraySchema().items(new ArraySchema().items(new IntegerSchema()))))); CodegenParameter codegenParameter2 = codegen.fromRequestBody(body2 , new HashMap(), new HashSet()); - + Assert.assertEquals(codegenParameter2.description, "A list of list of values"); + Assert.assertEquals(codegenParameter2.dataType, "List>"); + Assert.assertEquals(codegenParameter2.baseType, "List"); + RequestBody body3 = new RequestBody(); body3.setDescription("A list of points"); body3.setContent(new Content().addMediaType("application/json", new MediaType().schema(new ArraySchema().items(new ObjectSchema().$ref("#/components/schemas/Point"))))); @@ -161,6 +167,9 @@ public class JavaClientCodegenTest { point.addProperties("x", new IntegerSchema().format(SchemaTypeUtil.INTEGER32_FORMAT)); point.addProperties("y", new IntegerSchema().format(SchemaTypeUtil.INTEGER32_FORMAT)); CodegenParameter codegenParameter3 = codegen.fromRequestBody(body3 , Collections.singletonMap("Point", point), new HashSet()); + Assert.assertEquals(codegenParameter3.description, "A list of points"); + Assert.assertEquals(codegenParameter3.dataType, "List"); + Assert.assertEquals(codegenParameter3.baseType, "List"); } @Test diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelEnumTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelEnumTest.java index 4c4cb9722e98..3fdd1431e51d 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelEnumTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelEnumTest.java @@ -1,11 +1,13 @@ package org.openapitools.codegen.java; +import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.ComposedSchema; import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.media.StringSchema; import org.openapitools.codegen.CodegenModel; import org.openapitools.codegen.CodegenProperty; +import org.openapitools.codegen.DefaultCodegen; import org.openapitools.codegen.languages.JavaClientCodegen; import org.testng.Assert; import org.testng.annotations.Test; @@ -36,6 +38,63 @@ public class JavaModelEnumTest { Assert.assertTrue(enumVar.isEnum); } + @Test(description = "convert a java model with an enum inside a list") + public void converterInArrayTest() { + final ArraySchema enumSchema = new ArraySchema().items( + new StringSchema().addEnumItem("Aaaa").addEnumItem("Bbbb")); + final Schema model = new Schema().type("object").addProperties("name", enumSchema); + + final DefaultCodegen codegen = new JavaClientCodegen(); + final CodegenModel cm = codegen.fromModel("sample", model); + + Assert.assertEquals(cm.vars.size(), 1); + + final CodegenProperty enumVar = cm.vars.get(0); + Assert.assertEquals(enumVar.baseName, "name"); + Assert.assertEquals(enumVar.datatype, "List"); + Assert.assertEquals(enumVar.datatypeWithEnum, "List"); + Assert.assertEquals(enumVar.name, "name"); + Assert.assertEquals(enumVar.defaultValue, "new ArrayList()"); + Assert.assertEquals(enumVar.baseType, "List"); + Assert.assertTrue(enumVar.isEnum); + + Assert.assertEquals(enumVar.items.baseName, "name"); + Assert.assertEquals(enumVar.items.datatype, "String"); + Assert.assertEquals(enumVar.items.datatypeWithEnum, "NameEnum"); + Assert.assertEquals(enumVar.items.name, "name"); + Assert.assertEquals(enumVar.items.defaultValue, "null"); + Assert.assertEquals(enumVar.items.baseType, "String"); + } + + @Test(description = "convert a java model with an enum inside a list") + public void converterInArrayInArrayTest() { + final ArraySchema enumSchema = new ArraySchema().items( + new ArraySchema().items( + new StringSchema().addEnumItem("Aaaa").addEnumItem("Bbbb"))); + final Schema model = new Schema().type("object").addProperties("name", enumSchema); + + final DefaultCodegen codegen = new JavaClientCodegen(); + final CodegenModel cm = codegen.fromModel("sample", model); + + Assert.assertEquals(cm.vars.size(), 1); + + final CodegenProperty enumVar = cm.vars.get(0); + Assert.assertEquals(enumVar.baseName, "name"); + Assert.assertEquals(enumVar.datatype, "List>"); + Assert.assertEquals(enumVar.datatypeWithEnum, "List>"); + Assert.assertEquals(enumVar.name, "name"); + Assert.assertEquals(enumVar.defaultValue, "new ArrayList>()"); + Assert.assertEquals(enumVar.baseType, "List"); + Assert.assertTrue(enumVar.isEnum); + + Assert.assertEquals(enumVar.items.items.baseName, "name"); + Assert.assertEquals(enumVar.items.items.datatype, "String"); + Assert.assertEquals(enumVar.items.items.datatypeWithEnum, "NameEnum"); + Assert.assertEquals(enumVar.items.items.name, "name"); + Assert.assertEquals(enumVar.items.items.defaultValue, "null"); + Assert.assertEquals(enumVar.items.items.baseType, "String"); + } + @Test(description = "not override identical parent enums") public void overrideEnumTest() { final StringSchema identicalEnumProperty = new StringSchema(); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelTest.java index 1994c051ebbc..9bb6be83856d 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelTest.java @@ -17,6 +17,7 @@ import io.swagger.v3.oas.models.media.StringSchema; import io.swagger.v3.oas.models.media.XML; import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.parameters.QueryParameter; +import io.swagger.v3.oas.models.parameters.RequestBody; import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.responses.ApiResponses; import io.swagger.v3.parser.util.SchemaTypeUtil; @@ -538,12 +539,14 @@ public class JavaModelTest { @Test(description = "convert a parameter") public void convertParameterTest() { final Parameter parameter = new QueryParameter() + .description("this is a description") .name("limit") .required(true); final DefaultCodegen codegen = new JavaClientCodegen(); final CodegenParameter cm = codegen.fromParameter(parameter, null); Assert.assertNull(cm.allowableValues); + Assert.assertEquals(cm.description, "this is a description"); } @Test(description = "types used by inner properties should be imported") @@ -805,39 +808,47 @@ public class JavaModelTest { Assert.assertEquals(cp1.datatype, "List"); Assert.assertEquals(cp1.name, "pets"); Assert.assertEquals(cp1.baseType, "List"); + Assert.assertTrue(cp1.isContainer); + Assert.assertTrue(cp1.isListContainer); + Assert.assertFalse(cp1.isMapContainer); Assert.assertEquals(cp1.getter, "getPets"); + Assert.assertEquals(cp1.items.baseType, "Pet"); Assert.assertTrue(cm.imports.contains("List")); Assert.assertTrue(cm.imports.contains("Pet")); } -// @Test(description = "convert an array schema in a RequestBody") -// public void arraySchemaTestInRequestBody() { -// final Schema testSchema = new ArraySchema() -// .items(new Schema<>().$ref("#/components/schemas/Pet")); -// Operation operation = new Operation() -// .requestBody(new RequestBody() -// .content(new Content().addMediaType("application/json", -// new MediaType().schema(testSchema)))) -// .responses( -// new ApiResponses().addApiResponse("204", new ApiResponse() -// .description("Ok response"))); -// final Map allDefinitions = Collections. singletonMap("Pet", new ObjectSchema()); -// final DefaultCodegen codegen = new JavaClientCodegen(); -// final CodegenOperation co = codegen.fromOperation("testSchema", "GET", operation, allDefinitions); -// -// Assert.assertEquals(co.bodyParams.size(), 1); -// CodegenParameter cp1 = co.bodyParams.get(0); -// Assert.assertEquals(cp1.baseType, "Pet"); -// Assert.assertEquals(cp1.dataType, "List"); -// Assert.assertEquals(cp1.items.baseType, "Pet"); -// Assert.assertEquals(cp1.items.complexType, "Pet"); -// Assert.assertEquals(cp1.items.datatype, "List"); -// -// Assert.assertEquals(co.responses.size(), 1); -// -// Assert.assertTrue(co.imports.contains("Pet")); -// } + @Test(description = "convert an array schema in a RequestBody") + public void arraySchemaTestInRequestBody() { + final Schema testSchema = new ArraySchema() + .items(new Schema<>().$ref("#/components/schemas/Pet")); + Operation operation = new Operation() + .requestBody(new RequestBody() + .content(new Content().addMediaType("application/json", + new MediaType().schema(testSchema)))) + .responses( + new ApiResponses().addApiResponse("204", new ApiResponse() + .description("Ok response"))); + final Map allDefinitions = Collections. singletonMap("Pet", new ObjectSchema()); + final DefaultCodegen codegen = new JavaClientCodegen(); + final CodegenOperation co = codegen.fromOperation("testSchema", "GET", operation, allDefinitions); + + Assert.assertEquals(co.bodyParams.size(), 1); + CodegenParameter cp1 = co.bodyParams.get(0); + Assert.assertEquals(cp1.baseType, "List"); + Assert.assertEquals(cp1.dataType, "List"); + Assert.assertTrue(cp1.isContainer); + Assert.assertTrue(cp1.isListContainer); + Assert.assertFalse(cp1.isMapContainer); + Assert.assertEquals(cp1.items.baseType, "Pet"); + Assert.assertEquals(cp1.items.complexType, "Pet"); + Assert.assertEquals(cp1.items.datatype, "Pet"); + + Assert.assertEquals(co.responses.size(), 1); + + Assert.assertTrue(co.imports.contains("List")); + Assert.assertTrue(co.imports.contains("Pet")); + } @Test(description = "convert an array schema in a ApiResponse") public void arraySchemaTestInOperationResponse() { @@ -883,6 +894,65 @@ public class JavaModelTest { Assert.assertTrue(cm.imports.contains("Pet")); } + @Test(description = "convert an array of array schema in a RequestBody") + public void arrayOfArraySchemaTestInRequestBody() { + final Schema testSchema = new ArraySchema() + .items(new ArraySchema() + .items(new Schema<>().$ref("#/components/schemas/Pet"))); + Operation operation = new Operation() + .requestBody(new RequestBody() + .content(new Content().addMediaType("application/json", + new MediaType().schema(testSchema)))) + .responses( + new ApiResponses().addApiResponse("204", new ApiResponse() + .description("Ok response"))); + final Map allDefinitions = Collections. singletonMap("Pet", new ObjectSchema()); + final DefaultCodegen codegen = new JavaClientCodegen(); + final CodegenOperation co = codegen.fromOperation("testSchema", "GET", operation, allDefinitions); + + Assert.assertEquals(co.bodyParams.size(), 1); + CodegenParameter cp1 = co.bodyParams.get(0); + Assert.assertEquals(cp1.baseType, "List"); + Assert.assertEquals(cp1.dataType, "List>"); + Assert.assertTrue(cp1.isContainer); + Assert.assertTrue(cp1.isListContainer); + Assert.assertFalse(cp1.isMapContainer); + Assert.assertEquals(cp1.items.baseType, "List"); + Assert.assertEquals(cp1.items.complexType, "Pet"); + Assert.assertEquals(cp1.items.datatype, "List"); + Assert.assertEquals(cp1.items.items.baseType, "Pet"); + Assert.assertEquals(cp1.items.items.complexType, "Pet"); + Assert.assertEquals(cp1.items.items.datatype, "Pet"); + + Assert.assertEquals(co.responses.size(), 1); + + Assert.assertTrue(co.imports.contains("Pet")); + Assert.assertTrue(co.imports.contains("List")); + } + + @Test(description = "convert a array schema in a ApiResponse") + public void arrayOfArraySchemaTestInOperationResponse() { + final Schema testSchema = new ArraySchema() + .items(new ArraySchema() + .items(new Schema<>().$ref("#/components/schemas/Pet"))); + Operation operation = new Operation().responses( + new ApiResponses().addApiResponse("200", new ApiResponse() + .description("Ok response") + .content(new Content().addMediaType("application/json", + new MediaType().schema(testSchema))))); + final Map allDefinitions = Collections. singletonMap("Pet", new ObjectSchema()); + final DefaultCodegen codegen = new JavaClientCodegen(); + final CodegenOperation co = codegen.fromOperation("testSchema", "GET", operation, allDefinitions); + + Assert.assertEquals(co.responses.size(), 1); + CodegenResponse cr = co.responses.get(0); + Assert.assertEquals(cr.baseType, "Pet"); + Assert.assertEquals(cr.dataType, "List>"); + Assert.assertEquals(cr.containerType, "array"); + + Assert.assertTrue(co.imports.contains("Pet")); + } + @Test(enabled = false, description = "disabled since templates have been moved.") public void generateModel() throws Exception { folder.create();