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 cfc69072d11465b3fba6736fcb3f97cf1818510b..e5247a72bfe48e5785f483cc360a140eb3d60624 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 @@ -149,7 +149,15 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti public boolean isArray; public boolean isMap; public boolean isEnum; - public boolean isInnerEnum; // Enums declared inline will be located inside the generic model, changing how the enum is referenced in some cases. + /** + * Inner enums will be located inside the generic model, changing how the enum is referenced in some cases. Is used to mark inner enums in containers and maps. + */ + public boolean isInnerEnum; + /** + * True => enums declared inline in OAS. + * False => enums referenced to the standalone enum component in schemas section. + */ + public boolean isInlineEnum; public boolean isReadOnly; public boolean isWriteOnly; public boolean isNullable; @@ -995,6 +1003,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti sb.append(", isMap=").append(isMap); sb.append(", isEnum=").append(isEnum); sb.append(", isInnerEnum=").append(isInnerEnum); + sb.append(", isInlineEnum=").append(isInlineEnum); sb.append(", isAnyType=").append(isAnyType); sb.append(", isReadOnly=").append(isReadOnly); sb.append(", isWriteOnly=").append(isWriteOnly); @@ -1081,6 +1090,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti isMap == that.isMap && isEnum == that.isEnum && isInnerEnum == that.isInnerEnum && + isInlineEnum == that.isInlineEnum && isAnyType == that.isAnyType && isReadOnly == that.isReadOnly && isWriteOnly == that.isWriteOnly && @@ -1161,7 +1171,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti hasMoreNonReadOnly, isPrimitiveType, isModel, isContainer, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isFile, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, - isArray, isMap, isEnum, isInnerEnum, isAnyType, isReadOnly, isWriteOnly, isNullable, isShort, + isArray, isMap, isEnum, isInnerEnum, isInlineEnum, isAnyType, isReadOnly, isWriteOnly, isNullable, isShort, isUnboundedInteger, isSelfReference, isCircularReference, isDiscriminator, _enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars, vendorExtensions, hasValidation, isInherited, discriminatorValue, nameInCamelCase, 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 e49231b10f46f993df6a1bd6089ddd3c17d5aef0..72e4730eef048f22224065a6904060c8085c8018 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 @@ -3714,7 +3714,7 @@ public class DefaultCodegen implements CodegenConfig { } } - //Inline enum case: + // Inline enum case: if (p.getEnum() != null && !p.getEnum().isEmpty()) { List<Object> _enum = p.getEnum(); property._enum = new ArrayList<>(); @@ -3723,25 +3723,24 @@ public class DefaultCodegen implements CodegenConfig { } property.isEnum = true; property.isInnerEnum = true; + property.isInlineEnum = true; Map<String, Object> allowableValues = new HashMap<>(); allowableValues.put("values", _enum); - if (allowableValues.size() > 0) { - property.allowableValues = allowableValues; - } + property.allowableValues = allowableValues; } Schema referencedSchema = ModelUtils.getReferencedSchema(this.openAPI, p); - //Referenced enum case: + // Referenced enum case: if (referencedSchema.getEnum() != null && !referencedSchema.getEnum().isEmpty()) { List<Object> _enum = referencedSchema.getEnum(); + property.isEnum = true; + Map<String, Object> allowableValues = new HashMap<>(); allowableValues.put("values", _enum); - if (allowableValues.size() > 0) { - property.allowableValues = allowableValues; - } + property.allowableValues = allowableValues; } if (referencedSchema.getNullable() != null) { @@ -3872,6 +3871,7 @@ public class DefaultCodegen implements CodegenConfig { // or the inner type of an array/map is an enum property.isEnum = true; property.isInnerEnum = true; + property.isInlineEnum = isPropertyInnerMostEnumDefinedAsInline(property); // update datatypeWithEnum and default value for array // e.g. List<string> => List<StatusEnum> updateDataTypeWithEnumForArray(property); @@ -3909,6 +3909,7 @@ public class DefaultCodegen implements CodegenConfig { // or the inner type of an array/map is an enum property.isEnum = true; property.isInnerEnum = true; + property.isInlineEnum = isPropertyInnerMostEnumDefinedAsInline(property); // update datatypeWithEnum and default value for map // e.g. Dictionary<string, string> => Dictionary<string, StatusEnum> updateDataTypeWithEnumForMap(property); @@ -3930,6 +3931,18 @@ public class DefaultCodegen implements CodegenConfig { return currentProperty != null && currentProperty.isEnum; } + /** + * Is inner most enum defined as inline. + * + * @param property Codegen property + * @return True if the inner most type is enum and defined as enum + */ + protected boolean isPropertyInnerMostEnumDefinedAsInline(CodegenProperty property) { + CodegenProperty currentProperty = getMostInnerItems(property); + + return currentProperty != null && currentProperty.isEnum && currentProperty.isInlineEnum; + } + protected CodegenProperty getMostInnerItems(CodegenProperty property) { CodegenProperty currentProperty = property; while (currentProperty != null && (Boolean.TRUE.equals(currentProperty.isMap) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java index a7d445eb3c81199be6424cfae94354d54b10b237..2c2812305277797a0ab3d363fa89a548b56707e7 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java @@ -677,14 +677,14 @@ public class KotlinSpringServerCodegen extends AbstractKotlinCodegen property.example = null; } - //Add imports for Jackson + // Add imports for Jackson if (!Boolean.TRUE.equals(model.isEnum)) { model.imports.add("JsonProperty"); - if (Boolean.TRUE.equals(model.hasEnums)) { + if(hasInlineEnums(model)) { model.imports.add("JsonValue"); } } else { - //Needed imports for Jackson's JsonCreator + // Needed imports for Jackson's JsonCreator if (additionalProperties.containsKey("jackson")) { model.imports.add("JsonCreator"); } @@ -695,11 +695,15 @@ public class KotlinSpringServerCodegen extends AbstractKotlinCodegen } } + private boolean hasInlineEnums(CodegenModel model) { + return Boolean.TRUE.equals(model.hasEnums) && model.vars.stream().anyMatch(property -> property.isInlineEnum); + } + @Override public ModelsMap postProcessModelsEnum(ModelsMap objs) { objs = super.postProcessModelsEnum(objs); - //Add imports for Jackson + // Add imports for Jackson List<Map<String, String>> imports = objs.getImports(); objs.getModels().stream() diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidation.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidation.mustache index ee25df4a96a94497b5ffdcd1f217bfd2f3d604b1..6da2127a1a00ff7d2f4c08e616e0f422f7011267 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidation.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidation.mustache @@ -1,4 +1,4 @@ -{{#isContainer}}{{^isPrimitiveType}}{{^isEnum}} - @field:Valid{{/isEnum}}{{/isPrimitiveType}}{{/isContainer}}{{! +{{#isContainer}}{{^isPrimitiveType}}{{^isInlineEnum}} + @field:Valid{{/isInlineEnum}}{{/isPrimitiveType}}{{/isContainer}}{{! }}{{^isContainer}}{{^isPrimitiveType}}{{^isNumber}}{{^isUuid}}{{^isDateTime}} @field:Valid{{/isDateTime}}{{/isUuid}}{{/isNumber}}{{/isPrimitiveType}}{{/isContainer}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache index e56f233800c0c6e1942458cb36a90ef14ec61a37..419fbb5c9ce02b319dff12384d172a02e545da93 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache @@ -20,7 +20,7 @@ {{>interfaceOptVar}} {{/optionalVars}} {{/discriminator}} -{{#hasEnums}}{{#vars}}{{#isEnum}} +{{#hasEnums}}{{#vars}}{{#isEnum}}{{#isInlineEnum}} /** * {{{description}}} * Values: {{#allowableValues}}{{#enumVars}}{{&name}}{{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}} @@ -29,5 +29,5 @@ {{#allowableValues}}{{#enumVars}} @JsonProperty({{{value}}}) {{{name}}}({{{value}}}){{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}} } -{{/isEnum}}{{/vars}}{{/hasEnums}} +{{!isInlineEnum}}{{/isInlineEnum}}{{/isEnum}}{{/vars}}{{/hasEnums}} } diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache index 1e5a00489aaa295fde0c1d111926b21fec2b93f4..73e06585e38cbdfc2a2372f8fa23cc97ec3e544a 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache @@ -2,4 +2,4 @@ @Schema({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeDoubleQuote}}{{{.}}}{{/lambdaEscapeDoubleQuote}}{{/lambdaRemoveLineBreak}}", {{/example}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{{description}}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} @ApiModelProperty({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeDoubleQuote}}{{{.}}}{{/lambdaEscapeDoubleQuote}}{{/lambdaRemoveLineBreak}}", {{/example}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swagger1AnnotationLibrary}}{{#deprecated}} @Deprecated(message = ""){{/deprecated}} - @field:JsonProperty("{{{baseName}}}"){{#isInherited}} override{{/isInherited}} {{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isArray}}{{baseType}}<{{/isArray}}{{classname}}.{{{nameInCamelCase}}}{{#isArray}}>{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{{defaultValue}}}{{^defaultValue}}null{{/defaultValue}} \ No newline at end of file + @field:JsonProperty("{{{baseName}}}"){{#isInherited}} override{{/isInherited}} {{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isInlineEnum}}{{#isArray}}{{baseType}}<{{/isArray}}{{classname}}.{{{nameInCamelCase}}}{{#isArray}}>{{/isArray}}{{/isInlineEnum}}{{/isEnum}}{{#isEnum}}{{^isInlineEnum}}{{{dataType}}}{{/isInlineEnum}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{{defaultValue}}}{{^defaultValue}}null{{/defaultValue}} \ No newline at end of file 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 ef0b59a12bc02117df83a126ef6cc10f3e18b9e3..c587a33e59d9929ac37c8106befc35b54705d666 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 @@ -56,6 +56,8 @@ import java.util.stream.Collectors; import static org.testng.Assert.*; +import static org.assertj.core.api.Assertions.assertThat; + public class DefaultCodegenTest { @@ -4245,4 +4247,144 @@ public class DefaultCodegenTest { Assert.assertEquals(fooOptional.vars.get(0).name, "foo"); Assert.assertEquals(fooOptional.requiredVars.size(), 0); } + + @Test + public void testReferencedEnumType() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/issue-5676-enums.yaml"); + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setOpenAPI(openAPI); + String modelName = "fakeRequestObjectWithReferencedEnum_request"; + + Schema schemaWithReferencedEnum = openAPI.getComponents().getSchemas().get(modelName); + CodegenModel modelWithReferencedSchema = codegen.fromModel(modelName, schemaWithReferencedEnum); + CodegenProperty referencedEnumSchemaProperty = modelWithReferencedSchema.vars.get(1); + + assertThat(schemaWithReferencedEnum).isNotNull(); + assertThat(modelWithReferencedSchema.hasEnums).isTrue(); + assertThat(referencedEnumSchemaProperty.getName()).isEqualTo("enumType"); + assertThat(referencedEnumSchemaProperty.isEnum).isTrue(); + assertThat(referencedEnumSchemaProperty.isInnerEnum).isFalse(); + assertThat(referencedEnumSchemaProperty.isInlineEnum).isFalse(); + assertThat(referencedEnumSchemaProperty.isString).isFalse(); + assertThat(referencedEnumSchemaProperty.isContainer).isFalse(); + assertThat(referencedEnumSchemaProperty.isPrimitiveType).isFalse(); + } + + @Test + public void testInlineEnumType() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/issue-5676-enums.yaml"); + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setOpenAPI(openAPI); + String modelName = "fakeRequestObjectWithInlineEnum_request"; + + Schema schemaWithReferencedEnum = openAPI.getComponents().getSchemas().get(modelName); + CodegenModel modelWithReferencedSchema = codegen.fromModel(modelName, schemaWithReferencedEnum); + CodegenProperty inlineEnumSchemaProperty = modelWithReferencedSchema.vars.get(1); + + assertThat(schemaWithReferencedEnum).isNotNull(); + assertThat(modelWithReferencedSchema.hasEnums).isTrue(); + assertThat(inlineEnumSchemaProperty.getName()).isEqualTo("enumType"); + assertThat(inlineEnumSchemaProperty.isEnum).isTrue(); + assertThat(inlineEnumSchemaProperty.isInnerEnum).isTrue(); + assertThat(inlineEnumSchemaProperty.isInlineEnum).isTrue(); + assertThat(inlineEnumSchemaProperty.isString).isTrue(); + assertThat(inlineEnumSchemaProperty.isContainer).isFalse(); + assertThat(inlineEnumSchemaProperty.isPrimitiveType).isFalse(); + } + + @Test + public void testArrayOfInlineEnumType() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/issue-5676-enums.yaml"); + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setOpenAPI(openAPI); + String modelName = "fakeRequestArrayWithInlineEnum_request"; + + Schema schemaWithReferencedEnum = openAPI.getComponents().getSchemas().get(modelName); + CodegenModel modelWithReferencedSchema = codegen.fromModel(modelName, schemaWithReferencedEnum); + CodegenProperty arrayInlineEnumSchemaProperty = modelWithReferencedSchema.vars.get(1); + + assertThat(schemaWithReferencedEnum).isNotNull(); + assertThat(modelWithReferencedSchema.hasEnums).isTrue(); + assertThat(arrayInlineEnumSchemaProperty.getName()).isEqualTo("enumTypes"); + assertThat(arrayInlineEnumSchemaProperty.isEnum).isTrue(); + assertThat(arrayInlineEnumSchemaProperty.isInnerEnum).isTrue(); + assertThat(arrayInlineEnumSchemaProperty.isInlineEnum).isTrue(); + assertThat(arrayInlineEnumSchemaProperty.isString).isFalse(); + assertThat(arrayInlineEnumSchemaProperty.isContainer).isTrue(); + assertThat(arrayInlineEnumSchemaProperty.isArray).isTrue(); + assertThat(arrayInlineEnumSchemaProperty.isMap).isFalse(); + assertThat(arrayInlineEnumSchemaProperty.isPrimitiveType).isFalse(); + } + + @Test + public void testArrayOfReferencedEnumType() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/issue-5676-enums.yaml"); + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setOpenAPI(openAPI); + String modelName = "fakeRequestArrayWithReferencedEnum_request"; + + Schema schemaWithReferencedEnum = openAPI.getComponents().getSchemas().get(modelName); + CodegenModel modelWithReferencedSchema = codegen.fromModel(modelName, schemaWithReferencedEnum); + CodegenProperty arrayReferencedEnumSchemaProperty = modelWithReferencedSchema.vars.get(1); + + assertThat(schemaWithReferencedEnum).isNotNull(); + assertThat(modelWithReferencedSchema.hasEnums).isTrue(); + assertThat(arrayReferencedEnumSchemaProperty.getName()).isEqualTo("enumTypes"); + assertThat(arrayReferencedEnumSchemaProperty.isEnum).isTrue(); + assertThat(arrayReferencedEnumSchemaProperty.isInnerEnum).isTrue(); + assertThat(arrayReferencedEnumSchemaProperty.isInlineEnum).isFalse(); + assertThat(arrayReferencedEnumSchemaProperty.isString).isFalse(); + assertThat(arrayReferencedEnumSchemaProperty.isContainer).isTrue(); + assertThat(arrayReferencedEnumSchemaProperty.isArray).isTrue(); + assertThat(arrayReferencedEnumSchemaProperty.isMap).isFalse(); + assertThat(arrayReferencedEnumSchemaProperty.isPrimitiveType).isFalse(); + } + + @Test + public void testMapOfInlineEnumType() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/issue-5676-enums.yaml"); + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setOpenAPI(openAPI); + String modelName = "fakeRequestMapWithInlineEnum_request"; + + Schema schemaWithReferencedEnum = openAPI.getComponents().getSchemas().get(modelName); + CodegenModel modelWithReferencedSchema = codegen.fromModel(modelName, schemaWithReferencedEnum); + CodegenProperty mapInlineEnumSchemaProperty = modelWithReferencedSchema.vars.get(1); + + assertThat(schemaWithReferencedEnum).isNotNull(); + assertThat(modelWithReferencedSchema.hasEnums).isTrue(); + assertThat(mapInlineEnumSchemaProperty.getName()).isEqualTo("enumTypes"); + assertThat(mapInlineEnumSchemaProperty.isEnum).isTrue(); + assertThat(mapInlineEnumSchemaProperty.isInnerEnum).isTrue(); + assertThat(mapInlineEnumSchemaProperty.isInlineEnum).isTrue(); + assertThat(mapInlineEnumSchemaProperty.isString).isFalse(); + assertThat(mapInlineEnumSchemaProperty.isContainer).isTrue(); + assertThat(mapInlineEnumSchemaProperty.isArray).isFalse(); + assertThat(mapInlineEnumSchemaProperty.isMap).isTrue(); + assertThat(mapInlineEnumSchemaProperty.isPrimitiveType).isFalse(); + } + + @Test + public void testMapOfReferencedEnumType() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/issue-5676-enums.yaml"); + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setOpenAPI(openAPI); + String modelName = "fakeRequestMapWithReferencedEnum_request"; + + Schema schemaWithReferencedEnum = openAPI.getComponents().getSchemas().get(modelName); + CodegenModel modelWithReferencedSchema = codegen.fromModel(modelName, schemaWithReferencedEnum); + CodegenProperty mapInlineEnumSchemaProperty = modelWithReferencedSchema.vars.get(1); + + assertThat(schemaWithReferencedEnum).isNotNull(); + assertThat(modelWithReferencedSchema.hasEnums).isTrue(); + assertThat(mapInlineEnumSchemaProperty.getName()).isEqualTo("enumTypes"); + assertThat(mapInlineEnumSchemaProperty.isEnum).isTrue(); + assertThat(mapInlineEnumSchemaProperty.isInnerEnum).isTrue(); + assertThat(mapInlineEnumSchemaProperty.isInlineEnum).isFalse(); + assertThat(mapInlineEnumSchemaProperty.isString).isFalse(); + assertThat(mapInlineEnumSchemaProperty.isContainer).isTrue(); + assertThat(mapInlineEnumSchemaProperty.isArray).isFalse(); + assertThat(mapInlineEnumSchemaProperty.isMap).isTrue(); + assertThat(mapInlineEnumSchemaProperty.isPrimitiveType).isFalse(); + } } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java index ac058ecd2ba8a76d465e81bdba8b79550e2f99af..934c8aca632658bdaa04976ceb1a8901fc5e6629 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java @@ -312,7 +312,7 @@ public class SpringCodegenTest { codegen.processOpts(); // jdk8 tag has been removed - Assert.assertEquals(codegen.additionalProperties().get("jdk8"), null); + Assert.assertNull(codegen.additionalProperties().get("jdk8")); } @Test(expectedExceptions = IllegalArgumentException.class) @@ -435,7 +435,7 @@ public class SpringCodegenTest { codegen.preprocessOpenAPI(openAPI); Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.HIDE_GENERATION_TIMESTAMP), Boolean.TRUE); - Assert.assertEquals(codegen.isHideGenerationTimestamp(), true); + Assert.assertTrue(codegen.isHideGenerationTimestamp()); Assert.assertEquals(codegen.modelPackage(), "xyz.yyyyy.mmmmm.model"); Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.MODEL_PACKAGE), "xyz.yyyyy.mmmmm.model"); Assert.assertEquals(codegen.apiPackage(), "xyz.yyyyy.aaaaa.api"); @@ -538,7 +538,7 @@ public class SpringCodegenTest { codegen.preprocessOpenAPI(openAPI); Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.HIDE_GENERATION_TIMESTAMP), Boolean.FALSE); - Assert.assertEquals(codegen.isHideGenerationTimestamp(), false); + Assert.assertFalse(codegen.isHideGenerationTimestamp()); Assert.assertEquals(codegen.modelPackage(), "org.openapitools.model"); Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.MODEL_PACKAGE), "org.openapitools.model"); Assert.assertEquals(codegen.apiPackage(), "org.openapitools.api"); @@ -684,7 +684,7 @@ public class SpringCodegenTest { codegen.processOpts(); Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.HIDE_GENERATION_TIMESTAMP), Boolean.TRUE); - Assert.assertEquals(codegen.isHideGenerationTimestamp(), true); + Assert.assertTrue(codegen.isHideGenerationTimestamp()); Assert.assertEquals(codegen.modelPackage(), "xx.yyyyyyyy.model"); Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.MODEL_PACKAGE), "xx.yyyyyyyy.model"); Assert.assertEquals(codegen.apiPackage(), "xx.yyyyyyyy.api"); @@ -695,7 +695,7 @@ public class SpringCodegenTest { Assert.assertEquals(codegen.additionalProperties().get(SpringCodegen.BASE_PACKAGE), "xx.yyyyyyyy.base"); Assert.assertEquals(codegen.getConfigPackage(), "xx.yyyyyyyy.config"); Assert.assertEquals(codegen.additionalProperties().get(SpringCodegen.CONFIG_PACKAGE), "xx.yyyyyyyy.config"); - Assert.assertEquals(codegen.isUnhandledException(), true); + Assert.assertTrue(codegen.isUnhandledException()); Assert.assertEquals(codegen.additionalProperties().get(SpringCodegen.UNHANDLED_EXCEPTION_HANDLING), true); } @@ -1499,4 +1499,29 @@ public class SpringCodegenTest { "})"; assertFileContains(Paths.get(output.getAbsolutePath() + "/src/main/java/org/openapitools/model/Pet.java"), jsonTypeInfo, jsonSubType); } + + @Test + public void whenInlineEnumInMultipartRequest_thenAnnotatedWithRequestParam_issue5676() throws IOException { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + + OpenAPI openAPI = new OpenAPIParser() + .readLocation("src/test/resources/3_0/issue-5676-enums.yaml", null, new ParseOptions()).getOpenAPI(); + SpringCodegen codegen = new SpringCodegen(); + codegen.setLibrary(SPRING_BOOT); + codegen.setOutputDir(output.getAbsolutePath()); + + ClientOptInput input = new ClientOptInput() + .openAPI(openAPI) + .config(codegen); + + DefaultGenerator generator = new DefaultGenerator(); + generator.opts(input).generate(); + + String multipartFormDataEnumParameters = "default ResponseEntity<EnumPatternObject> fakeRequestMultipartWithReferencedEnum(\n" + + " @Parameter(name = \"id\", description = \"\") @Valid @RequestParam(value = \"id\", required = false) BigDecimal id,\n" + + " @Parameter(name = \"enumType\", description = \"\") @Valid @RequestParam(value = \"enumType\", required = false) StringEnum enumType\n" + + " ) "; + assertFileContains(Paths.get(output.getAbsolutePath() + "/src/main/java/org/openapitools/api/FakeApi.java"), multipartFormDataEnumParameters); + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/issue-5676-enums.yaml b/modules/openapi-generator/src/test/resources/3_0/issue-5676-enums.yaml new file mode 100644 index 0000000000000000000000000000000000000000..23cdfdc053bc5d293b0a59e353c5ec4200584506 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue-5676-enums.yaml @@ -0,0 +1,213 @@ +openapi: 3.0.0 +info: + version: 1.0.0 + title: Enum test +servers: + - url: http://localhost:3000 +paths: + /fake/request-object-with-inline-enum: + post: + operationId: fakeRequestObjectWithInlineEnum + requestBody: + content: + application/json: + schema: + description: Contains property enumType that represents inline enum. + properties: + id: + type: number + enumType: + type: string + enum: + - one + - two + - three + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/EnumPatternObject' + /fake/request-object-with-referenced-enum: + post: + operationId: fakeRequestObjectWithReferencedEnum + requestBody: + content: + application/json: + schema: + description: Contains property enumType that represents referenced enum. + properties: + id: + type: number + enumType: + $ref: '#/components/schemas/StringEnum' + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/EnumPatternObject' + /fake/request-array-with-inline-enum: + post: + operationId: fakeRequestArrayWithInlineEnum + requestBody: + content: + application/json: + schema: + description: Contains property enumTypes that represents array of inline enums. + properties: + id: + type: number + enumTypes: + type: array + items: + type: string + enum: + - one + - two + - three + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/EnumPatternObject' + /fake/request-array-with-referenced-enum: + post: + operationId: fakeRequestArrayWithReferencedEnum + requestBody: + content: + application/json: + schema: + description: Contains property enumTypes that represents array of referenced enums. + properties: + id: + type: number + enumTypes: + type: array + items: + $ref: '#/components/schemas/StringEnum' + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/EnumPatternObject' + /fake/request-map-with-inline-enum: + post: + operationId: fakeRequestMapWithInlineEnum + requestBody: + content: + application/json: + schema: + description: Contains property enumTypes that represents map of inline enums. + properties: + id: + type: number + enumTypes: + type: object + additionalProperties: + type: string + enum: + - one + - two + - three + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/EnumPatternObject' + /fake/request-map-with-referenced-enum: + post: + operationId: fakeRequestMapWithReferencedEnum + requestBody: + content: + application/json: + schema: + description: Contains property enumTypes that represents map of referenced enums. + properties: + id: + type: number + enumTypes: + type: object + additionalProperties: + $ref: '#/components/schemas/StringEnum' + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/EnumPatternObject' + /fake/multipart-request-with-inline-enum: + post: + operationId: fakeRequestMultipartWithInlineEnum + requestBody: + content: + multipart/form-data: + schema: + description: Contains property enumType that represents inline enum. + properties: + id: + type: number + enumType: + type: string + enum: + - one + - two + - three + /fake/multipart-request-with-referenced-enum: + post: + operationId: fakeRequestMultipartWithReferencedEnum + requestBody: + content: + multipart/form-data: + schema: + description: Contains property enumType that represents referenced enum. + properties: + id: + type: number + enumType: + $ref: '#/components/schemas/StringEnum' + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/EnumPatternObject' +components: + schemas: + StringEnum: + type: string + enum: + - one + - two + - three + NumberEnum: + type: number + enum: + - 1 + - 2 + - 3 + EnumPatternObject: + type: object + properties: + string-enum: + $ref: "#/components/schemas/StringEnum" + nullable-string-enum: + nullable: true + allOf: + - $ref: "#/components/schemas/StringEnum" + number-enum: + $ref: "#/components/schemas/NumberEnum" + nullable-number-enum: + nullable: true + allOf: + - $ref: "#/components/schemas/NumberEnum"