From 7ef63e990f8105a3eef133391457b895696f8338 Mon Sep 17 00:00:00 2001 From: Bernhard Danecker Date: Fri, 19 Sep 2025 21:20:05 +0200 Subject: [PATCH] [kotlin] Fix defaultValue in query parameters --- .../languages/KotlinClientCodegen.java | 16 ++++++++++++ .../kotlin/KotlinClientCodegenApiTest.java | 18 +++++++++++++ .../3_0/kotlin/enum-default-query.yaml | 26 +++++++++++++++++++ .../docs/DefaultApi.md | 6 ++--- .../openapitools/client/apis/DefaultApi.kt | 18 ++++++------- 5 files changed, 72 insertions(+), 12 deletions(-) create mode 100644 modules/openapi-generator/src/test/resources/3_0/kotlin/enum-default-query.yaml diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java index 55ef6ae04e96..1ace82611785 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java @@ -1114,6 +1114,22 @@ private static boolean isMultipartType(List> consumes) { return false; } + @Override + public void postProcessParameter(CodegenParameter parameter) { + super.postProcessParameter(parameter); + adjustEnumRefDefault(parameter); + } + + private void adjustEnumRefDefault(CodegenParameter param) { + if (StringUtils.isEmpty(param.defaultValue) || !(param.isEnum || param.isEnumRef)) { + return; + } + + String type = StringUtils.defaultIfEmpty(param.datatypeWithEnum, param.dataType); + param.enumDefaultValue = toEnumVarName(param.defaultValue, type); + param.defaultValue = type + "." + param.enumDefaultValue; + } + @Override public void postProcess() { System.out.println("################################################################################"); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinClientCodegenApiTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinClientCodegenApiTest.java index 674277aedc69..c28546d04ce2 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinClientCodegenApiTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinClientCodegenApiTest.java @@ -91,6 +91,24 @@ public void testUseResponseAsReturnType(Object useResponseAsReturnType, String e assertFileContainsLine(lines, "suspend fun deletePet(@Path(\"petId\") petId: kotlin.Long, @Header(\"api_key\") apiKey: kotlin.String? = null)" + expectedUnitResponse); } + @Test + public void testEnumDefaultForReferencedSchemaParameterJvmOkhttp4() throws IOException { + OpenAPI openAPI = readOpenAPI("3_0/kotlin/enum-default-query.yaml"); + + KotlinClientCodegen codegen = createCodegen(ClientLibrary.JVM_OKHTTP4); + codegen.additionalProperties().put("enumPropertyNaming", "UPPERCASE"); + + ClientOptInput input = createClientOptInput(openAPI, codegen); + + DefaultGenerator generator = new DefaultGenerator(); + enableOnlyApiGeneration(generator); + + List files = generator.opts(input).generate(); + File statusApi = files.stream().filter(file -> file.getName().equals("StatusApi.kt")).findAny().orElseThrow(); + + assertFileContains(statusApi.toPath(), "state: PetStatus? = PetStatus.AVAILABLE"); + } + private static void assertFileContainsLine(List lines, String line) { Assert.assertListContains(lines, s -> s.equals(line), line); } diff --git a/modules/openapi-generator/src/test/resources/3_0/kotlin/enum-default-query.yaml b/modules/openapi-generator/src/test/resources/3_0/kotlin/enum-default-query.yaml new file mode 100644 index 000000000000..42b8eea73d76 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/kotlin/enum-default-query.yaml @@ -0,0 +1,26 @@ +openapi: 3.0.1 +info: + title: Enum default test + version: 1.0.0 +paths: + /status: + get: + tags: + - Status + operationId: getStatus + parameters: + - name: state + in: query + schema: + $ref: '#/components/schemas/PetStatus' + responses: + '200': + description: OK +components: + schemas: + PetStatus: + type: string + enum: + - available + - pending + default: available diff --git a/samples/client/others/kotlin-jvm-okhttp-parameter-tests/docs/DefaultApi.md b/samples/client/others/kotlin-jvm-okhttp-parameter-tests/docs/DefaultApi.md index 9eef33d4af16..d492f8228f40 100644 --- a/samples/client/others/kotlin-jvm-okhttp-parameter-tests/docs/DefaultApi.md +++ b/samples/client/others/kotlin-jvm-okhttp-parameter-tests/docs/DefaultApi.md @@ -52,13 +52,13 @@ try { | **pathDefault** | **kotlin.String**| path default | | | **pathNullable** | **kotlin.String**| path_nullable | | | **queryDefault** | **kotlin.String**| query default | [optional] [default to "available"] | -| **queryDefaultEnum** | **kotlin.String**| query default enum | [optional] [default to B] [enum: A, B, C] | +| **queryDefaultEnum** | **kotlin.String**| query default enum | [optional] [default to QueryDefaultEnum.B] [enum: A, B, C] | | **queryDefaultInt** | **java.math.BigDecimal**| query default int | [optional] [default to 3] | | **headerDefault** | **kotlin.String**| header default | [optional] [default to "available"] | -| **headerDefaultEnum** | **kotlin.String**| header default enum | [optional] [default to B] [enum: A, B, C] | +| **headerDefaultEnum** | **kotlin.String**| header default enum | [optional] [default to HeaderDefaultEnum.B] [enum: A, B, C] | | **headerDefaultInt** | **java.math.BigDecimal**| header default int | [optional] [default to 3] | | **cookieDefault** | **kotlin.String**| cookie default | [optional] [default to "available"] | -| **cookieDefaultEnum** | **kotlin.String**| cookie default enum | [optional] [default to B] [enum: A, B, C] | +| **cookieDefaultEnum** | **kotlin.String**| cookie default enum | [optional] [default to CookieDefaultEnum.B] [enum: A, B, C] | | **cookieDefaultInt** | **java.math.BigDecimal**| cookie default int | [optional] [default to 3] | | **queryNullable** | **kotlin.String**| query nullable | [optional] | | **headerNullable** | **kotlin.String**| header nullable | [optional] | diff --git a/samples/client/others/kotlin-jvm-okhttp-parameter-tests/src/main/kotlin/org/openapitools/client/apis/DefaultApi.kt b/samples/client/others/kotlin-jvm-okhttp-parameter-tests/src/main/kotlin/org/openapitools/client/apis/DefaultApi.kt index 9f66e46f0d6e..a086dc1ffde8 100644 --- a/samples/client/others/kotlin-jvm-okhttp-parameter-tests/src/main/kotlin/org/openapitools/client/apis/DefaultApi.kt +++ b/samples/client/others/kotlin-jvm-okhttp-parameter-tests/src/main/kotlin/org/openapitools/client/apis/DefaultApi.kt @@ -105,13 +105,13 @@ class DefaultApi(basePath: kotlin.String = defaultBasePath, client: Call.Factory * @param pathDefault path default * @param pathNullable path_nullable * @param queryDefault query default (optional, default to "available") - * @param queryDefaultEnum query default enum (optional, default to B) + * @param queryDefaultEnum query default enum (optional, default to QueryDefaultEnum.B) * @param queryDefaultInt query default int (optional, default to 3) * @param headerDefault header default (optional, default to "available") - * @param headerDefaultEnum header default enum (optional, default to B) + * @param headerDefaultEnum header default enum (optional, default to HeaderDefaultEnum.B) * @param headerDefaultInt header default int (optional, default to 3) * @param cookieDefault cookie default (optional, default to "available") - * @param cookieDefaultEnum cookie default enum (optional, default to B) + * @param cookieDefaultEnum cookie default enum (optional, default to CookieDefaultEnum.B) * @param cookieDefaultInt cookie default int (optional, default to 3) * @param queryNullable query nullable (optional) * @param headerNullable header nullable (optional) @@ -150,13 +150,13 @@ class DefaultApi(basePath: kotlin.String = defaultBasePath, client: Call.Factory * @param pathDefault path default * @param pathNullable path_nullable * @param queryDefault query default (optional, default to "available") - * @param queryDefaultEnum query default enum (optional, default to B) + * @param queryDefaultEnum query default enum (optional, default to QueryDefaultEnum.B) * @param queryDefaultInt query default int (optional, default to 3) * @param headerDefault header default (optional, default to "available") - * @param headerDefaultEnum header default enum (optional, default to B) + * @param headerDefaultEnum header default enum (optional, default to HeaderDefaultEnum.B) * @param headerDefaultInt header default int (optional, default to 3) * @param cookieDefault cookie default (optional, default to "available") - * @param cookieDefaultEnum cookie default enum (optional, default to B) + * @param cookieDefaultEnum cookie default enum (optional, default to CookieDefaultEnum.B) * @param cookieDefaultInt cookie default int (optional, default to 3) * @param queryNullable query nullable (optional) * @param headerNullable header nullable (optional) @@ -181,13 +181,13 @@ class DefaultApi(basePath: kotlin.String = defaultBasePath, client: Call.Factory * @param pathDefault path default * @param pathNullable path_nullable * @param queryDefault query default (optional, default to "available") - * @param queryDefaultEnum query default enum (optional, default to B) + * @param queryDefaultEnum query default enum (optional, default to QueryDefaultEnum.B) * @param queryDefaultInt query default int (optional, default to 3) * @param headerDefault header default (optional, default to "available") - * @param headerDefaultEnum header default enum (optional, default to B) + * @param headerDefaultEnum header default enum (optional, default to HeaderDefaultEnum.B) * @param headerDefaultInt header default int (optional, default to 3) * @param cookieDefault cookie default (optional, default to "available") - * @param cookieDefaultEnum cookie default enum (optional, default to B) + * @param cookieDefaultEnum cookie default enum (optional, default to CookieDefaultEnum.B) * @param cookieDefaultInt cookie default int (optional, default to 3) * @param queryNullable query nullable (optional) * @param headerNullable header nullable (optional)