Merge pull request #2163 from vivin/enum-support-in-query-params

Support for enums in query parameters (issue #1347)
This commit is contained in:
wing328 2016-02-27 22:57:30 +08:00
commit d619b5e02e
4 changed files with 110 additions and 5 deletions

View File

@ -7,9 +7,9 @@ import java.util.List;
public class CodegenParameter { public class CodegenParameter {
public Boolean isFormParam, isQueryParam, isPathParam, isHeaderParam, public Boolean isFormParam, isQueryParam, isPathParam, isHeaderParam,
isCookieParam, isBodyParam, hasMore, isContainer, isCookieParam, isBodyParam, hasMore, isContainer,
secondaryParam, isCollectionFormatMulti; secondaryParam, isCollectionFormatMulti;
public String baseName, paramName, dataType, collectionFormat, description, baseType, defaultValue; public String baseName, paramName, dataType, datatypeWithEnum, collectionFormat, description, baseType, defaultValue;
public String jsonSchema; public String jsonSchema;
public Boolean isString, isInteger, isLong, isFloat, isDouble, isByteArray, isBinary, isBoolean, isDate, isDateTime; public Boolean isString, isInteger, isLong, isFloat, isDouble, isByteArray, isBinary, isBoolean, isDate, isDateTime;
public Boolean isListContainer, isMapContainer; public Boolean isListContainer, isMapContainer;
@ -17,6 +17,7 @@ public class CodegenParameter {
public boolean isEnum; public boolean isEnum;
public List<String> _enum; public List<String> _enum;
public Map<String, Object> allowableValues; public Map<String, Object> allowableValues;
public CodegenProperty items;
public Map<String, Object> vendorExtensions; public Map<String, Object> vendorExtensions;
/** /**
@ -81,6 +82,7 @@ public class CodegenParameter {
output.baseName = this.baseName; output.baseName = this.baseName;
output.paramName = this.paramName; output.paramName = this.paramName;
output.dataType = this.dataType; output.dataType = this.dataType;
output.datatypeWithEnum = this.datatypeWithEnum;
output.collectionFormat = this.collectionFormat; output.collectionFormat = this.collectionFormat;
output.isCollectionFormatMulti = this.isCollectionFormatMulti; output.isCollectionFormatMulti = this.isCollectionFormatMulti;
output.description = this.description; output.description = this.description;
@ -112,6 +114,9 @@ public class CodegenParameter {
if (this.allowableValues != null) { if (this.allowableValues != null) {
output.allowableValues = new HashMap<String, Object>(this.allowableValues); output.allowableValues = new HashMap<String, Object>(this.allowableValues);
} }
if (this.items != null) {
output.items = this.items;
}
output.vendorExtensions = this.vendorExtensions; output.vendorExtensions = this.vendorExtensions;
output.isBinary = this.isBinary; output.isBinary = this.isBinary;
output.isByteArray = this.isByteArray; output.isByteArray = this.isByteArray;

View File

@ -1660,9 +1660,16 @@ public class DefaultCodegen {
setParameterBooleanFlagWithCodegenProperty(p, model); setParameterBooleanFlagWithCodegenProperty(p, model);
p.dataType = model.datatype; p.dataType = model.datatype;
if(model.isEnum) {
p.datatypeWithEnum = model.datatypeWithEnum;
}
p.isEnum = model.isEnum; p.isEnum = model.isEnum;
p._enum = model._enum; p._enum = model._enum;
p.allowableValues = model.allowableValues; p.allowableValues = model.allowableValues;
if(model.items != null && model.items.isEnum) {
p.datatypeWithEnum = model.datatypeWithEnum;
p.items = model.items;
}
p.collectionFormat = collectionFormat; p.collectionFormat = collectionFormat;
if(collectionFormat != null && collectionFormat.equals("multi")) { if(collectionFormat != null && collectionFormat.equals("multi")) {
p.isCollectionFormatMulti = true; p.isCollectionFormatMulti = true;

View File

@ -81,6 +81,40 @@ public class CodegenTest {
Assert.assertNull(statusParam.hasMore); Assert.assertNull(statusParam.hasMore);
} }
@Test(description = "handle enum array in query parameter test")
public void enumArrayQueryParameterTest() {
final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/petstore.json");
final DefaultCodegen codegen = new DefaultCodegen();
final String path = "/pet/findByStatus";
final Operation p = model.getPaths().get(path).getGet();
final CodegenOperation op = codegen.fromOperation(path, "get", p, model.getDefinitions());
Assert.assertEquals(op.queryParams.size(), 1);
final CodegenParameter statusParam = op.queryParams.get(0);
Assert.assertEquals(statusParam.items.datatypeWithEnum, "StatusEnum");
Assert.assertNotNull(statusParam.items);
Assert.assertTrue(statusParam.items.isEnum);
Assert.assertEquals(statusParam.items._enum.size(), 3);
}
@Test(description = "handle enum in query parameter test")
public void enumQueryParameterTest() {
final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/petstore.json");
final DefaultCodegen codegen = new DefaultCodegen();
final String path = "/store/findByStatus";
final Operation p = model.getPaths().get(path).getGet();
final CodegenOperation op = codegen.fromOperation(path, "get", p, model.getDefinitions());
Assert.assertEquals(op.queryParams.size(), 1);
final CodegenParameter statusParam = op.queryParams.get(0);
Assert.assertEquals(statusParam.datatypeWithEnum, "StatusEnum");
Assert.assertTrue(statusParam.isEnum);
Assert.assertEquals(statusParam._enum.size(), 3);
}
@Test(description = "handle required parameters from a 2.0 spec as required when figuring out Swagger types") @Test(description = "handle required parameters from a 2.0 spec as required when figuring out Swagger types")
public void requiredParametersTest() { public void requiredParametersTest() {
final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/requiredTest.json"); final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/requiredTest.json");

View File

@ -156,7 +156,7 @@
"pet" "pet"
], ],
"summary": "Finds Pets by status", "summary": "Finds Pets by status",
"description": "Multiple status values can be provided with comma seperated strings", "description": "Multiple status values can be provided with comma separated strings",
"operationId": "findPetsByStatus", "operationId": "findPetsByStatus",
"produces": [ "produces": [
"application/json", "application/json",
@ -166,13 +166,23 @@
{ {
"name": "status", "name": "status",
"in": "query", "in": "query",
"description": "Status values that need to be considered for filter", "description": "Status values that need to be considered for query",
"required": false, "required": false,
"type": "array", "type": "array",
"items": { "items": {
"type": "string" "type": "string",
"enum": [
"available",
"pending",
"sold"
]
}, },
"collectionFormat": "multi", "collectionFormat": "multi",
"enum": [
"available",
"pending",
"sold"
],
"default": "available" "default": "available"
} }
], ],
@ -567,6 +577,55 @@
} }
] ]
} }
},
"/store/findByStatus": {
"get": {
"tags": [
"store"
],
"summary": "Finds orders by status",
"description": "A single status value can be provided as a string",
"operationId": "findOrdersByStatus",
"produces": [
"application/json",
"application/xml"
],
"parameters": [
{
"name": "status",
"in": "query",
"description": "Status value that needs to be considered for query",
"required": false,
"type": "string",
"enum": [
"placed",
"approved",
"delivered"
],
"default": "placed"
}
],
"responses": {
"200": {
"description": "successful operation",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/Order"
}
}
},
"400": {
"description": "Invalid status value"
}
},
"security": [
{
"test_api_client_id": [],
"test_api_client_secret": []
}
]
}
}, },
"/store/order/{orderId}": { "/store/order/{orderId}": {
"get": { "get": {