Array fixes (#102)

* Fix for arrays in requestBody

* Map description from RequestBody in CodegenParameter

* Fix missing import of model class with nested arrays in response

* Fix imports, consistent 'baseType'

* Add tests for enum
This commit is contained in:
Jérémie Bresson
2018-04-18 05:20:58 +02:00
committed by GitHub
parent f5f6a7b1fa
commit 48ae13df81
5 changed files with 184 additions and 39 deletions

View File

@@ -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<String, Schema> properties = schema.getProperties();
for (Map.Entry<String, Schema> 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);

View File

@@ -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");
}

View File

@@ -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<String, Schema>(), new HashSet<String>());
Assert.assertEquals(codegenParameter1.description, "A list of ids");
Assert.assertEquals(codegenParameter1.dataType, "List<String>");
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<String, Schema>(), new HashSet<String>());
Assert.assertEquals(codegenParameter2.description, "A list of list of values");
Assert.assertEquals(codegenParameter2.dataType, "List<List<Integer>>");
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.<String, Schema>singletonMap("Point", point), new HashSet<String>());
Assert.assertEquals(codegenParameter3.description, "A list of points");
Assert.assertEquals(codegenParameter3.dataType, "List<Point>");
Assert.assertEquals(codegenParameter3.baseType, "List");
}
@Test

View File

@@ -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<String>");
Assert.assertEquals(enumVar.datatypeWithEnum, "List<NameEnum>");
Assert.assertEquals(enumVar.name, "name");
Assert.assertEquals(enumVar.defaultValue, "new ArrayList<NameEnum>()");
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<List<String>>");
Assert.assertEquals(enumVar.datatypeWithEnum, "List<List<NameEnum>>");
Assert.assertEquals(enumVar.name, "name");
Assert.assertEquals(enumVar.defaultValue, "new ArrayList<List<NameEnum>>()");
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();

View File

@@ -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<Pet>");
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<String, Schema> allDefinitions = Collections.<String, Schema> 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<Pet>");
// Assert.assertEquals(cp1.items.baseType, "Pet");
// Assert.assertEquals(cp1.items.complexType, "Pet");
// Assert.assertEquals(cp1.items.datatype, "List<Pet>");
//
// 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<String, Schema> allDefinitions = Collections.<String, Schema> 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<Pet>");
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<String, Schema> allDefinitions = Collections.<String, Schema> 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<List<Pet>>");
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<Pet>");
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<String, Schema> allDefinitions = Collections.<String, Schema> 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<List<Pet>>");
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();