From ee2a7352a10b3a99f36420e367f615490691f4fb Mon Sep 17 00:00:00 2001 From: Justin Black Date: Sun, 11 Oct 2020 11:06:47 -0700 Subject: [PATCH] Adds isDate to CodegenModel, adds test, adds isDate getter and setter to IJsonSchemaValidationProperties (#7652) --- .../openapitools/codegen/CodegenModel.java | 13 ++- .../codegen/CodegenParameter.java | 8 ++ .../openapitools/codegen/CodegenProperty.java | 8 ++ .../openapitools/codegen/CodegenResponse.java | 8 ++ .../openapitools/codegen/DefaultCodegen.java | 5 ++ .../IJsonSchemaValidationProperties.java | 4 + .../codegen/DefaultCodegenTest.java | 46 +++++++++++ .../src/test/resources/3_0/issue_7651.yaml | 82 +++++++++++++++++++ 8 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 modules/openapi-generator/src/test/resources/3_0/issue_7651.yaml diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java index 457de18af37..4598ddb4669 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java @@ -64,7 +64,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties { public String defaultValue; public String arrayModelType; public boolean isAlias; // Is this effectively an alias of another simple type - public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble; + public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate; public List vars = new ArrayList(); // all properties (without parent's properties) public List allVars = new ArrayList(); // all properties (with parent's properties) public List requiredVars = new ArrayList(); // a list of required properties @@ -570,6 +570,14 @@ public class CodegenModel implements IJsonSchemaValidationProperties { this.isModel = isModel; } + @Override + public boolean getIsDate() { return isDate; } + + @Override + public void setIsDate(boolean isDate) { + this.isDate = isDate; + } + // indicates if the model component has validation on the root level schema // this will be true when minItems or minProperties is set public boolean hasValidation() { @@ -670,6 +678,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties { isNumeric == that.isNumeric && isFloat == that.isFloat && isDouble == that.isDouble && + isDate == that.isDate && hasVars == that.hasVars && emptyVars == that.emptyVars && hasMoreModels == that.hasMoreModels && @@ -746,6 +755,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties { getDescription(), getClassVarName(), getModelJson(), getDataType(), getXmlPrefix(), getXmlNamespace(), getXmlName(), getClassFilename(), getUnescapedDescription(), getDiscriminator(), getDefaultValue(), getArrayModelType(), isAlias, isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, + isDate, getVars(), getAllVars(), getRequiredVars(), getOptionalVars(), getReadOnlyVars(), getReadWriteVars(), getParentVars(), getAllowableValues(), getMandatory(), getAllMandatory(), getImports(), hasVars, isEmptyVars(), hasMoreModels, hasEnums, isEnum, isNullable, hasRequired, hasOptional, isArrayModel, @@ -791,6 +801,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties { sb.append(", isNumeric=").append(isNumeric); sb.append(", isFloat=").append(isFloat); sb.append(", isDouble=").append(isDouble); + sb.append(", isDate=").append(isDate); sb.append(", vars=").append(vars); sb.append(", allVars=").append(allVars); sb.append(", requiredVars=").append(requiredVars); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java index 26d6d7b819f..e588d8b8baa 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java @@ -495,5 +495,13 @@ public class CodegenParameter implements IJsonSchemaValidationProperties { public void setIsModel(boolean isModel) { this.isModel = isModel; } + + @Override + public boolean getIsDate() { return isDate; } + + @Override + public void setIsDate(boolean isDate) { + this.isDate = isDate; + } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java index 9e36bd43856..7063055a6ac 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java @@ -469,6 +469,14 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti this.isModel = isModel; } + @Override + public boolean getIsDate() { return isDate; } + + @Override + public void setIsDate(boolean isDate) { + this.isDate = isDate; + } + public Map getVendorExtensions() { return vendorExtensions; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java index 4ff1a4fa236..af05c228cdd 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java @@ -290,6 +290,14 @@ public class CodegenResponse implements IJsonSchemaValidationProperties { this.isModel = isModel; } + @Override + public boolean getIsDate() { return isDate; } + + @Override + public void setIsDate(boolean isDate) { + this.isDate = isDate; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("CodegenResponse{"); 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 3bc7a63d0dc..f287531045f 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 @@ -2520,6 +2520,11 @@ public class DefaultCodegen implements CodegenConfig { } else { // int32 format m.isInteger = Boolean.TRUE; } + } else if (ModelUtils.isDateSchema(schema)) { + // NOTE: Date schemas as CodegenModel is a rare use case and may be removed at a later date. + // Sync of properties is done for consistency with other data types like CodegenParameter/CodegenProperty. + ModelUtils.syncValidationProperties(schema, m); + m.isDate = Boolean.TRUE; } else if (ModelUtils.isStringSchema(schema)) { // NOTE: String schemas as CodegenModel is a rare use case and may be removed at a later date. // Sync of properties is done for consistency with other data types like CodegenParameter/CodegenProperty. diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java index 6600094785e..2b2986bc940 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java @@ -60,4 +60,8 @@ public interface IJsonSchemaValidationProperties { boolean getIsModel(); void setIsModel(boolean isModel); + + boolean getIsDate(); + + void setIsDate(boolean isDate); } 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 9ea99b07de0..7d7c015c72e 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 @@ -2341,4 +2341,50 @@ public class DefaultCodegenTest { assertEquals(co.responses.get(0).getItems().getMaximum(), "7"); } + @Test + public void testIsXPresence() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/issue_7651.yaml"); + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setOpenAPI(openAPI); + + String modelName; + Schema sc; + CodegenModel cm; + + modelName = "DateWithValidation"; + sc = openAPI.getComponents().getSchemas().get(modelName); + cm = codegen.fromModel(modelName, sc); + assertEquals(cm.isString, false); + assertEquals(cm.isDate, true); + + modelName = "ObjectWithDateWithValidation"; + sc = openAPI.getComponents().getSchemas().get(modelName); + cm = codegen.fromModel(modelName, sc); + assertEquals(cm.getVars().get(0).isString, false); + assertEquals(cm.getVars().get(0).isDate, true); + + String path; + Operation operation; + CodegenOperation co; + + path = "/ref_date_with_validation/{date}"; + operation = openAPI.getPaths().get(path).getPost(); + co = codegen.fromOperation(path, "POST", operation, null); + assertEquals(co.pathParams.get(0).isString, false); + assertEquals(co.pathParams.get(0).isDate, true); + assertEquals(co.bodyParams.get(0).isString, false); + assertEquals(co.bodyParams.get(0).isDate, true); + assertEquals(co.responses.get(0).isString, false); + assertEquals(co.responses.get(0).isDate, true); + + path = "/date_with_validation/{date}"; + operation = openAPI.getPaths().get(path).getPost(); + co = codegen.fromOperation(path, "POST", operation, null); + assertEquals(co.pathParams.get(0).isString, false); + assertEquals(co.pathParams.get(0).isDate, true); + assertEquals(co.bodyParams.get(0).isString, false); + assertEquals(co.bodyParams.get(0).isDate, true); + assertEquals(co.responses.get(0).isString, false); + assertEquals(co.responses.get(0).isDate, true); + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/issue_7651.yaml b/modules/openapi-generator/src/test/resources/3_0/issue_7651.yaml new file mode 100644 index 00000000000..ff3e91cad63 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue_7651.yaml @@ -0,0 +1,82 @@ +openapi: 3.0.1 +info: + title: OpenAPI Petstore + description: "sample spec" + license: + name: Apache-2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html + version: 1.0.0 +servers: + - url: http://petstore.swagger.io:80/v2 +tags: + - name: isX + description: an api that ensures that isX properties are present on Schema classes +paths: + /ref_date_with_validation/{date}: + post: + tags: + - isX + operationId: refDateWithValidation + parameters: + - name: date + in: path + required: true + schema: + $ref: '#/components/schemas/DateWithValidation' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DateWithValidation' + required: true + responses: + 200: + description: success + content: + application/json: + schema: + $ref: '#/components/schemas/DateWithValidation' + /date_with_validation/{date}: + post: + tags: + - isX + operationId: dateWithValidation + parameters: + - name: date + in: path + required: true + schema: + type: string + format: date + pattern: '^2020.*' + requestBody: + content: + application/json: + schema: + type: string + format: date + pattern: '^2020.*' + required: true + responses: + 200: + description: success + content: + application/json: + schema: + type: string + format: date + pattern: '^2020.*' +components: + schemas: + DateWithValidation: + type: string + format: date + pattern: '^2020.*' + ObjectWithDateWithValidation: + type: object + properties: + dateWithValidation: + type: string + format: date + pattern: '^2020.*' + securitySchemes: {} \ No newline at end of file