From 22529243b6c0d351f913787edd624df7f31d80c4 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Fri, 3 May 2024 09:55:10 +0200 Subject: [PATCH 01/22] [kotlin] Target correct library in jvm-spring-webclient sample --- ...otlin-jvm-spring-3-webclient-echo-api.yaml | 2 +- .../build.gradle | 5 +- .../org/openapitools/client/apis/AuthApi.kt | 44 ++++--- .../org/openapitools/client/apis/BodyApi.kt | 116 +++++++++--------- .../org/openapitools/client/apis/FormApi.kt | 44 ++++--- .../org/openapitools/client/apis/HeaderApi.kt | 32 ++--- .../org/openapitools/client/apis/PathApi.kt | 32 ++--- .../org/openapitools/client/apis/QueryApi.kt | 92 +++++++------- .../client/infrastructure/ApiClient.kt | 19 +-- 9 files changed, 207 insertions(+), 179 deletions(-) diff --git a/bin/configs/kotlin-jvm-spring-3-webclient-echo-api.yaml b/bin/configs/kotlin-jvm-spring-3-webclient-echo-api.yaml index ddafa03ed687..ac7972643cd1 100644 --- a/bin/configs/kotlin-jvm-spring-3-webclient-echo-api.yaml +++ b/bin/configs/kotlin-jvm-spring-3-webclient-echo-api.yaml @@ -1,6 +1,6 @@ generatorName: kotlin outputDir: samples/client/echo_api/kotlin-jvm-spring-3-webclient -library: jvm-spring-restclient +library: jvm-spring-webclient inputSpec: modules/openapi-generator/src/test/resources/3_0/kotlin/echo_api.yaml templateDir: modules/openapi-generator/src/main/resources/kotlin-client additionalProperties: diff --git a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/build.gradle b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/build.gradle index 2e7658f2f33d..81441fc10fa6 100644 --- a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/build.gradle +++ b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/build.gradle @@ -9,6 +9,7 @@ wrapper { buildscript { ext.kotlin_version = '1.8.10' ext.spring_boot_version = "3.2.4" + ext.reactor_version = "3.6.4" // 6.13.0 is the latest stable release that supports JDK8 ext.spotless_version = "6.13.0" @@ -59,11 +60,13 @@ kotlin { languageVersion.set(JavaLanguageVersion.of(17)) } } + dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.17.0" implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.0" - implementation "org.springframework.boot:spring-boot-starter-web:$spring_boot_version" + implementation "org.springframework.boot:spring-boot-starter-webflux:$spring_boot_version" + implementation "io.projectreactor:reactor-core:$reactor_version" testImplementation "io.kotlintest:kotlintest-runner-junit5:3.4.2" } diff --git a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/AuthApi.kt b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/AuthApi.kt index cc3e26512b0a..1b2741752687 100644 --- a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/AuthApi.kt +++ b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/AuthApi.kt @@ -17,33 +17,37 @@ package org.openapitools.client.apis import com.fasterxml.jackson.annotation.JsonProperty -import org.springframework.web.client.RestClient -import org.springframework.web.client.RestClientResponseException - -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter +import org.springframework.web.reactive.function.client.WebClient +import org.springframework.web.reactive.function.client.WebClientResponseException +import org.springframework.http.codec.json.Jackson2JsonDecoder +import org.springframework.http.codec.json.Jackson2JsonEncoder import org.springframework.http.ResponseEntity import org.springframework.http.MediaType - +import reactor.core.publisher.Mono +import org.springframework.util.LinkedMultiValueMap import org.openapitools.client.infrastructure.* -class AuthApi(client: RestClient) : ApiClient(client) { +class AuthApi(client: WebClient) : ApiClient(client) { - constructor(baseUrl: String) : this(RestClient.builder() + constructor(baseUrl: String) : this(WebClient.builder() .baseUrl(baseUrl) - .messageConverters { it.add(MappingJackson2HttpMessageConverter()) } + .codecs { + it.defaultCodecs().jackson2JsonEncoder(Jackson2JsonEncoder(Serializer.jacksonObjectMapper, MediaType.APPLICATION_JSON)) + it.defaultCodecs().jackson2JsonDecoder(Jackson2JsonDecoder(Serializer.jacksonObjectMapper, MediaType.APPLICATION_JSON)) + } .build() ) - @Throws(RestClientResponseException::class) - fun testAuthHttpBasic(): kotlin.String { - val result = testAuthHttpBasicWithHttpInfo() - return result.body!! + @Throws(WebClientResponseException::class) + fun testAuthHttpBasic(): Mono { + return testAuthHttpBasicWithHttpInfo() + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testAuthHttpBasicWithHttpInfo(): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testAuthHttpBasicWithHttpInfo(): Mono> { val localVariableConfig = testAuthHttpBasicRequestConfig() return request( localVariableConfig @@ -71,14 +75,14 @@ class AuthApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testAuthHttpBearer(): kotlin.String { - val result = testAuthHttpBearerWithHttpInfo() - return result.body!! + @Throws(WebClientResponseException::class) + fun testAuthHttpBearer(): Mono { + return testAuthHttpBearerWithHttpInfo() + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testAuthHttpBearerWithHttpInfo(): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testAuthHttpBearerWithHttpInfo(): Mono> { val localVariableConfig = testAuthHttpBearerRequestConfig() return request( localVariableConfig diff --git a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/BodyApi.kt b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/BodyApi.kt index 44ca769307d2..49d9a5840be5 100644 --- a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/BodyApi.kt +++ b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/BodyApi.kt @@ -17,35 +17,39 @@ package org.openapitools.client.apis import com.fasterxml.jackson.annotation.JsonProperty -import org.springframework.web.client.RestClient -import org.springframework.web.client.RestClientResponseException - -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter +import org.springframework.web.reactive.function.client.WebClient +import org.springframework.web.reactive.function.client.WebClientResponseException +import org.springframework.http.codec.json.Jackson2JsonDecoder +import org.springframework.http.codec.json.Jackson2JsonEncoder import org.springframework.http.ResponseEntity import org.springframework.http.MediaType - +import reactor.core.publisher.Mono +import org.springframework.util.LinkedMultiValueMap import org.openapitools.client.models.Pet import org.openapitools.client.models.Tag import org.openapitools.client.infrastructure.* -class BodyApi(client: RestClient) : ApiClient(client) { +class BodyApi(client: WebClient) : ApiClient(client) { - constructor(baseUrl: String) : this(RestClient.builder() + constructor(baseUrl: String) : this(WebClient.builder() .baseUrl(baseUrl) - .messageConverters { it.add(MappingJackson2HttpMessageConverter()) } + .codecs { + it.defaultCodecs().jackson2JsonEncoder(Jackson2JsonEncoder(Serializer.jacksonObjectMapper, MediaType.APPLICATION_JSON)) + it.defaultCodecs().jackson2JsonDecoder(Jackson2JsonDecoder(Serializer.jacksonObjectMapper, MediaType.APPLICATION_JSON)) + } .build() ) - @Throws(RestClientResponseException::class) - fun testBinaryGif(): java.io.File { - val result = testBinaryGifWithHttpInfo() - return result.body!! + @Throws(WebClientResponseException::class) + fun testBinaryGif(): Mono { + return testBinaryGifWithHttpInfo() + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testBinaryGifWithHttpInfo(): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testBinaryGifWithHttpInfo(): Mono> { val localVariableConfig = testBinaryGifRequestConfig() return request( localVariableConfig @@ -73,14 +77,14 @@ class BodyApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testBodyApplicationOctetstreamBinary(body: java.io.File? = null): kotlin.String { - val result = testBodyApplicationOctetstreamBinaryWithHttpInfo(body = body) - return result.body!! + @Throws(WebClientResponseException::class) + fun testBodyApplicationOctetstreamBinary(body: java.io.File? = null): Mono { + return testBodyApplicationOctetstreamBinaryWithHttpInfo(body = body) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testBodyApplicationOctetstreamBinaryWithHttpInfo(body: java.io.File? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testBodyApplicationOctetstreamBinaryWithHttpInfo(body: java.io.File? = null): Mono> { val localVariableConfig = testBodyApplicationOctetstreamBinaryRequestConfig(body = body) return request( localVariableConfig @@ -109,14 +113,14 @@ class BodyApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testBodyMultipartFormdataArrayOfBinary(files: kotlin.collections.List): kotlin.String { - val result = testBodyMultipartFormdataArrayOfBinaryWithHttpInfo(files = files) - return result.body!! + @Throws(WebClientResponseException::class) + fun testBodyMultipartFormdataArrayOfBinary(files: kotlin.collections.List): Mono { + return testBodyMultipartFormdataArrayOfBinaryWithHttpInfo(files = files) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testBodyMultipartFormdataArrayOfBinaryWithHttpInfo(files: kotlin.collections.List): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testBodyMultipartFormdataArrayOfBinaryWithHttpInfo(files: kotlin.collections.List): Mono> { val localVariableConfig = testBodyMultipartFormdataArrayOfBinaryRequestConfig(files = files) return request>, kotlin.String>( localVariableConfig @@ -145,14 +149,14 @@ class BodyApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testBodyMultipartFormdataSingleBinary(myFile: java.io.File? = null): kotlin.String { - val result = testBodyMultipartFormdataSingleBinaryWithHttpInfo(myFile = myFile) - return result.body!! + @Throws(WebClientResponseException::class) + fun testBodyMultipartFormdataSingleBinary(myFile: java.io.File? = null): Mono { + return testBodyMultipartFormdataSingleBinaryWithHttpInfo(myFile = myFile) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testBodyMultipartFormdataSingleBinaryWithHttpInfo(myFile: java.io.File? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testBodyMultipartFormdataSingleBinaryWithHttpInfo(myFile: java.io.File? = null): Mono> { val localVariableConfig = testBodyMultipartFormdataSingleBinaryRequestConfig(myFile = myFile) return request>, kotlin.String>( localVariableConfig @@ -181,14 +185,14 @@ class BodyApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testEchoBodyFreeFormObjectResponseString(body: kotlin.Any? = null): kotlin.String { - val result = testEchoBodyFreeFormObjectResponseStringWithHttpInfo(body = body) - return result.body!! + @Throws(WebClientResponseException::class) + fun testEchoBodyFreeFormObjectResponseString(body: kotlin.Any? = null): Mono { + return testEchoBodyFreeFormObjectResponseStringWithHttpInfo(body = body) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testEchoBodyFreeFormObjectResponseStringWithHttpInfo(body: kotlin.Any? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testEchoBodyFreeFormObjectResponseStringWithHttpInfo(body: kotlin.Any? = null): Mono> { val localVariableConfig = testEchoBodyFreeFormObjectResponseStringRequestConfig(body = body) return request( localVariableConfig @@ -217,14 +221,14 @@ class BodyApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testEchoBodyPet(pet: Pet? = null): Pet { - val result = testEchoBodyPetWithHttpInfo(pet = pet) - return result.body!! + @Throws(WebClientResponseException::class) + fun testEchoBodyPet(pet: Pet? = null): Mono { + return testEchoBodyPetWithHttpInfo(pet = pet) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testEchoBodyPetWithHttpInfo(pet: Pet? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testEchoBodyPetWithHttpInfo(pet: Pet? = null): Mono> { val localVariableConfig = testEchoBodyPetRequestConfig(pet = pet) return request( localVariableConfig @@ -253,14 +257,14 @@ class BodyApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testEchoBodyPetResponseString(pet: Pet? = null): kotlin.String { - val result = testEchoBodyPetResponseStringWithHttpInfo(pet = pet) - return result.body!! + @Throws(WebClientResponseException::class) + fun testEchoBodyPetResponseString(pet: Pet? = null): Mono { + return testEchoBodyPetResponseStringWithHttpInfo(pet = pet) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testEchoBodyPetResponseStringWithHttpInfo(pet: Pet? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testEchoBodyPetResponseStringWithHttpInfo(pet: Pet? = null): Mono> { val localVariableConfig = testEchoBodyPetResponseStringRequestConfig(pet = pet) return request( localVariableConfig @@ -289,14 +293,14 @@ class BodyApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testEchoBodyTagResponseString(tag: Tag? = null): kotlin.String { - val result = testEchoBodyTagResponseStringWithHttpInfo(tag = tag) - return result.body!! + @Throws(WebClientResponseException::class) + fun testEchoBodyTagResponseString(tag: Tag? = null): Mono { + return testEchoBodyTagResponseStringWithHttpInfo(tag = tag) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testEchoBodyTagResponseStringWithHttpInfo(tag: Tag? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testEchoBodyTagResponseStringWithHttpInfo(tag: Tag? = null): Mono> { val localVariableConfig = testEchoBodyTagResponseStringRequestConfig(tag = tag) return request( localVariableConfig diff --git a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/FormApi.kt b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/FormApi.kt index c45ae1a23b65..7182da46e83c 100644 --- a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/FormApi.kt +++ b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/FormApi.kt @@ -17,33 +17,37 @@ package org.openapitools.client.apis import com.fasterxml.jackson.annotation.JsonProperty -import org.springframework.web.client.RestClient -import org.springframework.web.client.RestClientResponseException - -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter +import org.springframework.web.reactive.function.client.WebClient +import org.springframework.web.reactive.function.client.WebClientResponseException +import org.springframework.http.codec.json.Jackson2JsonDecoder +import org.springframework.http.codec.json.Jackson2JsonEncoder import org.springframework.http.ResponseEntity import org.springframework.http.MediaType - +import reactor.core.publisher.Mono +import org.springframework.util.LinkedMultiValueMap import org.openapitools.client.infrastructure.* -class FormApi(client: RestClient) : ApiClient(client) { +class FormApi(client: WebClient) : ApiClient(client) { - constructor(baseUrl: String) : this(RestClient.builder() + constructor(baseUrl: String) : this(WebClient.builder() .baseUrl(baseUrl) - .messageConverters { it.add(MappingJackson2HttpMessageConverter()) } + .codecs { + it.defaultCodecs().jackson2JsonEncoder(Jackson2JsonEncoder(Serializer.jacksonObjectMapper, MediaType.APPLICATION_JSON)) + it.defaultCodecs().jackson2JsonDecoder(Jackson2JsonDecoder(Serializer.jacksonObjectMapper, MediaType.APPLICATION_JSON)) + } .build() ) - @Throws(RestClientResponseException::class) - fun testFormIntegerBooleanString(integerForm: kotlin.Int? = null, booleanForm: kotlin.Boolean? = null, stringForm: kotlin.String? = null): kotlin.String { - val result = testFormIntegerBooleanStringWithHttpInfo(integerForm = integerForm, booleanForm = booleanForm, stringForm = stringForm) - return result.body!! + @Throws(WebClientResponseException::class) + fun testFormIntegerBooleanString(integerForm: kotlin.Int? = null, booleanForm: kotlin.Boolean? = null, stringForm: kotlin.String? = null): Mono { + return testFormIntegerBooleanStringWithHttpInfo(integerForm = integerForm, booleanForm = booleanForm, stringForm = stringForm) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testFormIntegerBooleanStringWithHttpInfo(integerForm: kotlin.Int? = null, booleanForm: kotlin.Boolean? = null, stringForm: kotlin.String? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testFormIntegerBooleanStringWithHttpInfo(integerForm: kotlin.Int? = null, booleanForm: kotlin.Boolean? = null, stringForm: kotlin.String? = null): Mono> { val localVariableConfig = testFormIntegerBooleanStringRequestConfig(integerForm = integerForm, booleanForm = booleanForm, stringForm = stringForm) return request>, kotlin.String>( localVariableConfig @@ -74,14 +78,14 @@ class FormApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testFormOneof(form1: kotlin.String? = null, form2: kotlin.Int? = null, form3: kotlin.String? = null, form4: kotlin.Boolean? = null, id: kotlin.Long? = null, name: kotlin.String? = null): kotlin.String { - val result = testFormOneofWithHttpInfo(form1 = form1, form2 = form2, form3 = form3, form4 = form4, id = id, name = name) - return result.body!! + @Throws(WebClientResponseException::class) + fun testFormOneof(form1: kotlin.String? = null, form2: kotlin.Int? = null, form3: kotlin.String? = null, form4: kotlin.Boolean? = null, id: kotlin.Long? = null, name: kotlin.String? = null): Mono { + return testFormOneofWithHttpInfo(form1 = form1, form2 = form2, form3 = form3, form4 = form4, id = id, name = name) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testFormOneofWithHttpInfo(form1: kotlin.String? = null, form2: kotlin.Int? = null, form3: kotlin.String? = null, form4: kotlin.Boolean? = null, id: kotlin.Long? = null, name: kotlin.String? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testFormOneofWithHttpInfo(form1: kotlin.String? = null, form2: kotlin.Int? = null, form3: kotlin.String? = null, form4: kotlin.Boolean? = null, id: kotlin.Long? = null, name: kotlin.String? = null): Mono> { val localVariableConfig = testFormOneofRequestConfig(form1 = form1, form2 = form2, form3 = form3, form4 = form4, id = id, name = name) return request>, kotlin.String>( localVariableConfig diff --git a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/HeaderApi.kt b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/HeaderApi.kt index ce7a48355e8e..b21a449f9037 100644 --- a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/HeaderApi.kt +++ b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/HeaderApi.kt @@ -17,22 +17,26 @@ package org.openapitools.client.apis import com.fasterxml.jackson.annotation.JsonProperty -import org.springframework.web.client.RestClient -import org.springframework.web.client.RestClientResponseException - -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter +import org.springframework.web.reactive.function.client.WebClient +import org.springframework.web.reactive.function.client.WebClientResponseException +import org.springframework.http.codec.json.Jackson2JsonDecoder +import org.springframework.http.codec.json.Jackson2JsonEncoder import org.springframework.http.ResponseEntity import org.springframework.http.MediaType - +import reactor.core.publisher.Mono +import org.springframework.util.LinkedMultiValueMap import org.openapitools.client.models.StringEnumRef import org.openapitools.client.infrastructure.* -class HeaderApi(client: RestClient) : ApiClient(client) { +class HeaderApi(client: WebClient) : ApiClient(client) { - constructor(baseUrl: String) : this(RestClient.builder() + constructor(baseUrl: String) : this(WebClient.builder() .baseUrl(baseUrl) - .messageConverters { it.add(MappingJackson2HttpMessageConverter()) } + .codecs { + it.defaultCodecs().jackson2JsonEncoder(Jackson2JsonEncoder(Serializer.jacksonObjectMapper, MediaType.APPLICATION_JSON)) + it.defaultCodecs().jackson2JsonDecoder(Jackson2JsonDecoder(Serializer.jacksonObjectMapper, MediaType.APPLICATION_JSON)) + } .build() ) @@ -46,14 +50,14 @@ class HeaderApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testHeaderIntegerBooleanStringEnums(integerHeader: kotlin.Int? = null, booleanHeader: kotlin.Boolean? = null, stringHeader: kotlin.String? = null, enumNonrefStringHeader: EnumNonrefStringHeaderTestHeaderIntegerBooleanStringEnums? = null, enumRefStringHeader: StringEnumRef? = null): kotlin.String { - val result = testHeaderIntegerBooleanStringEnumsWithHttpInfo(integerHeader = integerHeader, booleanHeader = booleanHeader, stringHeader = stringHeader, enumNonrefStringHeader = enumNonrefStringHeader, enumRefStringHeader = enumRefStringHeader) - return result.body!! + @Throws(WebClientResponseException::class) + fun testHeaderIntegerBooleanStringEnums(integerHeader: kotlin.Int? = null, booleanHeader: kotlin.Boolean? = null, stringHeader: kotlin.String? = null, enumNonrefStringHeader: EnumNonrefStringHeaderTestHeaderIntegerBooleanStringEnums? = null, enumRefStringHeader: StringEnumRef? = null): Mono { + return testHeaderIntegerBooleanStringEnumsWithHttpInfo(integerHeader = integerHeader, booleanHeader = booleanHeader, stringHeader = stringHeader, enumNonrefStringHeader = enumNonrefStringHeader, enumRefStringHeader = enumRefStringHeader) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testHeaderIntegerBooleanStringEnumsWithHttpInfo(integerHeader: kotlin.Int? = null, booleanHeader: kotlin.Boolean? = null, stringHeader: kotlin.String? = null, enumNonrefStringHeader: EnumNonrefStringHeaderTestHeaderIntegerBooleanStringEnums? = null, enumRefStringHeader: StringEnumRef? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testHeaderIntegerBooleanStringEnumsWithHttpInfo(integerHeader: kotlin.Int? = null, booleanHeader: kotlin.Boolean? = null, stringHeader: kotlin.String? = null, enumNonrefStringHeader: EnumNonrefStringHeaderTestHeaderIntegerBooleanStringEnums? = null, enumRefStringHeader: StringEnumRef? = null): Mono> { val localVariableConfig = testHeaderIntegerBooleanStringEnumsRequestConfig(integerHeader = integerHeader, booleanHeader = booleanHeader, stringHeader = stringHeader, enumNonrefStringHeader = enumNonrefStringHeader, enumRefStringHeader = enumRefStringHeader) return request( localVariableConfig diff --git a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/PathApi.kt b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/PathApi.kt index f1af5bd244a8..062e0a6c403d 100644 --- a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/PathApi.kt +++ b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/PathApi.kt @@ -17,22 +17,26 @@ package org.openapitools.client.apis import com.fasterxml.jackson.annotation.JsonProperty -import org.springframework.web.client.RestClient -import org.springframework.web.client.RestClientResponseException - -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter +import org.springframework.web.reactive.function.client.WebClient +import org.springframework.web.reactive.function.client.WebClientResponseException +import org.springframework.http.codec.json.Jackson2JsonDecoder +import org.springframework.http.codec.json.Jackson2JsonEncoder import org.springframework.http.ResponseEntity import org.springframework.http.MediaType - +import reactor.core.publisher.Mono +import org.springframework.util.LinkedMultiValueMap import org.openapitools.client.models.StringEnumRef import org.openapitools.client.infrastructure.* -class PathApi(client: RestClient) : ApiClient(client) { +class PathApi(client: WebClient) : ApiClient(client) { - constructor(baseUrl: String) : this(RestClient.builder() + constructor(baseUrl: String) : this(WebClient.builder() .baseUrl(baseUrl) - .messageConverters { it.add(MappingJackson2HttpMessageConverter()) } + .codecs { + it.defaultCodecs().jackson2JsonEncoder(Jackson2JsonEncoder(Serializer.jacksonObjectMapper, MediaType.APPLICATION_JSON)) + it.defaultCodecs().jackson2JsonDecoder(Jackson2JsonDecoder(Serializer.jacksonObjectMapper, MediaType.APPLICATION_JSON)) + } .build() ) @@ -46,14 +50,14 @@ class PathApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath(pathString: kotlin.String, pathInteger: kotlin.Int, enumNonrefStringPath: EnumNonrefStringPathTestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath, enumRefStringPath: StringEnumRef): kotlin.String { - val result = testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathWithHttpInfo(pathString = pathString, pathInteger = pathInteger, enumNonrefStringPath = enumNonrefStringPath, enumRefStringPath = enumRefStringPath) - return result.body!! + @Throws(WebClientResponseException::class) + fun testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath(pathString: kotlin.String, pathInteger: kotlin.Int, enumNonrefStringPath: EnumNonrefStringPathTestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath, enumRefStringPath: StringEnumRef): Mono { + return testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathWithHttpInfo(pathString = pathString, pathInteger = pathInteger, enumNonrefStringPath = enumNonrefStringPath, enumRefStringPath = enumRefStringPath) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathWithHttpInfo(pathString: kotlin.String, pathInteger: kotlin.Int, enumNonrefStringPath: EnumNonrefStringPathTestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath, enumRefStringPath: StringEnumRef): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathWithHttpInfo(pathString: kotlin.String, pathInteger: kotlin.Int, enumNonrefStringPath: EnumNonrefStringPathTestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath, enumRefStringPath: StringEnumRef): Mono> { val localVariableConfig = testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathRequestConfig(pathString = pathString, pathInteger = pathInteger, enumNonrefStringPath = enumNonrefStringPath, enumRefStringPath = enumRefStringPath) return request( localVariableConfig diff --git a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/QueryApi.kt b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/QueryApi.kt index 3b2b78ffec98..dc2d0bb902d1 100644 --- a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/QueryApi.kt +++ b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/apis/QueryApi.kt @@ -17,24 +17,28 @@ package org.openapitools.client.apis import com.fasterxml.jackson.annotation.JsonProperty -import org.springframework.web.client.RestClient -import org.springframework.web.client.RestClientResponseException - -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter +import org.springframework.web.reactive.function.client.WebClient +import org.springframework.web.reactive.function.client.WebClientResponseException +import org.springframework.http.codec.json.Jackson2JsonDecoder +import org.springframework.http.codec.json.Jackson2JsonEncoder import org.springframework.http.ResponseEntity import org.springframework.http.MediaType - +import reactor.core.publisher.Mono +import org.springframework.util.LinkedMultiValueMap import org.openapitools.client.models.Pet import org.openapitools.client.models.StringEnumRef import org.openapitools.client.models.TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter import org.openapitools.client.infrastructure.* -class QueryApi(client: RestClient) : ApiClient(client) { +class QueryApi(client: WebClient) : ApiClient(client) { - constructor(baseUrl: String) : this(RestClient.builder() + constructor(baseUrl: String) : this(WebClient.builder() .baseUrl(baseUrl) - .messageConverters { it.add(MappingJackson2HttpMessageConverter()) } + .codecs { + it.defaultCodecs().jackson2JsonEncoder(Jackson2JsonEncoder(Serializer.jacksonObjectMapper, MediaType.APPLICATION_JSON)) + it.defaultCodecs().jackson2JsonDecoder(Jackson2JsonDecoder(Serializer.jacksonObjectMapper, MediaType.APPLICATION_JSON)) + } .build() ) @@ -48,14 +52,14 @@ class QueryApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testEnumRefString(enumNonrefStringQuery: EnumNonrefStringQueryTestEnumRefString? = null, enumRefStringQuery: StringEnumRef? = null): kotlin.String { - val result = testEnumRefStringWithHttpInfo(enumNonrefStringQuery = enumNonrefStringQuery, enumRefStringQuery = enumRefStringQuery) - return result.body!! + @Throws(WebClientResponseException::class) + fun testEnumRefString(enumNonrefStringQuery: EnumNonrefStringQueryTestEnumRefString? = null, enumRefStringQuery: StringEnumRef? = null): Mono { + return testEnumRefStringWithHttpInfo(enumNonrefStringQuery = enumNonrefStringQuery, enumRefStringQuery = enumRefStringQuery) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testEnumRefStringWithHttpInfo(enumNonrefStringQuery: EnumNonrefStringQueryTestEnumRefString? = null, enumRefStringQuery: StringEnumRef? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testEnumRefStringWithHttpInfo(enumNonrefStringQuery: EnumNonrefStringQueryTestEnumRefString? = null, enumRefStringQuery: StringEnumRef? = null): Mono> { val localVariableConfig = testEnumRefStringRequestConfig(enumNonrefStringQuery = enumNonrefStringQuery, enumRefStringQuery = enumRefStringQuery) return request( localVariableConfig @@ -91,14 +95,14 @@ class QueryApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testQueryDatetimeDateString(datetimeQuery: java.time.OffsetDateTime? = null, dateQuery: java.time.LocalDate? = null, stringQuery: kotlin.String? = null): kotlin.String { - val result = testQueryDatetimeDateStringWithHttpInfo(datetimeQuery = datetimeQuery, dateQuery = dateQuery, stringQuery = stringQuery) - return result.body!! + @Throws(WebClientResponseException::class) + fun testQueryDatetimeDateString(datetimeQuery: java.time.OffsetDateTime? = null, dateQuery: java.time.LocalDate? = null, stringQuery: kotlin.String? = null): Mono { + return testQueryDatetimeDateStringWithHttpInfo(datetimeQuery = datetimeQuery, dateQuery = dateQuery, stringQuery = stringQuery) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testQueryDatetimeDateStringWithHttpInfo(datetimeQuery: java.time.OffsetDateTime? = null, dateQuery: java.time.LocalDate? = null, stringQuery: kotlin.String? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testQueryDatetimeDateStringWithHttpInfo(datetimeQuery: java.time.OffsetDateTime? = null, dateQuery: java.time.LocalDate? = null, stringQuery: kotlin.String? = null): Mono> { val localVariableConfig = testQueryDatetimeDateStringRequestConfig(datetimeQuery = datetimeQuery, dateQuery = dateQuery, stringQuery = stringQuery) return request( localVariableConfig @@ -137,14 +141,14 @@ class QueryApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testQueryIntegerBooleanString(integerQuery: kotlin.Int? = null, booleanQuery: kotlin.Boolean? = null, stringQuery: kotlin.String? = null): kotlin.String { - val result = testQueryIntegerBooleanStringWithHttpInfo(integerQuery = integerQuery, booleanQuery = booleanQuery, stringQuery = stringQuery) - return result.body!! + @Throws(WebClientResponseException::class) + fun testQueryIntegerBooleanString(integerQuery: kotlin.Int? = null, booleanQuery: kotlin.Boolean? = null, stringQuery: kotlin.String? = null): Mono { + return testQueryIntegerBooleanStringWithHttpInfo(integerQuery = integerQuery, booleanQuery = booleanQuery, stringQuery = stringQuery) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testQueryIntegerBooleanStringWithHttpInfo(integerQuery: kotlin.Int? = null, booleanQuery: kotlin.Boolean? = null, stringQuery: kotlin.String? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testQueryIntegerBooleanStringWithHttpInfo(integerQuery: kotlin.Int? = null, booleanQuery: kotlin.Boolean? = null, stringQuery: kotlin.String? = null): Mono> { val localVariableConfig = testQueryIntegerBooleanStringRequestConfig(integerQuery = integerQuery, booleanQuery = booleanQuery, stringQuery = stringQuery) return request( localVariableConfig @@ -183,14 +187,14 @@ class QueryApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testQueryStyleDeepObjectExplodeTrueObject(queryObject: Pet? = null): kotlin.String { - val result = testQueryStyleDeepObjectExplodeTrueObjectWithHttpInfo(queryObject = queryObject) - return result.body!! + @Throws(WebClientResponseException::class) + fun testQueryStyleDeepObjectExplodeTrueObject(queryObject: Pet? = null): Mono { + return testQueryStyleDeepObjectExplodeTrueObjectWithHttpInfo(queryObject = queryObject) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testQueryStyleDeepObjectExplodeTrueObjectWithHttpInfo(queryObject: Pet? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testQueryStyleDeepObjectExplodeTrueObjectWithHttpInfo(queryObject: Pet? = null): Mono> { val localVariableConfig = testQueryStyleDeepObjectExplodeTrueObjectRequestConfig(queryObject = queryObject) return request( localVariableConfig @@ -223,14 +227,14 @@ class QueryApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testQueryStyleFormExplodeTrueArrayString(queryObject: TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter? = null): kotlin.String { - val result = testQueryStyleFormExplodeTrueArrayStringWithHttpInfo(queryObject = queryObject) - return result.body!! + @Throws(WebClientResponseException::class) + fun testQueryStyleFormExplodeTrueArrayString(queryObject: TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter? = null): Mono { + return testQueryStyleFormExplodeTrueArrayStringWithHttpInfo(queryObject = queryObject) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testQueryStyleFormExplodeTrueArrayStringWithHttpInfo(queryObject: TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testQueryStyleFormExplodeTrueArrayStringWithHttpInfo(queryObject: TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter? = null): Mono> { val localVariableConfig = testQueryStyleFormExplodeTrueArrayStringRequestConfig(queryObject = queryObject) return request( localVariableConfig @@ -263,14 +267,14 @@ class QueryApi(client: RestClient) : ApiClient(client) { } - @Throws(RestClientResponseException::class) - fun testQueryStyleFormExplodeTrueObject(queryObject: Pet? = null): kotlin.String { - val result = testQueryStyleFormExplodeTrueObjectWithHttpInfo(queryObject = queryObject) - return result.body!! + @Throws(WebClientResponseException::class) + fun testQueryStyleFormExplodeTrueObject(queryObject: Pet? = null): Mono { + return testQueryStyleFormExplodeTrueObjectWithHttpInfo(queryObject = queryObject) + .map { it.body } } - @Throws(RestClientResponseException::class) - fun testQueryStyleFormExplodeTrueObjectWithHttpInfo(queryObject: Pet? = null): ResponseEntity { + @Throws(WebClientResponseException::class) + fun testQueryStyleFormExplodeTrueObjectWithHttpInfo(queryObject: Pet? = null): Mono> { val localVariableConfig = testQueryStyleFormExplodeTrueObjectRequestConfig(queryObject = queryObject) return request( localVariableConfig diff --git a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/infrastructure/ApiClient.kt b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/infrastructure/ApiClient.kt index 64f843ed93be..b8acccd3de12 100644 --- a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/infrastructure/ApiClient.kt +++ b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/infrastructure/ApiClient.kt @@ -4,13 +4,14 @@ import org.springframework.core.ParameterizedTypeReference import org.springframework.http.HttpHeaders import org.springframework.http.HttpMethod import org.springframework.http.MediaType -import org.springframework.web.client.RestClient +import org.springframework.web.reactive.function.client.WebClient import org.springframework.http.ResponseEntity import org.springframework.util.LinkedMultiValueMap +import reactor.core.publisher.Mono -open class ApiClient(protected val client: RestClient) { +open class ApiClient(protected val client: WebClient) { - protected inline fun request(requestConfig: RequestConfig): ResponseEntity { + protected inline fun request(requestConfig: RequestConfig): Mono> { return prepare(defaults(requestConfig)) .retrieve() .toEntity(object : ParameterizedTypeReference() {}) @@ -20,7 +21,7 @@ open class ApiClient(protected val client: RestClient) { client.method(requestConfig) .uri(requestConfig) .headers(requestConfig) - .nullableBody(requestConfig) + .body(requestConfig) protected fun defaults(requestConfig: RequestConfig) = requestConfig.apply { @@ -32,10 +33,10 @@ open class ApiClient(protected val client: RestClient) { } } - private fun RestClient.method(requestConfig: RequestConfig)= + private fun WebClient.method(requestConfig: RequestConfig)= method(HttpMethod.valueOf(requestConfig.method.name)) - private fun RestClient.RequestBodyUriSpec.uri(requestConfig: RequestConfig) = + private fun WebClient.RequestBodyUriSpec.uri(requestConfig: RequestConfig) = uri { builder -> builder .path(requestConfig.path) @@ -43,11 +44,11 @@ open class ApiClient(protected val client: RestClient) { .build(requestConfig.params) } - private fun RestClient.RequestBodySpec.headers(requestConfig: RequestConfig) = + private fun WebClient.RequestBodySpec.headers(requestConfig: RequestConfig) = apply { requestConfig.headers.forEach { (name, value) -> header(name, value) } } - private fun RestClient.RequestBodySpec.nullableBody(requestConfig: RequestConfig) = - apply { if (requestConfig.body != null) body(requestConfig.body) } + private fun WebClient.RequestBodySpec.body(requestConfig: RequestConfig) = + apply { if (requestConfig.body != null) bodyValue(requestConfig.body) } } inline fun parseDateToQueryString(value : T): String { From 68f36b9c4a2b6b201994c1ee034556bb867e4b7d Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Fri, 3 May 2024 09:55:28 +0200 Subject: [PATCH 02/22] [kotlin] Fixed warning in jvm-spring-restclient --- .../libraries/jvm-spring-restclient/api.mustache | 2 +- .../kotlin/org/openapitools/client/apis/PetApi.kt | 4 ++-- .../kotlin/org/openapitools/client/apis/StoreApi.kt | 2 +- .../kotlin/org/openapitools/client/apis/UserApi.kt | 12 ++++++------ 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/jvm-spring-restclient/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/jvm-spring-restclient/api.mustache index 35b33e9d029c..7af6f39c4eb4 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/jvm-spring-restclient/api.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/jvm-spring-restclient/api.mustache @@ -67,7 +67,7 @@ import {{packageName}}.infrastructure.* @Deprecated(message = "This operation is deprecated.") {{/isDeprecated}} fun {{operationId}}({{#allParams}}{{{paramName}}}: {{#isEnum}}{{#isContainer}}kotlin.collections.List<{{enumName}}{{operationIdCamelCase}}>{{/isContainer}}{{^isContainer}}{{enumName}}{{operationIdCamelCase}}{{/isContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}?{{#defaultValue}} = {{>param_default_value}}{{/defaultValue}}{{^defaultValue}} = null{{/defaultValue}}{{/required}}{{^-last}}, {{/-last}}{{/allParams}}): {{#returnType}}{{{returnType}}}{{#nullableReturnType}}?{{/nullableReturnType}}{{/returnType}}{{^returnType}}Unit{{/returnType}} { - val result = {{operationId}}WithHttpInfo({{#allParams}}{{{paramName}}} = {{{paramName}}}{{^-last}}, {{/-last}}{{/allParams}}) + {{#returnType}}val result = {{/returnType}}{{operationId}}WithHttpInfo({{#allParams}}{{{paramName}}} = {{{paramName}}}{{^-last}}, {{/-last}}{{/allParams}}) {{#returnType}} return result.body!! {{/returnType}} diff --git a/samples/client/petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/apis/PetApi.kt index a1555520b2c6..4f5441e98e59 100644 --- a/samples/client/petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/apis/PetApi.kt @@ -77,7 +77,7 @@ class PetApi(client: RestClient) : ApiClient(client) { @Throws(RestClientResponseException::class) fun deletePet(petId: kotlin.Long, apiKey: kotlin.String? = null): Unit { - val result = deletePetWithHttpInfo(petId = petId, apiKey = apiKey) + deletePetWithHttpInfo(petId = petId, apiKey = apiKey) } @Throws(RestClientResponseException::class) @@ -273,7 +273,7 @@ class PetApi(client: RestClient) : ApiClient(client) { @Throws(RestClientResponseException::class) fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String? = null, status: kotlin.String? = null): Unit { - val result = updatePetWithFormWithHttpInfo(petId = petId, name = name, status = status) + updatePetWithFormWithHttpInfo(petId = petId, name = name, status = status) } @Throws(RestClientResponseException::class) diff --git a/samples/client/petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt index e16a15939444..777a6f9f5e4e 100644 --- a/samples/client/petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt @@ -39,7 +39,7 @@ class StoreApi(client: RestClient) : ApiClient(client) { @Throws(RestClientResponseException::class) fun deleteOrder(orderId: kotlin.String): Unit { - val result = deleteOrderWithHttpInfo(orderId = orderId) + deleteOrderWithHttpInfo(orderId = orderId) } @Throws(RestClientResponseException::class) diff --git a/samples/client/petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/apis/UserApi.kt index caa0f6729b69..8d7967a0d707 100644 --- a/samples/client/petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/apis/UserApi.kt @@ -39,7 +39,7 @@ class UserApi(client: RestClient) : ApiClient(client) { @Throws(RestClientResponseException::class) fun createUser(user: User): Unit { - val result = createUserWithHttpInfo(user = user) + createUserWithHttpInfo(user = user) } @Throws(RestClientResponseException::class) @@ -73,7 +73,7 @@ class UserApi(client: RestClient) : ApiClient(client) { @Throws(RestClientResponseException::class) fun createUsersWithArrayInput(user: kotlin.collections.List): Unit { - val result = createUsersWithArrayInputWithHttpInfo(user = user) + createUsersWithArrayInputWithHttpInfo(user = user) } @Throws(RestClientResponseException::class) @@ -107,7 +107,7 @@ class UserApi(client: RestClient) : ApiClient(client) { @Throws(RestClientResponseException::class) fun createUsersWithListInput(user: kotlin.collections.List): Unit { - val result = createUsersWithListInputWithHttpInfo(user = user) + createUsersWithListInputWithHttpInfo(user = user) } @Throws(RestClientResponseException::class) @@ -141,7 +141,7 @@ class UserApi(client: RestClient) : ApiClient(client) { @Throws(RestClientResponseException::class) fun deleteUser(username: kotlin.String): Unit { - val result = deleteUserWithHttpInfo(username = username) + deleteUserWithHttpInfo(username = username) } @Throws(RestClientResponseException::class) @@ -250,7 +250,7 @@ class UserApi(client: RestClient) : ApiClient(client) { @Throws(RestClientResponseException::class) fun logoutUser(): Unit { - val result = logoutUserWithHttpInfo() + logoutUserWithHttpInfo() } @Throws(RestClientResponseException::class) @@ -283,7 +283,7 @@ class UserApi(client: RestClient) : ApiClient(client) { @Throws(RestClientResponseException::class) fun updateUser(username: kotlin.String, user: User): Unit { - val result = updateUserWithHttpInfo(username = username, user = user) + updateUserWithHttpInfo(username = username, user = user) } @Throws(RestClientResponseException::class) From 8d1994ebdc818d1d8ed1d432435ba82b82f345c5 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Fri, 10 May 2024 08:12:25 +0200 Subject: [PATCH 03/22] [kotlin-wiremock] added generator and sample --- bin/configs/kotlin-wiremock.yaml | 6 ++++ .../languages/JavaWiremockServerCodegen.java | 2 +- .../KotlinWiremockServerCodegen.java | 28 ++++++++++++++++++ .../org.openapitools.codegen.CodegenConfig | 1 + .../resources/kotlin-wiremock/api.mustache | 9 ++++++ .../kotlin-wiremock/gradle-wrapper.jar | Bin 0 -> 62076 bytes 6 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 bin/configs/kotlin-wiremock.yaml create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java create mode 100644 modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-wiremock/gradle-wrapper.jar diff --git a/bin/configs/kotlin-wiremock.yaml b/bin/configs/kotlin-wiremock.yaml new file mode 100644 index 000000000000..c3864bfeb085 --- /dev/null +++ b/bin/configs/kotlin-wiremock.yaml @@ -0,0 +1,6 @@ +generatorName: kotlin-wiremock +outputDir: samples/server/petstore/kotlin-wiremock +inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml +templateDir: modules/openapi-generator/src/main/resources/kotlin-wiremock +additionalProperties: + artifactId: petstore-kotlin-wiremock diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaWiremockServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaWiremockServerCodegen.java index d2433483c654..8cb6eebaa7fe 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaWiremockServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaWiremockServerCodegen.java @@ -23,7 +23,7 @@ public String getName() { } public String getHelp() { - return "Generates Java Wiremock stubs, requests and responses samples."; + return "Generates Java WireMock stubs, requests and responses samples."; } public JavaWiremockServerCodegen() { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java new file mode 100644 index 000000000000..1edca06c3f22 --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java @@ -0,0 +1,28 @@ +package org.openapitools.codegen.languages; + +import org.openapitools.codegen.CodegenType; + +public class KotlinWiremockServerCodegen extends AbstractKotlinCodegen { + + @Override + public CodegenType getTag() { + return CodegenType.SERVER; + } + + @Override + public String getName() { + return "kotlin-wiremock"; + } + + @Override + public String getHelp() { + return "Generates Kotlin WireMock stubs, requests and responses samples."; + } + + @Override + public void processOpts() { + super.processOpts(); + + apiTemplateFiles.put("api.mustache", "Stub.kt"); + } +} diff --git a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig index 3521954fc48b..8e927f998f6e 100644 --- a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig +++ b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig @@ -43,6 +43,7 @@ org.openapitools.codegen.languages.KotlinClientCodegen org.openapitools.codegen.languages.KotlinServerCodegen org.openapitools.codegen.languages.KotlinSpringServerCodegen org.openapitools.codegen.languages.KotlinVertxServerCodegen +org.openapitools.codegen.languages.KotlinWiremockServerCodegen org.openapitools.codegen.languages.KtormSchemaCodegen org.openapitools.codegen.languages.HaskellHttpClientCodegen org.openapitools.codegen.languages.HaskellServantCodegen diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache new file mode 100644 index 000000000000..baf190909a1e --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache @@ -0,0 +1,9 @@ +{{#operations}} +class {{classname}}Stubs { +{{#operation}} + fun {{operationId}} { + TODO() + } +{{/operation}} +} +{{/operations}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/gradle-wrapper.jar b/modules/openapi-generator/src/main/resources/kotlin-wiremock/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..c1962a79e29d3e0ab67b14947c167a862655af9b GIT binary patch literal 62076 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 literal 0 HcmV?d00001 From bbe469f25de73b182840c49d107cded5af61ed42 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sat, 11 May 2024 10:41:22 +0200 Subject: [PATCH 04/22] [kotlin-wiremock] First version with petstore --- .github/workflows/samples-kotlin-server.yaml | 1 + .../KotlinWiremockServerCodegen.java | 64 +++- .../resources/kotlin-wiremock/api.mustache | 60 ++- .../kotlin-wiremock/build.gradle.kts.mustache | 15 + .../kotlin-wiremock/gradle-wrapper.jar | Bin 62076 -> 43462 bytes .../gradle-wrapper.properties.mustache | 7 + .../kotlin-wiremock/gradlew.bat.mustache | 249 ++++++++++++ .../kotlin-wiremock/gradlew.mustache | 249 ++++++++++++ .../libs.versions.toml.mustache | 10 + .../resources/kotlin-wiremock/model.mustache | 17 + .../settings.gradle.kts.mustache | 7 + .../kotlin-wiremock/.openapi-generator-ignore | 23 ++ .../kotlin-wiremock/.openapi-generator/FILES | 16 + .../.openapi-generator/VERSION | 1 + .../petstore/kotlin-wiremock/build.gradle.kts | 15 + .../kotlin-wiremock/gradle/libs.versions.toml | 10 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43462 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + .../server/petstore/kotlin-wiremock/gradlew | 249 ++++++++++++ .../petstore/kotlin-wiremock/gradlew.bat | 249 ++++++++++++ .../kotlin-wiremock/settings.gradle.kts | 7 + .../kotlin/org/openapitools/apis/PetApi.kt | 359 ++++++++++++++++++ .../kotlin/org/openapitools/apis/StoreApi.kt | 179 +++++++++ .../kotlin/org/openapitools/apis/UserApi.kt | 275 ++++++++++++++ .../org/openapitools/models/Category.kt | 10 + .../openapitools/models/ModelApiResponse.kt | 11 + .../kotlin/org/openapitools/models/Order.kt | 14 + .../kotlin/org/openapitools/models/Pet.kt | 14 + .../kotlin/org/openapitools/models/Tag.kt | 10 + .../kotlin/org/openapitools/models/User.kt | 16 + 30 files changed, 2140 insertions(+), 4 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/kotlin-wiremock/build.gradle.kts.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-wiremock/gradle-wrapper.properties.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-wiremock/gradlew.bat.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-wiremock/gradlew.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-wiremock/libs.versions.toml.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-wiremock/settings.gradle.kts.mustache create mode 100644 samples/server/petstore/kotlin-wiremock/.openapi-generator-ignore create mode 100644 samples/server/petstore/kotlin-wiremock/.openapi-generator/FILES create mode 100644 samples/server/petstore/kotlin-wiremock/.openapi-generator/VERSION create mode 100644 samples/server/petstore/kotlin-wiremock/build.gradle.kts create mode 100644 samples/server/petstore/kotlin-wiremock/gradle/libs.versions.toml create mode 100644 samples/server/petstore/kotlin-wiremock/gradle/wrapper/gradle-wrapper.jar create mode 100644 samples/server/petstore/kotlin-wiremock/gradle/wrapper/gradle-wrapper.properties create mode 100644 samples/server/petstore/kotlin-wiremock/gradlew create mode 100644 samples/server/petstore/kotlin-wiremock/gradlew.bat create mode 100644 samples/server/petstore/kotlin-wiremock/settings.gradle.kts create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApi.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApi.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApi.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ModelApiResponse.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/User.kt diff --git a/.github/workflows/samples-kotlin-server.yaml b/.github/workflows/samples-kotlin-server.yaml index b98d4c69532a..60724dd8c4db 100644 --- a/.github/workflows/samples-kotlin-server.yaml +++ b/.github/workflows/samples-kotlin-server.yaml @@ -43,6 +43,7 @@ jobs: - samples/server/petstore/kotlin-server/javalin - samples/server/others/kotlin-server/jaxrs-spec - samples/server/others/kotlin-server/jaxrs-spec-array-response + - samples/server/petstore/kotlin-wiremock - samples/server/petstore/kotlin-spring-cloud # comment out due to gradle build failure #- samples/server/petstore/kotlin-spring-default diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java index 1edca06c3f22..2cc0da7026b7 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java @@ -1,6 +1,16 @@ package org.openapitools.codegen.languages; +import org.openapitools.codegen.CodegenConstants; import org.openapitools.codegen.CodegenType; +import org.openapitools.codegen.SupportingFile; +import org.openapitools.codegen.meta.features.GlobalFeature; +import org.openapitools.codegen.meta.features.ParameterFeature; +import org.openapitools.codegen.meta.features.SecurityFeature; +import org.openapitools.codegen.meta.features.WireFormatFeature; + +import java.io.File; +import java.util.EnumSet; +import java.util.List; public class KotlinWiremockServerCodegen extends AbstractKotlinCodegen { @@ -19,10 +29,62 @@ public String getHelp() { return "Generates Kotlin WireMock stubs, requests and responses samples."; } + public KotlinWiremockServerCodegen() { + super(); + + setApiPackage(packageName + ".apis"); + setModelPackage(packageName + ".models"); + } + @Override public void processOpts() { super.processOpts(); - apiTemplateFiles.put("api.mustache", "Stub.kt"); + modifyFeatureSet(features -> features + .securityFeatures(EnumSet.allOf(SecurityFeature.class)) + .excludeWireFormatFeatures( + WireFormatFeature.XML, + WireFormatFeature.PROTOBUF + ) + .excludeGlobalFeatures( + GlobalFeature.XMLStructureDefinitions, + GlobalFeature.Callbacks, + GlobalFeature.LinkObjects + ) + .excludeParameterFeatures( + ParameterFeature.Cookie + ) + ); + + typeMapping.put("array", "kotlin.collections.List"); + + additionalProperties.put(CodegenConstants.API_PACKAGE, apiPackage()); + additionalProperties.put(CodegenConstants.MODEL_PACKAGE, modelPackage()); + + apiTemplateFiles.put("api.mustache", ".kt"); + modelTemplateFiles.put("model.mustache", ".kt"); + + supportingFiles.addAll(List.of( + new SupportingFile("build.gradle.kts.mustache", "", "build.gradle.kts"), + new SupportingFile("settings.gradle.kts.mustache", "", "settings.gradle.kts"), + new SupportingFile("libs.versions.toml.mustache", "gradle", "libs.versions.toml"), + new SupportingFile("gradlew.mustache", "", "gradlew"), + new SupportingFile("gradlew.bat.mustache", "", "gradlew.bat"), + new SupportingFile("gradle-wrapper.properties.mustache", "gradle" + File.separator + "wrapper", "gradle-wrapper.properties"), + new SupportingFile("gradle-wrapper.jar", "gradle" + File.separator + "wrapper", "gradle-wrapper.jar") + ) + ); + } + + @Override + public void postProcess() { + System.out.println("################################################################################"); + System.out.println("# Thanks for using OpenAPI Generator. #"); + System.out.println("# Please consider donation to help us maintain this project \uD83D\uDE4F #"); + System.out.println("# https://opencollective.com/openapi_generator/donate #"); + System.out.println("# #"); + System.out.println("# This generator's contributed by Stefan Koppier (https://github.com/stefankoppier)#"); + System.out.println("################################################################################"); } + } diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache index baf190909a1e..7f1dd2c1ab4a 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache @@ -1,8 +1,62 @@ +package {{apiPackage}} + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import {{modelPackage}}.* + {{#operations}} -class {{classname}}Stubs { +open class {{classname}}Stubs(protected val objectMapper: ObjectMapper) { {{#operation}} - fun {{operationId}} { - TODO() + + fun {{operationId}}({{#pathParams}}{{paramName}}: StringValuePattern, {{/pathParams}}{{#queryParams}}{{paramName}}: StringValuePattern? = null, {{/queryParams}}configurer: MappingBuilder.() -> MappingBuilder = { this }): {{operationIdCamelCase}}StubBuilder = + {{operationIdCamelCase}}StubBuilder({{#lambda.lowercase}}{{httpMethod}}{{/lambda.lowercase}}("{{path}}") + .configurer() + {{#pathParams}} + .withPathParam("{{paramName}}", {{paramName}}) + {{/pathParams}} + {{#queryParams}} + .apply { + {{paramName}}?.let { withQueryParam("{{paramName}}", it) } + } + {{/queryParams}} + ) + + inner class {{operationIdCamelCase}}StubBuilder(private val stub: MappingBuilder) { + {{#responses}} + {{^wildcard}} + + fun respondWith{{code}}( + {{#returnType}} + body: {{{.}}}, + {{/returnType}} + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus({{code}}) + {{#returnType}} + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + {{/returnType}} + ) + {{/wildcard}} + {{/responses}} + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) } {{/operation}} } diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/build.gradle.kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/build.gradle.kts.mustache new file mode 100644 index 000000000000..02ba9002a37f --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/build.gradle.kts.mustache @@ -0,0 +1,15 @@ +group = "{{groupId}}" +version = "{{artifactVersion}}" + +tasks.wrapper { + gradleVersion = "8.7" +} + +plugins { + alias(libs.plugins.kotlin.jvm) +} + +dependencies { + implementation(libs.wiremock) + implementation(libs.jackson.databind) +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/gradle-wrapper.jar b/modules/openapi-generator/src/main/resources/kotlin-wiremock/gradle-wrapper.jar index c1962a79e29d3e0ab67b14947c167a862655af9b..d64cd4917707c1f8861d8cb53dd15194d4248596 100644 GIT binary patch literal 43462 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 literal 62076 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 diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/gradle-wrapper.properties.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/gradle-wrapper.properties.mustache new file mode 100644 index 000000000000..e7646dead063 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/gradle-wrapper.properties.mustache @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/gradlew.bat.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/gradlew.bat.mustache new file mode 100644 index 000000000000..9d0ce634cb11 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/gradlew.bat.mustache @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while +APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path +[ -h "$app_path" ] +do +ls=$( ls -ld "$app_path" ) +link=${ls#*' -> '} +case $link in #( +/*) app_path=$link ;; #( +*) app_path=$APP_HOME$link ;; +esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { +echo "$*" +} >&2 + +die () { +echo +echo "$*" +echo +exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( +CYGWIN* ) cygwin=true ;; #( +Darwin* ) darwin=true ;; #( +MSYS* | MINGW* ) msys=true ;; #( +NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then +if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# IBM's JDK on AIX uses strange locations for the executables +JAVACMD=$JAVA_HOME/jre/sh/java +else +JAVACMD=$JAVA_HOME/bin/java +fi +if [ ! -x "$JAVACMD" ] ; then +die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +else +JAVACMD=java +if ! command -v java >/dev/null 2>&1 +then +die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then +case $MAX_FD in #( +max*) +# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +MAX_FD=$( ulimit -H -n ) || +warn "Could not query maximum file descriptor limit" +esac +case $MAX_FD in #( +'' | soft) :;; #( +*) +# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +ulimit -n "$MAX_FD" || +warn "Could not set maximum file descriptor limit to $MAX_FD" +esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then +APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) +CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + +JAVACMD=$( cygpath --unix "$JAVACMD" ) + +# Now convert the arguments - kludge to limit ourselves to /bin/sh +for arg do +if +case $arg in #( +-*) false ;; # don't mess with options #( +/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath +[ -e "$t" ] ;; #( +*) false ;; +esac +then +arg=$( cygpath --path --ignore --mixed "$arg" ) +fi +# Roll the args list around exactly as many times as the number of +# args, so each arg winds up back in the position where it started, but +# possibly modified. +# +# NB: a `for` loop captures its iteration list before it begins, so +# changing the positional parameters here affects neither the number of +# iterations, nor the values presented in `arg`. +shift # remove old arg +set -- "$@" "$arg" # push replacement arg +done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ +"-Dorg.gradle.appname=$APP_BASE_NAME" \ +-classpath "$CLASSPATH" \ +org.gradle.wrapper.GradleWrapperMain \ +"$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then +die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( +printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | +xargs -n1 | +sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | +tr '\n' ' ' +)" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/gradlew.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/gradlew.mustache new file mode 100644 index 000000000000..9d0ce634cb11 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/gradlew.mustache @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while +APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path +[ -h "$app_path" ] +do +ls=$( ls -ld "$app_path" ) +link=${ls#*' -> '} +case $link in #( +/*) app_path=$link ;; #( +*) app_path=$APP_HOME$link ;; +esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { +echo "$*" +} >&2 + +die () { +echo +echo "$*" +echo +exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( +CYGWIN* ) cygwin=true ;; #( +Darwin* ) darwin=true ;; #( +MSYS* | MINGW* ) msys=true ;; #( +NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then +if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# IBM's JDK on AIX uses strange locations for the executables +JAVACMD=$JAVA_HOME/jre/sh/java +else +JAVACMD=$JAVA_HOME/bin/java +fi +if [ ! -x "$JAVACMD" ] ; then +die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +else +JAVACMD=java +if ! command -v java >/dev/null 2>&1 +then +die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then +case $MAX_FD in #( +max*) +# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +MAX_FD=$( ulimit -H -n ) || +warn "Could not query maximum file descriptor limit" +esac +case $MAX_FD in #( +'' | soft) :;; #( +*) +# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +ulimit -n "$MAX_FD" || +warn "Could not set maximum file descriptor limit to $MAX_FD" +esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then +APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) +CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + +JAVACMD=$( cygpath --unix "$JAVACMD" ) + +# Now convert the arguments - kludge to limit ourselves to /bin/sh +for arg do +if +case $arg in #( +-*) false ;; # don't mess with options #( +/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath +[ -e "$t" ] ;; #( +*) false ;; +esac +then +arg=$( cygpath --path --ignore --mixed "$arg" ) +fi +# Roll the args list around exactly as many times as the number of +# args, so each arg winds up back in the position where it started, but +# possibly modified. +# +# NB: a `for` loop captures its iteration list before it begins, so +# changing the positional parameters here affects neither the number of +# iterations, nor the values presented in `arg`. +shift # remove old arg +set -- "$@" "$arg" # push replacement arg +done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ +"-Dorg.gradle.appname=$APP_BASE_NAME" \ +-classpath "$CLASSPATH" \ +org.gradle.wrapper.GradleWrapperMain \ +"$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then +die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( +printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | +xargs -n1 | +sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | +tr '\n' ' ' +)" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/libs.versions.toml.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/libs.versions.toml.mustache new file mode 100644 index 000000000000..23fdd0ddbc19 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/libs.versions.toml.mustache @@ -0,0 +1,10 @@ +[versions] +kotlin = "1.9.23" +wiremock = "3.5.4" + +[libraries] +wiremock = { module = "org.wiremock:wiremock", version.ref = "wiremock" } +jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", version = "2.17.1" } + +[plugins] +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache new file mode 100644 index 000000000000..7f88b03d2cdb --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache @@ -0,0 +1,17 @@ +@file:Suppress( + "RemoveRedundantQualifierName" +) + +package {{modelPackage}} + +{{#models}} +{{#model}} +{{^isEnum}} +data class {{classname}}( + {{#allVars}} + val {{{name}}}: {{{dataType}}}, + {{/allVars}} +) +{{/isEnum}} +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/settings.gradle.kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/settings.gradle.kts.mustache new file mode 100644 index 000000000000..25e0c476492c --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/settings.gradle.kts.mustache @@ -0,0 +1,7 @@ +rootProject.name = "{{artifactId}}" + +dependencyResolutionManagement { + repositories { + mavenCentral() + } +} \ No newline at end of file diff --git a/samples/server/petstore/kotlin-wiremock/.openapi-generator-ignore b/samples/server/petstore/kotlin-wiremock/.openapi-generator-ignore new file mode 100644 index 000000000000..7484ee590a38 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/server/petstore/kotlin-wiremock/.openapi-generator/FILES b/samples/server/petstore/kotlin-wiremock/.openapi-generator/FILES new file mode 100644 index 000000000000..fb9c57f7dc8e --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/.openapi-generator/FILES @@ -0,0 +1,16 @@ +build.gradle.kts +gradle/libs.versions.toml +gradle/wrapper/gradle-wrapper.jar +gradle/wrapper/gradle-wrapper.properties +gradlew +gradlew.bat +settings.gradle.kts +src/main/kotlin/org/openapitools/apis/PetApi.kt +src/main/kotlin/org/openapitools/apis/StoreApi.kt +src/main/kotlin/org/openapitools/apis/UserApi.kt +src/main/kotlin/org/openapitools/models/Category.kt +src/main/kotlin/org/openapitools/models/ModelApiResponse.kt +src/main/kotlin/org/openapitools/models/Order.kt +src/main/kotlin/org/openapitools/models/Pet.kt +src/main/kotlin/org/openapitools/models/Tag.kt +src/main/kotlin/org/openapitools/models/User.kt diff --git a/samples/server/petstore/kotlin-wiremock/.openapi-generator/VERSION b/samples/server/petstore/kotlin-wiremock/.openapi-generator/VERSION new file mode 100644 index 000000000000..ecb21862b1ee --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.6.0-SNAPSHOT diff --git a/samples/server/petstore/kotlin-wiremock/build.gradle.kts b/samples/server/petstore/kotlin-wiremock/build.gradle.kts new file mode 100644 index 000000000000..ecf4ad85416d --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/build.gradle.kts @@ -0,0 +1,15 @@ +group = "org.openapitools" +version = "1.0.0" + +tasks.wrapper { + gradleVersion = "8.7" +} + +plugins { + alias(libs.plugins.kotlin.jvm) +} + +dependencies { + implementation(libs.wiremock) + implementation(libs.jackson.databind) +} \ No newline at end of file diff --git a/samples/server/petstore/kotlin-wiremock/gradle/libs.versions.toml b/samples/server/petstore/kotlin-wiremock/gradle/libs.versions.toml new file mode 100644 index 000000000000..23fdd0ddbc19 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/gradle/libs.versions.toml @@ -0,0 +1,10 @@ +[versions] +kotlin = "1.9.23" +wiremock = "3.5.4" + +[libraries] +wiremock = { module = "org.wiremock:wiremock", version.ref = "wiremock" } +jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", version = "2.17.1" } + +[plugins] +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } \ No newline at end of file diff --git a/samples/server/petstore/kotlin-wiremock/gradle/wrapper/gradle-wrapper.jar b/samples/server/petstore/kotlin-wiremock/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..d64cd4917707c1f8861d8cb53dd15194d4248596 GIT binary patch literal 43462 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 literal 0 HcmV?d00001 diff --git a/samples/server/petstore/kotlin-wiremock/gradle/wrapper/gradle-wrapper.properties b/samples/server/petstore/kotlin-wiremock/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..e7646dead063 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/samples/server/petstore/kotlin-wiremock/gradlew b/samples/server/petstore/kotlin-wiremock/gradlew new file mode 100644 index 000000000000..9d0ce634cb11 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while +APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path +[ -h "$app_path" ] +do +ls=$( ls -ld "$app_path" ) +link=${ls#*' -> '} +case $link in #( +/*) app_path=$link ;; #( +*) app_path=$APP_HOME$link ;; +esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { +echo "$*" +} >&2 + +die () { +echo +echo "$*" +echo +exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( +CYGWIN* ) cygwin=true ;; #( +Darwin* ) darwin=true ;; #( +MSYS* | MINGW* ) msys=true ;; #( +NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then +if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# IBM's JDK on AIX uses strange locations for the executables +JAVACMD=$JAVA_HOME/jre/sh/java +else +JAVACMD=$JAVA_HOME/bin/java +fi +if [ ! -x "$JAVACMD" ] ; then +die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +else +JAVACMD=java +if ! command -v java >/dev/null 2>&1 +then +die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then +case $MAX_FD in #( +max*) +# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +MAX_FD=$( ulimit -H -n ) || +warn "Could not query maximum file descriptor limit" +esac +case $MAX_FD in #( +'' | soft) :;; #( +*) +# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +ulimit -n "$MAX_FD" || +warn "Could not set maximum file descriptor limit to $MAX_FD" +esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then +APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) +CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + +JAVACMD=$( cygpath --unix "$JAVACMD" ) + +# Now convert the arguments - kludge to limit ourselves to /bin/sh +for arg do +if +case $arg in #( +-*) false ;; # don't mess with options #( +/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath +[ -e "$t" ] ;; #( +*) false ;; +esac +then +arg=$( cygpath --path --ignore --mixed "$arg" ) +fi +# Roll the args list around exactly as many times as the number of +# args, so each arg winds up back in the position where it started, but +# possibly modified. +# +# NB: a `for` loop captures its iteration list before it begins, so +# changing the positional parameters here affects neither the number of +# iterations, nor the values presented in `arg`. +shift # remove old arg +set -- "$@" "$arg" # push replacement arg +done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ +"-Dorg.gradle.appname=$APP_BASE_NAME" \ +-classpath "$CLASSPATH" \ +org.gradle.wrapper.GradleWrapperMain \ +"$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then +die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( +printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | +xargs -n1 | +sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | +tr '\n' ' ' +)" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/samples/server/petstore/kotlin-wiremock/gradlew.bat b/samples/server/petstore/kotlin-wiremock/gradlew.bat new file mode 100644 index 000000000000..9d0ce634cb11 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/gradlew.bat @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while +APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path +[ -h "$app_path" ] +do +ls=$( ls -ld "$app_path" ) +link=${ls#*' -> '} +case $link in #( +/*) app_path=$link ;; #( +*) app_path=$APP_HOME$link ;; +esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { +echo "$*" +} >&2 + +die () { +echo +echo "$*" +echo +exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( +CYGWIN* ) cygwin=true ;; #( +Darwin* ) darwin=true ;; #( +MSYS* | MINGW* ) msys=true ;; #( +NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then +if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# IBM's JDK on AIX uses strange locations for the executables +JAVACMD=$JAVA_HOME/jre/sh/java +else +JAVACMD=$JAVA_HOME/bin/java +fi +if [ ! -x "$JAVACMD" ] ; then +die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +else +JAVACMD=java +if ! command -v java >/dev/null 2>&1 +then +die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then +case $MAX_FD in #( +max*) +# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +MAX_FD=$( ulimit -H -n ) || +warn "Could not query maximum file descriptor limit" +esac +case $MAX_FD in #( +'' | soft) :;; #( +*) +# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +ulimit -n "$MAX_FD" || +warn "Could not set maximum file descriptor limit to $MAX_FD" +esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then +APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) +CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + +JAVACMD=$( cygpath --unix "$JAVACMD" ) + +# Now convert the arguments - kludge to limit ourselves to /bin/sh +for arg do +if +case $arg in #( +-*) false ;; # don't mess with options #( +/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath +[ -e "$t" ] ;; #( +*) false ;; +esac +then +arg=$( cygpath --path --ignore --mixed "$arg" ) +fi +# Roll the args list around exactly as many times as the number of +# args, so each arg winds up back in the position where it started, but +# possibly modified. +# +# NB: a `for` loop captures its iteration list before it begins, so +# changing the positional parameters here affects neither the number of +# iterations, nor the values presented in `arg`. +shift # remove old arg +set -- "$@" "$arg" # push replacement arg +done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ +"-Dorg.gradle.appname=$APP_BASE_NAME" \ +-classpath "$CLASSPATH" \ +org.gradle.wrapper.GradleWrapperMain \ +"$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then +die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( +printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | +xargs -n1 | +sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | +tr '\n' ' ' +)" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/samples/server/petstore/kotlin-wiremock/settings.gradle.kts b/samples/server/petstore/kotlin-wiremock/settings.gradle.kts new file mode 100644 index 000000000000..2953b690dda4 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/settings.gradle.kts @@ -0,0 +1,7 @@ +rootProject.name = "petstore-kotlin-wiremock" + +dependencyResolutionManagement { + repositories { + mavenCentral() + } +} \ No newline at end of file diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApi.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApi.kt new file mode 100644 index 000000000000..7f3c22d96f3a --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApi.kt @@ -0,0 +1,359 @@ +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class PetApiStubs(protected val objectMapper: ObjectMapper) { + + fun addPet(configurer: MappingBuilder.() -> MappingBuilder = { this }): AddPetStubBuilder = + AddPetStubBuilder(post("/pet") + .configurer() + ) + + inner class AddPetStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith405( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(405) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun deletePet(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeletePetStubBuilder = + DeletePetStubBuilder(delete("/pet/{petId}") + .configurer() + .withPathParam("petId", petId) + ) + + inner class DeletePetStubBuilder(private val stub: MappingBuilder) { + + fun respondWith400( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(400) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun findPetsByStatus(status: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): FindPetsByStatusStubBuilder = + FindPetsByStatusStubBuilder(get("/pet/findByStatus") + .configurer() + .apply { + status?.let { withQueryParam("status", it) } + } + ) + + inner class FindPetsByStatusStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.collections.List, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith400( + body: kotlin.collections.List, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun findPetsByTags(tags: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): FindPetsByTagsStubBuilder = + FindPetsByTagsStubBuilder(get("/pet/findByTags") + .configurer() + .apply { + tags?.let { withQueryParam("tags", it) } + } + ) + + inner class FindPetsByTagsStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.collections.List, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith400( + body: kotlin.collections.List, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun getPetById(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetPetByIdStubBuilder = + GetPetByIdStubBuilder(get("/pet/{petId}") + .configurer() + .withPathParam("petId", petId) + ) + + inner class GetPetByIdStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith400( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith404( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(404) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun updatePet(configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdatePetStubBuilder = + UpdatePetStubBuilder(put("/pet") + .configurer() + ) + + inner class UpdatePetStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith400( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith404( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(404) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith405( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(405) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun updatePetWithForm(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdatePetWithFormStubBuilder = + UpdatePetWithFormStubBuilder(post("/pet/{petId}") + .configurer() + .withPathParam("petId", petId) + ) + + inner class UpdatePetWithFormStubBuilder(private val stub: MappingBuilder) { + + fun respondWith405( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(405) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun uploadFile(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UploadFileStubBuilder = + UploadFileStubBuilder(post("/pet/{petId}/uploadImage") + .configurer() + .withPathParam("petId", petId) + ) + + inner class UploadFileStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: ModelApiResponse, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } +} diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApi.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApi.kt new file mode 100644 index 000000000000..4979bafdb8d0 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApi.kt @@ -0,0 +1,179 @@ +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class StoreApiStubs(protected val objectMapper: ObjectMapper) { + + fun deleteOrder(orderId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeleteOrderStubBuilder = + DeleteOrderStubBuilder(delete("/store/order/{orderId}") + .configurer() + .withPathParam("orderId", orderId) + ) + + inner class DeleteOrderStubBuilder(private val stub: MappingBuilder) { + + fun respondWith400( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(400) + ) + + fun respondWith404( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(404) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun getInventory(configurer: MappingBuilder.() -> MappingBuilder = { this }): GetInventoryStubBuilder = + GetInventoryStubBuilder(get("/store/inventory") + .configurer() + ) + + inner class GetInventoryStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.collections.Map, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun getOrderById(orderId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetOrderByIdStubBuilder = + GetOrderByIdStubBuilder(get("/store/order/{orderId}") + .configurer() + .withPathParam("orderId", orderId) + ) + + inner class GetOrderByIdStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: Order, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith400( + body: Order, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith404( + body: Order, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(404) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun placeOrder(configurer: MappingBuilder.() -> MappingBuilder = { this }): PlaceOrderStubBuilder = + PlaceOrderStubBuilder(post("/store/order") + .configurer() + ) + + inner class PlaceOrderStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: Order, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith400( + body: Order, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } +} diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApi.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApi.kt new file mode 100644 index 000000000000..affb9c3dc6ab --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApi.kt @@ -0,0 +1,275 @@ +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class UserApiStubs(protected val objectMapper: ObjectMapper) { + + fun createUser(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUserStubBuilder = + CreateUserStubBuilder(post("/user") + .configurer() + ) + + inner class CreateUserStubBuilder(private val stub: MappingBuilder) { + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun createUsersWithArrayInput(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUsersWithArrayInputStubBuilder = + CreateUsersWithArrayInputStubBuilder(post("/user/createWithArray") + .configurer() + ) + + inner class CreateUsersWithArrayInputStubBuilder(private val stub: MappingBuilder) { + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun createUsersWithListInput(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUsersWithListInputStubBuilder = + CreateUsersWithListInputStubBuilder(post("/user/createWithList") + .configurer() + ) + + inner class CreateUsersWithListInputStubBuilder(private val stub: MappingBuilder) { + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun deleteUser(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeleteUserStubBuilder = + DeleteUserStubBuilder(delete("/user/{username}") + .configurer() + .withPathParam("username", username) + ) + + inner class DeleteUserStubBuilder(private val stub: MappingBuilder) { + + fun respondWith400( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(400) + ) + + fun respondWith404( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(404) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun getUserByName(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetUserByNameStubBuilder = + GetUserByNameStubBuilder(get("/user/{username}") + .configurer() + .withPathParam("username", username) + ) + + inner class GetUserByNameStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: User, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith400( + body: User, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith404( + body: User, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(404) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun loginUser(username: StringValuePattern? = null, password: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): LoginUserStubBuilder = + LoginUserStubBuilder(get("/user/login") + .configurer() + .apply { + username?.let { withQueryParam("username", it) } + } + .apply { + password?.let { withQueryParam("password", it) } + } + ) + + inner class LoginUserStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith400( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun logoutUser(configurer: MappingBuilder.() -> MappingBuilder = { this }): LogoutUserStubBuilder = + LogoutUserStubBuilder(get("/user/logout") + .configurer() + ) + + inner class LogoutUserStubBuilder(private val stub: MappingBuilder) { + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } + + fun updateUser(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdateUserStubBuilder = + UpdateUserStubBuilder(put("/user/{username}") + .configurer() + .withPathParam("username", username) + ) + + inner class UpdateUserStubBuilder(private val stub: MappingBuilder) { + + fun respondWith400( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(400) + ) + + fun respondWith404( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(404) + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .configurer() + .withStatus(code) + .apply { + body?.let { withBody(objectMapper.writeValueAsString(it)) } + } + ) + } +} diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt new file mode 100644 index 000000000000..7b69a0efe7f5 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt @@ -0,0 +1,10 @@ +@file:Suppress( + "RemoveRedundantQualifierName" +) + +package org.openapitools.models + +data class Category( + val id: kotlin.Long, + val name: kotlin.String, +) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ModelApiResponse.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ModelApiResponse.kt new file mode 100644 index 000000000000..01d6c6e40ac1 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ModelApiResponse.kt @@ -0,0 +1,11 @@ +@file:Suppress( + "RemoveRedundantQualifierName" +) + +package org.openapitools.models + +data class ModelApiResponse( + val code: kotlin.Int, + val type: kotlin.String, + val message: kotlin.String, +) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt new file mode 100644 index 000000000000..f21477b9317f --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt @@ -0,0 +1,14 @@ +@file:Suppress( + "RemoveRedundantQualifierName" +) + +package org.openapitools.models + +data class Order( + val id: kotlin.Long, + val petId: kotlin.Long, + val quantity: kotlin.Int, + val shipDate: java.time.OffsetDateTime, + val status: kotlin.String, + val complete: kotlin.Boolean, +) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt new file mode 100644 index 000000000000..e97afc72c24c --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt @@ -0,0 +1,14 @@ +@file:Suppress( + "RemoveRedundantQualifierName" +) + +package org.openapitools.models + +data class Pet( + val name: kotlin.String, + val photoUrls: kotlin.collections.List, + val id: kotlin.Long, + val category: Category, + val tags: kotlin.collections.List, + val status: kotlin.String, +) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt new file mode 100644 index 000000000000..244d2ad50648 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt @@ -0,0 +1,10 @@ +@file:Suppress( + "RemoveRedundantQualifierName" +) + +package org.openapitools.models + +data class Tag( + val id: kotlin.Long, + val name: kotlin.String, +) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/User.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/User.kt new file mode 100644 index 000000000000..be1e0aea3b13 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/User.kt @@ -0,0 +1,16 @@ +@file:Suppress( + "RemoveRedundantQualifierName" +) + +package org.openapitools.models + +data class User( + val id: kotlin.Long, + val username: kotlin.String, + val firstName: kotlin.String, + val lastName: kotlin.String, + val email: kotlin.String, + val password: kotlin.String, + val phone: kotlin.String, + val userStatus: kotlin.Int, +) From 6626ec16ea2ce603fc1b5bb4e60fe2a3e1d01e80 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Tue, 14 May 2024 08:00:21 +0200 Subject: [PATCH 05/22] [kotlin-wiremock] Small typo --- .../openapitools/codegen/languages/AbstractKotlinCodegen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java index 9485bb2dd7ee..599236a2b820 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java @@ -767,7 +767,7 @@ public String toOperationId(String operationId) { // operationId starts with a number if (operationId.matches("^\\d.*")) { - LOGGER.warn(operationId + " (starting with a number) cannot be used as method sname. Renamed to " + camelize("call_" + operationId), LOWERCASE_FIRST_LETTER); + LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + camelize("call_" + operationId), LOWERCASE_FIRST_LETTER); operationId = camelize("call_" + operationId, LOWERCASE_FIRST_LETTER); } From 1c3332dc86686ba3db5fd217ffdd9a0879a0b94a Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Tue, 14 May 2024 08:00:36 +0200 Subject: [PATCH 06/22] [kotlin-wiremock] Added echo-api test --- bin/configs/kotlin-wiremock-echo-api.yaml | 6 + .../KotlinWiremockServerCodegen.java | 32 ++- .../resources/kotlin-wiremock/api.mustache | 20 +- .../resources/kotlin-wiremock/model.mustache | 14 +- .../kotlin-wiremock/.openapi-generator-ignore | 23 ++ .../kotlin-wiremock/.openapi-generator/FILES | 22 ++ .../.openapi-generator/VERSION | 1 + .../echo_api/kotlin-wiremock/build.gradle.kts | 15 + .../kotlin-wiremock/gradle/libs.versions.toml | 10 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43462 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + .../server/echo_api/kotlin-wiremock/gradlew | 249 +++++++++++++++++ .../echo_api/kotlin-wiremock/gradlew.bat | 249 +++++++++++++++++ .../kotlin-wiremock/settings.gradle.kts | 7 + .../kotlin/org/openapitools/apis/AuthApi.kt | 77 ++++++ .../kotlin/org/openapitools/apis/BodyApi.kt | 257 ++++++++++++++++++ .../kotlin/org/openapitools/apis/FormApi.kt | 77 ++++++ .../kotlin/org/openapitools/apis/HeaderApi.kt | 47 ++++ .../kotlin/org/openapitools/apis/PathApi.kt | 51 ++++ .../kotlin/org/openapitools/apis/QueryApi.kt | 208 ++++++++++++++ .../kotlin/org/openapitools/models/Bird.kt | 11 + .../org/openapitools/models/Category.kt | 11 + .../org/openapitools/models/DefaultValue.kt | 17 ++ .../models/NumberPropertiesOnly.kt | 12 + .../kotlin/org/openapitools/models/Pet.kt | 15 + .../kotlin/org/openapitools/models/Query.kt | 11 + .../org/openapitools/models/StringEnumRef.kt | 12 + .../kotlin/org/openapitools/models/Tag.kt | 11 + ...lodeTrueArrayStringQueryObjectParameter.kt | 10 + .../kotlin/org/openapitools/apis/PetApi.kt | 102 +++---- .../kotlin/org/openapitools/apis/StoreApi.kt | 50 ++-- .../kotlin/org/openapitools/apis/UserApi.kt | 86 +++--- .../org/openapitools/models/Category.kt | 7 +- .../openapitools/models/ModelApiResponse.kt | 9 +- .../kotlin/org/openapitools/models/Order.kt | 15 +- .../kotlin/org/openapitools/models/Pet.kt | 11 +- .../kotlin/org/openapitools/models/Tag.kt | 7 +- .../kotlin/org/openapitools/models/User.kt | 19 +- 38 files changed, 1599 insertions(+), 189 deletions(-) create mode 100644 bin/configs/kotlin-wiremock-echo-api.yaml create mode 100644 samples/server/echo_api/kotlin-wiremock/.openapi-generator-ignore create mode 100644 samples/server/echo_api/kotlin-wiremock/.openapi-generator/FILES create mode 100644 samples/server/echo_api/kotlin-wiremock/.openapi-generator/VERSION create mode 100644 samples/server/echo_api/kotlin-wiremock/build.gradle.kts create mode 100644 samples/server/echo_api/kotlin-wiremock/gradle/libs.versions.toml create mode 100644 samples/server/echo_api/kotlin-wiremock/gradle/wrapper/gradle-wrapper.jar create mode 100644 samples/server/echo_api/kotlin-wiremock/gradle/wrapper/gradle-wrapper.properties create mode 100644 samples/server/echo_api/kotlin-wiremock/gradlew create mode 100644 samples/server/echo_api/kotlin-wiremock/gradlew.bat create mode 100644 samples/server/echo_api/kotlin-wiremock/settings.gradle.kts create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApi.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApi.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApi.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApi.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApi.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApi.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Bird.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/DefaultValue.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/NumberPropertiesOnly.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Query.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/StringEnumRef.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter.kt diff --git a/bin/configs/kotlin-wiremock-echo-api.yaml b/bin/configs/kotlin-wiremock-echo-api.yaml new file mode 100644 index 000000000000..585e308e5037 --- /dev/null +++ b/bin/configs/kotlin-wiremock-echo-api.yaml @@ -0,0 +1,6 @@ +generatorName: kotlin-wiremock +outputDir: samples/server/echo_api/kotlin-wiremock +inputSpec: modules/openapi-generator/src/test/resources/3_0/kotlin/echo_api.yaml +templateDir: modules/openapi-generator/src/main/resources/kotlin-wiremock +additionalProperties: + artifactId: echo-api-kotlin-wiremock diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java index 2cc0da7026b7..848cbbc9c55c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java @@ -3,6 +3,8 @@ import org.openapitools.codegen.CodegenConstants; import org.openapitools.codegen.CodegenType; import org.openapitools.codegen.SupportingFile; +import org.openapitools.codegen.meta.GeneratorMetadata; +import org.openapitools.codegen.meta.Stability; import org.openapitools.codegen.meta.features.GlobalFeature; import org.openapitools.codegen.meta.features.ParameterFeature; import org.openapitools.codegen.meta.features.SecurityFeature; @@ -32,6 +34,10 @@ public String getHelp() { public KotlinWiremockServerCodegen() { super(); + generatorMetadata = GeneratorMetadata.newBuilder(generatorMetadata) + .stability(Stability.BETA) + .build(); + setApiPackage(packageName + ".apis"); setModelPackage(packageName + ".models"); } @@ -41,19 +47,19 @@ public void processOpts() { super.processOpts(); modifyFeatureSet(features -> features - .securityFeatures(EnumSet.allOf(SecurityFeature.class)) - .excludeWireFormatFeatures( - WireFormatFeature.XML, - WireFormatFeature.PROTOBUF - ) - .excludeGlobalFeatures( - GlobalFeature.XMLStructureDefinitions, - GlobalFeature.Callbacks, - GlobalFeature.LinkObjects - ) - .excludeParameterFeatures( - ParameterFeature.Cookie - ) + .securityFeatures(EnumSet.allOf(SecurityFeature.class)) + .excludeWireFormatFeatures( + WireFormatFeature.XML, + WireFormatFeature.PROTOBUF + ) + .excludeGlobalFeatures( + GlobalFeature.XMLStructureDefinitions, + GlobalFeature.Callbacks, + GlobalFeature.LinkObjects + ) + .excludeParameterFeatures( + ParameterFeature.Cookie + ) ); typeMapping.put("array", "kotlin.collections.List"); diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache index 7f1dd2c1ab4a..75c1cf9afaf5 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache @@ -1,3 +1,9 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + package {{apiPackage}} import com.fasterxml.jackson.databind.ObjectMapper @@ -13,15 +19,13 @@ open class {{classname}}Stubs(protected val objectMapper: ObjectMapper) { fun {{operationId}}({{#pathParams}}{{paramName}}: StringValuePattern, {{/pathParams}}{{#queryParams}}{{paramName}}: StringValuePattern? = null, {{/queryParams}}configurer: MappingBuilder.() -> MappingBuilder = { this }): {{operationIdCamelCase}}StubBuilder = {{operationIdCamelCase}}StubBuilder({{#lambda.lowercase}}{{httpMethod}}{{/lambda.lowercase}}("{{path}}") - .configurer() {{#pathParams}} .withPathParam("{{paramName}}", {{paramName}}) {{/pathParams}} {{#queryParams}} - .apply { - {{paramName}}?.let { withQueryParam("{{paramName}}", it) } - } + .apply { {{paramName}}?.let { withQueryParam("{{paramName}}", it) } } {{/queryParams}} + .configurer() ) inner class {{operationIdCamelCase}}StubBuilder(private val stub: MappingBuilder) { @@ -35,12 +39,12 @@ open class {{classname}}Stubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus({{code}}) {{#returnType}} .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) {{/returnType}} + .configurer() ) {{/wildcard}} {{/responses}} @@ -51,11 +55,9 @@ open class {{classname}}Stubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } {{/operation}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache index 7f88b03d2cdb..52d1edf056f5 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache @@ -1,15 +1,25 @@ @file:Suppress( - "RemoveRedundantQualifierName" + "RemoveRedundantQualifierName", + "unused", ) package {{modelPackage}} {{#models}} {{#model}} +{{#isEnum}} +enum class {{classname}} { + {{#allowableValues}} + {{#enumVars}} + {{&name}}, + {{/enumVars}} + {{/allowableValues}} +} +{{/isEnum}} {{^isEnum}} data class {{classname}}( {{#allVars}} - val {{{name}}}: {{{dataType}}}, + val {{{name}}}: {{{dataType}}}{{^required}}?{{/required}}, {{/allVars}} ) {{/isEnum}} diff --git a/samples/server/echo_api/kotlin-wiremock/.openapi-generator-ignore b/samples/server/echo_api/kotlin-wiremock/.openapi-generator-ignore new file mode 100644 index 000000000000..7484ee590a38 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/server/echo_api/kotlin-wiremock/.openapi-generator/FILES b/samples/server/echo_api/kotlin-wiremock/.openapi-generator/FILES new file mode 100644 index 000000000000..f8f83074d139 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/.openapi-generator/FILES @@ -0,0 +1,22 @@ +build.gradle.kts +gradle/libs.versions.toml +gradle/wrapper/gradle-wrapper.jar +gradle/wrapper/gradle-wrapper.properties +gradlew +gradlew.bat +settings.gradle.kts +src/main/kotlin/org/openapitools/apis/AuthApi.kt +src/main/kotlin/org/openapitools/apis/BodyApi.kt +src/main/kotlin/org/openapitools/apis/FormApi.kt +src/main/kotlin/org/openapitools/apis/HeaderApi.kt +src/main/kotlin/org/openapitools/apis/PathApi.kt +src/main/kotlin/org/openapitools/apis/QueryApi.kt +src/main/kotlin/org/openapitools/models/Bird.kt +src/main/kotlin/org/openapitools/models/Category.kt +src/main/kotlin/org/openapitools/models/DefaultValue.kt +src/main/kotlin/org/openapitools/models/NumberPropertiesOnly.kt +src/main/kotlin/org/openapitools/models/Pet.kt +src/main/kotlin/org/openapitools/models/Query.kt +src/main/kotlin/org/openapitools/models/StringEnumRef.kt +src/main/kotlin/org/openapitools/models/Tag.kt +src/main/kotlin/org/openapitools/models/TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter.kt diff --git a/samples/server/echo_api/kotlin-wiremock/.openapi-generator/VERSION b/samples/server/echo_api/kotlin-wiremock/.openapi-generator/VERSION new file mode 100644 index 000000000000..ecb21862b1ee --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.6.0-SNAPSHOT diff --git a/samples/server/echo_api/kotlin-wiremock/build.gradle.kts b/samples/server/echo_api/kotlin-wiremock/build.gradle.kts new file mode 100644 index 000000000000..ecf4ad85416d --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/build.gradle.kts @@ -0,0 +1,15 @@ +group = "org.openapitools" +version = "1.0.0" + +tasks.wrapper { + gradleVersion = "8.7" +} + +plugins { + alias(libs.plugins.kotlin.jvm) +} + +dependencies { + implementation(libs.wiremock) + implementation(libs.jackson.databind) +} \ No newline at end of file diff --git a/samples/server/echo_api/kotlin-wiremock/gradle/libs.versions.toml b/samples/server/echo_api/kotlin-wiremock/gradle/libs.versions.toml new file mode 100644 index 000000000000..23fdd0ddbc19 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/gradle/libs.versions.toml @@ -0,0 +1,10 @@ +[versions] +kotlin = "1.9.23" +wiremock = "3.5.4" + +[libraries] +wiremock = { module = "org.wiremock:wiremock", version.ref = "wiremock" } +jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", version = "2.17.1" } + +[plugins] +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } \ No newline at end of file diff --git a/samples/server/echo_api/kotlin-wiremock/gradle/wrapper/gradle-wrapper.jar b/samples/server/echo_api/kotlin-wiremock/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..d64cd4917707c1f8861d8cb53dd15194d4248596 GIT binary patch literal 43462 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 literal 0 HcmV?d00001 diff --git a/samples/server/echo_api/kotlin-wiremock/gradle/wrapper/gradle-wrapper.properties b/samples/server/echo_api/kotlin-wiremock/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..e7646dead063 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/samples/server/echo_api/kotlin-wiremock/gradlew b/samples/server/echo_api/kotlin-wiremock/gradlew new file mode 100644 index 000000000000..9d0ce634cb11 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while +APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path +[ -h "$app_path" ] +do +ls=$( ls -ld "$app_path" ) +link=${ls#*' -> '} +case $link in #( +/*) app_path=$link ;; #( +*) app_path=$APP_HOME$link ;; +esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { +echo "$*" +} >&2 + +die () { +echo +echo "$*" +echo +exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( +CYGWIN* ) cygwin=true ;; #( +Darwin* ) darwin=true ;; #( +MSYS* | MINGW* ) msys=true ;; #( +NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then +if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# IBM's JDK on AIX uses strange locations for the executables +JAVACMD=$JAVA_HOME/jre/sh/java +else +JAVACMD=$JAVA_HOME/bin/java +fi +if [ ! -x "$JAVACMD" ] ; then +die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +else +JAVACMD=java +if ! command -v java >/dev/null 2>&1 +then +die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then +case $MAX_FD in #( +max*) +# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +MAX_FD=$( ulimit -H -n ) || +warn "Could not query maximum file descriptor limit" +esac +case $MAX_FD in #( +'' | soft) :;; #( +*) +# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +ulimit -n "$MAX_FD" || +warn "Could not set maximum file descriptor limit to $MAX_FD" +esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then +APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) +CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + +JAVACMD=$( cygpath --unix "$JAVACMD" ) + +# Now convert the arguments - kludge to limit ourselves to /bin/sh +for arg do +if +case $arg in #( +-*) false ;; # don't mess with options #( +/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath +[ -e "$t" ] ;; #( +*) false ;; +esac +then +arg=$( cygpath --path --ignore --mixed "$arg" ) +fi +# Roll the args list around exactly as many times as the number of +# args, so each arg winds up back in the position where it started, but +# possibly modified. +# +# NB: a `for` loop captures its iteration list before it begins, so +# changing the positional parameters here affects neither the number of +# iterations, nor the values presented in `arg`. +shift # remove old arg +set -- "$@" "$arg" # push replacement arg +done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ +"-Dorg.gradle.appname=$APP_BASE_NAME" \ +-classpath "$CLASSPATH" \ +org.gradle.wrapper.GradleWrapperMain \ +"$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then +die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( +printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | +xargs -n1 | +sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | +tr '\n' ' ' +)" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/samples/server/echo_api/kotlin-wiremock/gradlew.bat b/samples/server/echo_api/kotlin-wiremock/gradlew.bat new file mode 100644 index 000000000000..9d0ce634cb11 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/gradlew.bat @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while +APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path +[ -h "$app_path" ] +do +ls=$( ls -ld "$app_path" ) +link=${ls#*' -> '} +case $link in #( +/*) app_path=$link ;; #( +*) app_path=$APP_HOME$link ;; +esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { +echo "$*" +} >&2 + +die () { +echo +echo "$*" +echo +exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( +CYGWIN* ) cygwin=true ;; #( +Darwin* ) darwin=true ;; #( +MSYS* | MINGW* ) msys=true ;; #( +NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then +if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# IBM's JDK on AIX uses strange locations for the executables +JAVACMD=$JAVA_HOME/jre/sh/java +else +JAVACMD=$JAVA_HOME/bin/java +fi +if [ ! -x "$JAVACMD" ] ; then +die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +else +JAVACMD=java +if ! command -v java >/dev/null 2>&1 +then +die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then +case $MAX_FD in #( +max*) +# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +MAX_FD=$( ulimit -H -n ) || +warn "Could not query maximum file descriptor limit" +esac +case $MAX_FD in #( +'' | soft) :;; #( +*) +# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +ulimit -n "$MAX_FD" || +warn "Could not set maximum file descriptor limit to $MAX_FD" +esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then +APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) +CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + +JAVACMD=$( cygpath --unix "$JAVACMD" ) + +# Now convert the arguments - kludge to limit ourselves to /bin/sh +for arg do +if +case $arg in #( +-*) false ;; # don't mess with options #( +/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath +[ -e "$t" ] ;; #( +*) false ;; +esac +then +arg=$( cygpath --path --ignore --mixed "$arg" ) +fi +# Roll the args list around exactly as many times as the number of +# args, so each arg winds up back in the position where it started, but +# possibly modified. +# +# NB: a `for` loop captures its iteration list before it begins, so +# changing the positional parameters here affects neither the number of +# iterations, nor the values presented in `arg`. +shift # remove old arg +set -- "$@" "$arg" # push replacement arg +done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ +"-Dorg.gradle.appname=$APP_BASE_NAME" \ +-classpath "$CLASSPATH" \ +org.gradle.wrapper.GradleWrapperMain \ +"$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then +die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( +printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | +xargs -n1 | +sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | +tr '\n' ' ' +)" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/samples/server/echo_api/kotlin-wiremock/settings.gradle.kts b/samples/server/echo_api/kotlin-wiremock/settings.gradle.kts new file mode 100644 index 000000000000..c19bbc6e52fd --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/settings.gradle.kts @@ -0,0 +1,7 @@ +rootProject.name = "echo-api-kotlin-wiremock" + +dependencyResolutionManagement { + repositories { + mavenCentral() + } +} \ No newline at end of file diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApi.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApi.kt new file mode 100644 index 000000000000..ea4504183875 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApi.kt @@ -0,0 +1,77 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class AuthApiStubs(protected val objectMapper: ObjectMapper) { + + fun testAuthHttpBasic(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestAuthHttpBasicStubBuilder = + TestAuthHttpBasicStubBuilder(post("/auth/http/basic") + .configurer() + ) + + inner class TestAuthHttpBasicStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testAuthHttpBearer(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestAuthHttpBearerStubBuilder = + TestAuthHttpBearerStubBuilder(post("/auth/http/bearer") + .configurer() + ) + + inner class TestAuthHttpBearerStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } +} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApi.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApi.kt new file mode 100644 index 000000000000..28aceee3dbdb --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApi.kt @@ -0,0 +1,257 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class BodyApiStubs(protected val objectMapper: ObjectMapper) { + + fun testBinaryGif(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBinaryGifStubBuilder = + TestBinaryGifStubBuilder(post("/binary/gif") + .configurer() + ) + + inner class TestBinaryGifStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: java.io.File, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testBodyApplicationOctetstreamBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyApplicationOctetstreamBinaryStubBuilder = + TestBodyApplicationOctetstreamBinaryStubBuilder(post("/body/application/octetstream/binary") + .configurer() + ) + + inner class TestBodyApplicationOctetstreamBinaryStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testBodyMultipartFormdataArrayOfBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyMultipartFormdataArrayOfBinaryStubBuilder = + TestBodyMultipartFormdataArrayOfBinaryStubBuilder(post("/body/application/octetstream/array_of_binary") + .configurer() + ) + + inner class TestBodyMultipartFormdataArrayOfBinaryStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testBodyMultipartFormdataSingleBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyMultipartFormdataSingleBinaryStubBuilder = + TestBodyMultipartFormdataSingleBinaryStubBuilder(post("/body/application/octetstream/single_binary") + .configurer() + ) + + inner class TestBodyMultipartFormdataSingleBinaryStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testEchoBodyFreeFormObjectResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyFreeFormObjectResponseStringStubBuilder = + TestEchoBodyFreeFormObjectResponseStringStubBuilder(post("/echo/body/FreeFormObject/response_string") + .configurer() + ) + + inner class TestEchoBodyFreeFormObjectResponseStringStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testEchoBodyPet(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyPetStubBuilder = + TestEchoBodyPetStubBuilder(post("/echo/body/Pet") + .configurer() + ) + + inner class TestEchoBodyPetStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testEchoBodyPetResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyPetResponseStringStubBuilder = + TestEchoBodyPetResponseStringStubBuilder(post("/echo/body/Pet/response_string") + .configurer() + ) + + inner class TestEchoBodyPetResponseStringStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testEchoBodyTagResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyTagResponseStringStubBuilder = + TestEchoBodyTagResponseStringStubBuilder(post("/echo/body/Tag/response_string") + .configurer() + ) + + inner class TestEchoBodyTagResponseStringStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } +} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApi.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApi.kt new file mode 100644 index 000000000000..236156b37a5b --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApi.kt @@ -0,0 +1,77 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class FormApiStubs(protected val objectMapper: ObjectMapper) { + + fun testFormIntegerBooleanString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestFormIntegerBooleanStringStubBuilder = + TestFormIntegerBooleanStringStubBuilder(post("/form/integer/boolean/string") + .configurer() + ) + + inner class TestFormIntegerBooleanStringStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testFormOneof(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestFormOneofStubBuilder = + TestFormOneofStubBuilder(post("/form/oneof") + .configurer() + ) + + inner class TestFormOneofStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } +} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApi.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApi.kt new file mode 100644 index 000000000000..7c9ef5764dde --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApi.kt @@ -0,0 +1,47 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class HeaderApiStubs(protected val objectMapper: ObjectMapper) { + + fun testHeaderIntegerBooleanStringEnums(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestHeaderIntegerBooleanStringEnumsStubBuilder = + TestHeaderIntegerBooleanStringEnumsStubBuilder(get("/header/integer/boolean/string/enums") + .configurer() + ) + + inner class TestHeaderIntegerBooleanStringEnumsStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } +} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApi.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApi.kt new file mode 100644 index 000000000000..904677082f2e --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApi.kt @@ -0,0 +1,51 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class PathApiStubs(protected val objectMapper: ObjectMapper) { + + fun testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath(pathString: StringValuePattern, pathInteger: StringValuePattern, enumNonrefStringPath: StringValuePattern, enumRefStringPath: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder = + TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder(get("/path/string/{path_string}/integer/{path_integer}/{enum_nonref_string_path}/{enum_ref_string_path}") + .withPathParam("pathString", pathString) + .withPathParam("pathInteger", pathInteger) + .withPathParam("enumNonrefStringPath", enumNonrefStringPath) + .withPathParam("enumRefStringPath", enumRefStringPath) + .configurer() + ) + + inner class TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } +} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApi.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApi.kt new file mode 100644 index 000000000000..66f1bfb4b9c4 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApi.kt @@ -0,0 +1,208 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class QueryApiStubs(protected val objectMapper: ObjectMapper) { + + fun testEnumRefString(enumNonrefStringQuery: StringValuePattern? = null, enumRefStringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEnumRefStringStubBuilder = + TestEnumRefStringStubBuilder(get("/query/enum_ref_string") + .apply { enumNonrefStringQuery?.let { withQueryParam("enumNonrefStringQuery", it) } } + .apply { enumRefStringQuery?.let { withQueryParam("enumRefStringQuery", it) } } + .configurer() + ) + + inner class TestEnumRefStringStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testQueryDatetimeDateString(datetimeQuery: StringValuePattern? = null, dateQuery: StringValuePattern? = null, stringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryDatetimeDateStringStubBuilder = + TestQueryDatetimeDateStringStubBuilder(get("/query/datetime/date/string") + .apply { datetimeQuery?.let { withQueryParam("datetimeQuery", it) } } + .apply { dateQuery?.let { withQueryParam("dateQuery", it) } } + .apply { stringQuery?.let { withQueryParam("stringQuery", it) } } + .configurer() + ) + + inner class TestQueryDatetimeDateStringStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testQueryIntegerBooleanString(integerQuery: StringValuePattern? = null, booleanQuery: StringValuePattern? = null, stringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryIntegerBooleanStringStubBuilder = + TestQueryIntegerBooleanStringStubBuilder(get("/query/integer/boolean/string") + .apply { integerQuery?.let { withQueryParam("integerQuery", it) } } + .apply { booleanQuery?.let { withQueryParam("booleanQuery", it) } } + .apply { stringQuery?.let { withQueryParam("stringQuery", it) } } + .configurer() + ) + + inner class TestQueryIntegerBooleanStringStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testQueryStyleDeepObjectExplodeTrueObject(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder = + TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder(get("/query/style_deepObject/explode_true/object") + .apply { queryObject?.let { withQueryParam("queryObject", it) } } + .configurer() + ) + + inner class TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testQueryStyleFormExplodeTrueArrayString(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleFormExplodeTrueArrayStringStubBuilder = + TestQueryStyleFormExplodeTrueArrayStringStubBuilder(get("/query/style_form/explode_true/array_string") + .apply { queryObject?.let { withQueryParam("queryObject", it) } } + .configurer() + ) + + inner class TestQueryStyleFormExplodeTrueArrayStringStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } + + fun testQueryStyleFormExplodeTrueObject(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleFormExplodeTrueObjectStubBuilder = + TestQueryStyleFormExplodeTrueObjectStubBuilder(get("/query/style_form/explode_true/object") + .apply { queryObject?.let { withQueryParam("queryObject", it) } } + .configurer() + ) + + inner class TestQueryStyleFormExplodeTrueObjectStubBuilder(private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() + ) + } +} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Bird.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Bird.kt new file mode 100644 index 000000000000..a464613dbfa1 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Bird.kt @@ -0,0 +1,11 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "unused", +) + +package org.openapitools.models + +data class Bird( + val propertySize: kotlin.String?, + val color: kotlin.String?, +) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt new file mode 100644 index 000000000000..05276682856c --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt @@ -0,0 +1,11 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "unused", +) + +package org.openapitools.models + +data class Category( + val id: kotlin.Long?, + val name: kotlin.String?, +) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/DefaultValue.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/DefaultValue.kt new file mode 100644 index 000000000000..a4bef0507c3f --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/DefaultValue.kt @@ -0,0 +1,17 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "unused", +) + +package org.openapitools.models + +data class DefaultValue( + val arrayStringEnumRefDefault: kotlin.collections.List?, + val arrayStringEnumDefault: kotlin.collections.List?, + val arrayStringDefault: kotlin.collections.List?, + val arrayIntegerDefault: kotlin.collections.List?, + val arrayString: kotlin.collections.List?, + val arrayStringNullable: kotlin.collections.List?, + val arrayStringExtensionNullable: kotlin.collections.List?, + val stringNullable: kotlin.String?, +) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/NumberPropertiesOnly.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/NumberPropertiesOnly.kt new file mode 100644 index 000000000000..6ec9c48bb48e --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/NumberPropertiesOnly.kt @@ -0,0 +1,12 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "unused", +) + +package org.openapitools.models + +data class NumberPropertiesOnly( + val number: java.math.BigDecimal?, + val float: kotlin.Float?, + val double: kotlin.Double?, +) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt new file mode 100644 index 000000000000..4e5c9420c3fa --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt @@ -0,0 +1,15 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "unused", +) + +package org.openapitools.models + +data class Pet( + val name: kotlin.String, + val photoUrls: kotlin.collections.List, + val id: kotlin.Long?, + val category: Category?, + val tags: kotlin.collections.List?, + val status: kotlin.String?, +) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Query.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Query.kt new file mode 100644 index 000000000000..d99052e71f8b --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Query.kt @@ -0,0 +1,11 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "unused", +) + +package org.openapitools.models + +data class Query( + val id: kotlin.Long?, + val outcomes: kotlin.collections.List?, +) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/StringEnumRef.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/StringEnumRef.kt new file mode 100644 index 000000000000..4da9bf1ae3a5 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/StringEnumRef.kt @@ -0,0 +1,12 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "unused", +) + +package org.openapitools.models + +enum class StringEnumRef { + success, + failure, + unclassified, +} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt new file mode 100644 index 000000000000..cdfd9a8f2231 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt @@ -0,0 +1,11 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "unused", +) + +package org.openapitools.models + +data class Tag( + val id: kotlin.Long?, + val name: kotlin.String?, +) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter.kt new file mode 100644 index 000000000000..5c8084cd6185 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter.kt @@ -0,0 +1,10 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "unused", +) + +package org.openapitools.models + +data class TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter( + val propertyValues: kotlin.collections.List?, +) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApi.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApi.kt index 7f3c22d96f3a..ec3f63edfef7 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApi.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApi.kt @@ -1,3 +1,9 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + package org.openapitools.apis import com.fasterxml.jackson.databind.ObjectMapper @@ -21,10 +27,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith405( @@ -32,10 +38,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(405) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith( @@ -44,18 +50,16 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } fun deletePet(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeletePetStubBuilder = DeletePetStubBuilder(delete("/pet/{petId}") - .configurer() .withPathParam("petId", petId) + .configurer() ) inner class DeletePetStubBuilder(private val stub: MappingBuilder) { @@ -64,8 +68,8 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(400) + .configurer() ) fun respondWith( @@ -74,20 +78,16 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } fun findPetsByStatus(status: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): FindPetsByStatusStubBuilder = FindPetsByStatusStubBuilder(get("/pet/findByStatus") + .apply { status?.let { withQueryParam("status", it) } } .configurer() - .apply { - status?.let { withQueryParam("status", it) } - } ) inner class FindPetsByStatusStubBuilder(private val stub: MappingBuilder) { @@ -97,10 +97,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith400( @@ -108,10 +108,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(400) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith( @@ -120,20 +120,16 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } fun findPetsByTags(tags: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): FindPetsByTagsStubBuilder = FindPetsByTagsStubBuilder(get("/pet/findByTags") + .apply { tags?.let { withQueryParam("tags", it) } } .configurer() - .apply { - tags?.let { withQueryParam("tags", it) } - } ) inner class FindPetsByTagsStubBuilder(private val stub: MappingBuilder) { @@ -143,10 +139,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith400( @@ -154,10 +150,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(400) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith( @@ -166,18 +162,16 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } fun getPetById(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetPetByIdStubBuilder = GetPetByIdStubBuilder(get("/pet/{petId}") - .configurer() .withPathParam("petId", petId) + .configurer() ) inner class GetPetByIdStubBuilder(private val stub: MappingBuilder) { @@ -187,10 +181,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith400( @@ -198,10 +192,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(400) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith404( @@ -209,10 +203,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(404) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith( @@ -221,11 +215,9 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } @@ -241,10 +233,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith400( @@ -252,10 +244,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(400) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith404( @@ -263,10 +255,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(404) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith405( @@ -274,10 +266,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(405) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith( @@ -286,18 +278,16 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } fun updatePetWithForm(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdatePetWithFormStubBuilder = UpdatePetWithFormStubBuilder(post("/pet/{petId}") - .configurer() .withPathParam("petId", petId) + .configurer() ) inner class UpdatePetWithFormStubBuilder(private val stub: MappingBuilder) { @@ -306,8 +296,8 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(405) + .configurer() ) fun respondWith( @@ -316,18 +306,16 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } fun uploadFile(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UploadFileStubBuilder = UploadFileStubBuilder(post("/pet/{petId}/uploadImage") - .configurer() .withPathParam("petId", petId) + .configurer() ) inner class UploadFileStubBuilder(private val stub: MappingBuilder) { @@ -337,10 +325,10 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith( @@ -349,11 +337,9 @@ open class PetApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } } diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApi.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApi.kt index 4979bafdb8d0..5526244df165 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApi.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApi.kt @@ -1,3 +1,9 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + package org.openapitools.apis import com.fasterxml.jackson.databind.ObjectMapper @@ -11,8 +17,8 @@ open class StoreApiStubs(protected val objectMapper: ObjectMapper) { fun deleteOrder(orderId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeleteOrderStubBuilder = DeleteOrderStubBuilder(delete("/store/order/{orderId}") - .configurer() .withPathParam("orderId", orderId) + .configurer() ) inner class DeleteOrderStubBuilder(private val stub: MappingBuilder) { @@ -21,16 +27,16 @@ open class StoreApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(400) + .configurer() ) fun respondWith404( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(404) + .configurer() ) fun respondWith( @@ -39,11 +45,9 @@ open class StoreApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } @@ -59,10 +63,10 @@ open class StoreApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith( @@ -71,18 +75,16 @@ open class StoreApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } fun getOrderById(orderId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetOrderByIdStubBuilder = GetOrderByIdStubBuilder(get("/store/order/{orderId}") - .configurer() .withPathParam("orderId", orderId) + .configurer() ) inner class GetOrderByIdStubBuilder(private val stub: MappingBuilder) { @@ -92,10 +94,10 @@ open class StoreApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith400( @@ -103,10 +105,10 @@ open class StoreApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(400) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith404( @@ -114,10 +116,10 @@ open class StoreApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(404) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith( @@ -126,11 +128,9 @@ open class StoreApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } @@ -146,10 +146,10 @@ open class StoreApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith400( @@ -157,10 +157,10 @@ open class StoreApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(400) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith( @@ -169,11 +169,9 @@ open class StoreApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } } diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApi.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApi.kt index affb9c3dc6ab..951644dc1569 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApi.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApi.kt @@ -1,3 +1,9 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + package org.openapitools.apis import com.fasterxml.jackson.databind.ObjectMapper @@ -22,11 +28,9 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } @@ -43,11 +47,9 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } @@ -64,18 +66,16 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } fun deleteUser(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeleteUserStubBuilder = DeleteUserStubBuilder(delete("/user/{username}") - .configurer() .withPathParam("username", username) + .configurer() ) inner class DeleteUserStubBuilder(private val stub: MappingBuilder) { @@ -84,16 +84,16 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(400) + .configurer() ) fun respondWith404( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(404) + .configurer() ) fun respondWith( @@ -102,18 +102,16 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } fun getUserByName(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetUserByNameStubBuilder = GetUserByNameStubBuilder(get("/user/{username}") - .configurer() .withPathParam("username", username) + .configurer() ) inner class GetUserByNameStubBuilder(private val stub: MappingBuilder) { @@ -123,10 +121,10 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith400( @@ -134,10 +132,10 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(400) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith404( @@ -145,10 +143,10 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(404) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith( @@ -157,23 +155,17 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } fun loginUser(username: StringValuePattern? = null, password: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): LoginUserStubBuilder = LoginUserStubBuilder(get("/user/login") + .apply { username?.let { withQueryParam("username", it) } } + .apply { password?.let { withQueryParam("password", it) } } .configurer() - .apply { - username?.let { withQueryParam("username", it) } - } - .apply { - password?.let { withQueryParam("password", it) } - } ) inner class LoginUserStubBuilder(private val stub: MappingBuilder) { @@ -183,10 +175,10 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith400( @@ -194,10 +186,10 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(400) .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(body)) + .configurer() ) fun respondWith( @@ -206,11 +198,9 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } @@ -227,18 +217,16 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } fun updateUser(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdateUserStubBuilder = UpdateUserStubBuilder(put("/user/{username}") - .configurer() .withPathParam("username", username) + .configurer() ) inner class UpdateUserStubBuilder(private val stub: MappingBuilder) { @@ -247,16 +235,16 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(400) + .configurer() ) fun respondWith404( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(404) + .configurer() ) fun respondWith( @@ -265,11 +253,9 @@ open class UserApiStubs(protected val objectMapper: ObjectMapper) { configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } ): MappingBuilder = stub.willReturn(aResponse() - .configurer() .withStatus(code) - .apply { - body?.let { withBody(objectMapper.writeValueAsString(it)) } - } + .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } + .configurer() ) } } diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt index 7b69a0efe7f5..05276682856c 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt @@ -1,10 +1,11 @@ @file:Suppress( - "RemoveRedundantQualifierName" + "RemoveRedundantQualifierName", + "unused", ) package org.openapitools.models data class Category( - val id: kotlin.Long, - val name: kotlin.String, + val id: kotlin.Long?, + val name: kotlin.String?, ) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ModelApiResponse.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ModelApiResponse.kt index 01d6c6e40ac1..82a00d18b212 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ModelApiResponse.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ModelApiResponse.kt @@ -1,11 +1,12 @@ @file:Suppress( - "RemoveRedundantQualifierName" + "RemoveRedundantQualifierName", + "unused", ) package org.openapitools.models data class ModelApiResponse( - val code: kotlin.Int, - val type: kotlin.String, - val message: kotlin.String, + val code: kotlin.Int?, + val type: kotlin.String?, + val message: kotlin.String?, ) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt index f21477b9317f..76db79fb5e89 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt @@ -1,14 +1,15 @@ @file:Suppress( - "RemoveRedundantQualifierName" + "RemoveRedundantQualifierName", + "unused", ) package org.openapitools.models data class Order( - val id: kotlin.Long, - val petId: kotlin.Long, - val quantity: kotlin.Int, - val shipDate: java.time.OffsetDateTime, - val status: kotlin.String, - val complete: kotlin.Boolean, + val id: kotlin.Long?, + val petId: kotlin.Long?, + val quantity: kotlin.Int?, + val shipDate: java.time.OffsetDateTime?, + val status: kotlin.String?, + val complete: kotlin.Boolean? = false, ) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt index e97afc72c24c..4e5c9420c3fa 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt @@ -1,5 +1,6 @@ @file:Suppress( - "RemoveRedundantQualifierName" + "RemoveRedundantQualifierName", + "unused", ) package org.openapitools.models @@ -7,8 +8,8 @@ package org.openapitools.models data class Pet( val name: kotlin.String, val photoUrls: kotlin.collections.List, - val id: kotlin.Long, - val category: Category, - val tags: kotlin.collections.List, - val status: kotlin.String, + val id: kotlin.Long?, + val category: Category?, + val tags: kotlin.collections.List?, + val status: kotlin.String?, ) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt index 244d2ad50648..cdfd9a8f2231 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt @@ -1,10 +1,11 @@ @file:Suppress( - "RemoveRedundantQualifierName" + "RemoveRedundantQualifierName", + "unused", ) package org.openapitools.models data class Tag( - val id: kotlin.Long, - val name: kotlin.String, + val id: kotlin.Long?, + val name: kotlin.String?, ) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/User.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/User.kt index be1e0aea3b13..dd35ce088054 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/User.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/User.kt @@ -1,16 +1,17 @@ @file:Suppress( - "RemoveRedundantQualifierName" + "RemoveRedundantQualifierName", + "unused", ) package org.openapitools.models data class User( - val id: kotlin.Long, - val username: kotlin.String, - val firstName: kotlin.String, - val lastName: kotlin.String, - val email: kotlin.String, - val password: kotlin.String, - val phone: kotlin.String, - val userStatus: kotlin.Int, + val id: kotlin.Long?, + val username: kotlin.String?, + val firstName: kotlin.String?, + val lastName: kotlin.String?, + val email: kotlin.String?, + val password: kotlin.String?, + val phone: kotlin.String?, + val userStatus: kotlin.Int?, ) From 3631438b07d9a1d73db372a3c5b9010275d6f829 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sat, 18 May 2024 10:20:35 +0200 Subject: [PATCH 07/22] [kotlin-wiremock] Split stub and stub builder --- .../KotlinWiremockServerCodegen.java | 10 +- .../kotlin-wiremock/.gitignore.mustache | 106 ++++++ .../kotlin-wiremock/api-stub-builder.mustache | 57 +++ .../kotlin-wiremock/api-stub.mustache | 32 ++ .../resources/kotlin-wiremock/api.mustache | 65 ---- .../echo_api/kotlin-wiremock/.gitignore | 106 ++++++ .../kotlin-wiremock/.openapi-generator/FILES | 19 +- .../kotlin/org/openapitools/apis/AuthApi.kt | 77 ---- .../openapitools/apis/AuthApiStubBuilders.kt | 75 ++++ .../org/openapitools/apis/AuthApiStubs.kt | 27 ++ .../kotlin/org/openapitools/apis/BodyApi.kt | 257 ------------- .../openapitools/apis/BodyApiStubBuilders.kt | 255 +++++++++++++ .../org/openapitools/apis/BodyApiStubs.kt | 57 +++ .../kotlin/org/openapitools/apis/FormApi.kt | 77 ---- .../openapitools/apis/FormApiStubBuilders.kt | 75 ++++ .../org/openapitools/apis/FormApiStubs.kt | 27 ++ .../kotlin/org/openapitools/apis/HeaderApi.kt | 47 --- .../apis/HeaderApiStubBuilders.kt | 45 +++ .../org/openapitools/apis/HeaderApiStubs.kt | 22 ++ .../openapitools/apis/PathApiStubBuilders.kt | 45 +++ .../apis/{PathApi.kt => PathApiStubs.kt} | 29 +- .../kotlin/org/openapitools/apis/QueryApi.kt | 208 ----------- .../openapitools/apis/QueryApiStubBuilders.kt | 195 ++++++++++ .../org/openapitools/apis/QueryApiStubs.kt | 58 +++ .../petstore/kotlin-wiremock/.gitignore | 106 ++++++ .../kotlin-wiremock/.openapi-generator/FILES | 12 +- .../kotlin/org/openapitools/apis/PetApi.kt | 345 ------------------ .../openapitools/apis/PetApiStubBuilders.kt | 337 +++++++++++++++++ .../org/openapitools/apis/PetApiStubs.kt | 63 ++++ .../kotlin/org/openapitools/apis/StoreApi.kt | 177 --------- .../openapitools/apis/StoreApiStubBuilders.kt | 173 +++++++++ .../org/openapitools/apis/StoreApiStubs.kt | 39 ++ .../kotlin/org/openapitools/apis/UserApi.kt | 261 ------------- .../openapitools/apis/UserApiStubBuilders.kt | 254 +++++++++++++ .../org/openapitools/apis/UserApiStubs.kt | 62 ++++ .../{ModelApiResponse.kt => ApiResponse.kt} | 2 +- .../kotlin/org/openapitools/models/Order.kt | 2 +- .../org/openapitools/apis/PetApiStubsTest.kt | 44 +++ 38 files changed, 2294 insertions(+), 1554 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/kotlin-wiremock/.gitignore.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub-builder.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub.mustache delete mode 100644 modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache create mode 100644 samples/server/echo_api/kotlin-wiremock/.gitignore delete mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApi.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubBuilders.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubs.kt delete mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApi.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubBuilders.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubs.kt delete mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApi.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubBuilders.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubs.kt delete mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApi.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubBuilders.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubs.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubBuilders.kt rename samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/{PathApi.kt => PathApiStubs.kt} (50%) delete mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApi.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubBuilders.kt create mode 100644 samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubs.kt create mode 100644 samples/server/petstore/kotlin-wiremock/.gitignore delete mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApi.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubBuilders.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubs.kt delete mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApi.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubBuilders.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubs.kt delete mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApi.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubBuilders.kt create mode 100644 samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubs.kt rename samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/{ModelApiResponse.kt => ApiResponse.kt} (86%) create mode 100644 samples/server/petstore/kotlin-wiremock/src/test/kotlin/org/openapitools/apis/PetApiStubsTest.kt diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java index 848cbbc9c55c..a8f267f90454 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java @@ -64,10 +64,14 @@ public void processOpts() { typeMapping.put("array", "kotlin.collections.List"); + reservedWords.remove("ApiResponse"); + additionalProperties.put(CodegenConstants.API_PACKAGE, apiPackage()); additionalProperties.put(CodegenConstants.MODEL_PACKAGE, modelPackage()); - apiTemplateFiles.put("api.mustache", ".kt"); + apiTemplateFiles.put("api-stub.mustache", "Stubs.kt"); + apiTemplateFiles.put("api-stub-builder.mustache", "StubBuilders.kt"); + modelTemplateFiles.put("model.mustache", ".kt"); supportingFiles.addAll(List.of( @@ -80,6 +84,10 @@ public void processOpts() { new SupportingFile("gradle-wrapper.jar", "gradle" + File.separator + "wrapper", "gradle-wrapper.jar") ) ); + + supportingFiles.add( + new SupportingFile(".gitignore.mustache", "", ".gitignore") + ); } @Override diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/.gitignore.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/.gitignore.mustache new file mode 100644 index 000000000000..2983e3c1db32 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/.gitignore.mustache @@ -0,0 +1,106 @@ +./bin/ +# Created by https://www.gitignore.io/api/java,intellij,gradle + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/sonarlint + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### Gradle ### +.gradle +/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 +# gradle/wrapper/gradle-wrapper.properties + +# End of https://www.gitignore.io/api/java,intellij,gradle diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub-builder.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub-builder.mustache new file mode 100644 index 000000000000..8ffcc5f905d8 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub-builder.mustache @@ -0,0 +1,57 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package {{apiPackage}} + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import {{modelPackage}}.* + +{{#operations}} +{{#operation}} +class {{operationIdCamelCase}}StubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + {{#responses}} + {{^wildcard}} + + fun respondWith{{code}}( + {{#returnType}} + body: {{{.}}}, + {{/returnType}} + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus({{code}}) + {{#returnType}} + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + {{/returnType}} + .configurer() + ) + {{/wildcard}} + {{/responses}} + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +{{/operation}} +{{/operations}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub.mustache new file mode 100644 index 000000000000..ce21b5cef1e0 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub.mustache @@ -0,0 +1,32 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package {{apiPackage}} + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import {{modelPackage}}.* + +{{#operations}} +open class {{classname}}Stubs(private val objectMapper: ObjectMapper) { +{{#operation}} + + fun {{operationId}}({{#pathParams}}{{paramName}}: StringValuePattern, {{/pathParams}}{{#queryParams}}{{paramName}}: StringValuePattern? = null, {{/queryParams}}configurer: MappingBuilder.() -> MappingBuilder = { this }): {{operationIdCamelCase}}StubBuilder = + {{operationIdCamelCase}}StubBuilder(objectMapper, {{#lambda.lowercase}}{{httpMethod}}{{/lambda.lowercase}}(urlPathTemplate("{{path}}")) + {{#pathParams}} + .withPathParam("{{paramName}}", {{paramName}}) + {{/pathParams}} + {{#queryParams}} + .apply { {{paramName}}?.let { withQueryParam("{{paramName}}", it) } } + {{/queryParams}} + .configurer() + ) +{{/operation}} +} +{{/operations}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache deleted file mode 100644 index 75c1cf9afaf5..000000000000 --- a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api.mustache +++ /dev/null @@ -1,65 +0,0 @@ -@file:Suppress( - "RemoveRedundantQualifierName", - "UnusedImport", - "unused", -) - -package {{apiPackage}} - -import com.fasterxml.jackson.databind.ObjectMapper -import com.github.tomakehurst.wiremock.client.MappingBuilder -import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder -import com.github.tomakehurst.wiremock.client.WireMock.* -import com.github.tomakehurst.wiremock.matching.StringValuePattern -import {{modelPackage}}.* - -{{#operations}} -open class {{classname}}Stubs(protected val objectMapper: ObjectMapper) { -{{#operation}} - - fun {{operationId}}({{#pathParams}}{{paramName}}: StringValuePattern, {{/pathParams}}{{#queryParams}}{{paramName}}: StringValuePattern? = null, {{/queryParams}}configurer: MappingBuilder.() -> MappingBuilder = { this }): {{operationIdCamelCase}}StubBuilder = - {{operationIdCamelCase}}StubBuilder({{#lambda.lowercase}}{{httpMethod}}{{/lambda.lowercase}}("{{path}}") - {{#pathParams}} - .withPathParam("{{paramName}}", {{paramName}}) - {{/pathParams}} - {{#queryParams}} - .apply { {{paramName}}?.let { withQueryParam("{{paramName}}", it) } } - {{/queryParams}} - .configurer() - ) - - inner class {{operationIdCamelCase}}StubBuilder(private val stub: MappingBuilder) { - {{#responses}} - {{^wildcard}} - - fun respondWith{{code}}( - {{#returnType}} - body: {{{.}}}, - {{/returnType}} - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus({{code}}) - {{#returnType}} - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - {{/returnType}} - .configurer() - ) - {{/wildcard}} - {{/responses}} - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } -{{/operation}} -} -{{/operations}} \ No newline at end of file diff --git a/samples/server/echo_api/kotlin-wiremock/.gitignore b/samples/server/echo_api/kotlin-wiremock/.gitignore new file mode 100644 index 000000000000..2983e3c1db32 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/.gitignore @@ -0,0 +1,106 @@ +./bin/ +# Created by https://www.gitignore.io/api/java,intellij,gradle + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/sonarlint + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### Gradle ### +.gradle +/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 +# gradle/wrapper/gradle-wrapper.properties + +# End of https://www.gitignore.io/api/java,intellij,gradle diff --git a/samples/server/echo_api/kotlin-wiremock/.openapi-generator/FILES b/samples/server/echo_api/kotlin-wiremock/.openapi-generator/FILES index f8f83074d139..762b52754833 100644 --- a/samples/server/echo_api/kotlin-wiremock/.openapi-generator/FILES +++ b/samples/server/echo_api/kotlin-wiremock/.openapi-generator/FILES @@ -1,3 +1,4 @@ +.gitignore build.gradle.kts gradle/libs.versions.toml gradle/wrapper/gradle-wrapper.jar @@ -5,12 +6,18 @@ gradle/wrapper/gradle-wrapper.properties gradlew gradlew.bat settings.gradle.kts -src/main/kotlin/org/openapitools/apis/AuthApi.kt -src/main/kotlin/org/openapitools/apis/BodyApi.kt -src/main/kotlin/org/openapitools/apis/FormApi.kt -src/main/kotlin/org/openapitools/apis/HeaderApi.kt -src/main/kotlin/org/openapitools/apis/PathApi.kt -src/main/kotlin/org/openapitools/apis/QueryApi.kt +src/main/kotlin/org/openapitools/apis/AuthApiStubBuilders.kt +src/main/kotlin/org/openapitools/apis/AuthApiStubs.kt +src/main/kotlin/org/openapitools/apis/BodyApiStubBuilders.kt +src/main/kotlin/org/openapitools/apis/BodyApiStubs.kt +src/main/kotlin/org/openapitools/apis/FormApiStubBuilders.kt +src/main/kotlin/org/openapitools/apis/FormApiStubs.kt +src/main/kotlin/org/openapitools/apis/HeaderApiStubBuilders.kt +src/main/kotlin/org/openapitools/apis/HeaderApiStubs.kt +src/main/kotlin/org/openapitools/apis/PathApiStubBuilders.kt +src/main/kotlin/org/openapitools/apis/PathApiStubs.kt +src/main/kotlin/org/openapitools/apis/QueryApiStubBuilders.kt +src/main/kotlin/org/openapitools/apis/QueryApiStubs.kt src/main/kotlin/org/openapitools/models/Bird.kt src/main/kotlin/org/openapitools/models/Category.kt src/main/kotlin/org/openapitools/models/DefaultValue.kt diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApi.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApi.kt deleted file mode 100644 index ea4504183875..000000000000 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApi.kt +++ /dev/null @@ -1,77 +0,0 @@ -@file:Suppress( - "RemoveRedundantQualifierName", - "UnusedImport", - "unused", -) - -package org.openapitools.apis - -import com.fasterxml.jackson.databind.ObjectMapper -import com.github.tomakehurst.wiremock.client.MappingBuilder -import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder -import com.github.tomakehurst.wiremock.client.WireMock.* -import com.github.tomakehurst.wiremock.matching.StringValuePattern -import org.openapitools.models.* - -open class AuthApiStubs(protected val objectMapper: ObjectMapper) { - - fun testAuthHttpBasic(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestAuthHttpBasicStubBuilder = - TestAuthHttpBasicStubBuilder(post("/auth/http/basic") - .configurer() - ) - - inner class TestAuthHttpBasicStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testAuthHttpBearer(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestAuthHttpBearerStubBuilder = - TestAuthHttpBearerStubBuilder(post("/auth/http/bearer") - .configurer() - ) - - inner class TestAuthHttpBearerStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } -} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubBuilders.kt new file mode 100644 index 000000000000..967e686ed46a --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubBuilders.kt @@ -0,0 +1,75 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +class TestAuthHttpBasicStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestAuthHttpBearerStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubs.kt new file mode 100644 index 000000000000..2a2992a85d77 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubs.kt @@ -0,0 +1,27 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class AuthApiStubs(private val objectMapper: ObjectMapper) { + + fun testAuthHttpBasic(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestAuthHttpBasicStubBuilder = + TestAuthHttpBasicStubBuilder(objectMapper, post(urlPathTemplate("/auth/http/basic")) + .configurer() + ) + + fun testAuthHttpBearer(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestAuthHttpBearerStubBuilder = + TestAuthHttpBearerStubBuilder(objectMapper, post(urlPathTemplate("/auth/http/bearer")) + .configurer() + ) +} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApi.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApi.kt deleted file mode 100644 index 28aceee3dbdb..000000000000 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApi.kt +++ /dev/null @@ -1,257 +0,0 @@ -@file:Suppress( - "RemoveRedundantQualifierName", - "UnusedImport", - "unused", -) - -package org.openapitools.apis - -import com.fasterxml.jackson.databind.ObjectMapper -import com.github.tomakehurst.wiremock.client.MappingBuilder -import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder -import com.github.tomakehurst.wiremock.client.WireMock.* -import com.github.tomakehurst.wiremock.matching.StringValuePattern -import org.openapitools.models.* - -open class BodyApiStubs(protected val objectMapper: ObjectMapper) { - - fun testBinaryGif(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBinaryGifStubBuilder = - TestBinaryGifStubBuilder(post("/binary/gif") - .configurer() - ) - - inner class TestBinaryGifStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: java.io.File, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testBodyApplicationOctetstreamBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyApplicationOctetstreamBinaryStubBuilder = - TestBodyApplicationOctetstreamBinaryStubBuilder(post("/body/application/octetstream/binary") - .configurer() - ) - - inner class TestBodyApplicationOctetstreamBinaryStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testBodyMultipartFormdataArrayOfBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyMultipartFormdataArrayOfBinaryStubBuilder = - TestBodyMultipartFormdataArrayOfBinaryStubBuilder(post("/body/application/octetstream/array_of_binary") - .configurer() - ) - - inner class TestBodyMultipartFormdataArrayOfBinaryStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testBodyMultipartFormdataSingleBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyMultipartFormdataSingleBinaryStubBuilder = - TestBodyMultipartFormdataSingleBinaryStubBuilder(post("/body/application/octetstream/single_binary") - .configurer() - ) - - inner class TestBodyMultipartFormdataSingleBinaryStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testEchoBodyFreeFormObjectResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyFreeFormObjectResponseStringStubBuilder = - TestEchoBodyFreeFormObjectResponseStringStubBuilder(post("/echo/body/FreeFormObject/response_string") - .configurer() - ) - - inner class TestEchoBodyFreeFormObjectResponseStringStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testEchoBodyPet(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyPetStubBuilder = - TestEchoBodyPetStubBuilder(post("/echo/body/Pet") - .configurer() - ) - - inner class TestEchoBodyPetStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: Pet, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testEchoBodyPetResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyPetResponseStringStubBuilder = - TestEchoBodyPetResponseStringStubBuilder(post("/echo/body/Pet/response_string") - .configurer() - ) - - inner class TestEchoBodyPetResponseStringStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testEchoBodyTagResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyTagResponseStringStubBuilder = - TestEchoBodyTagResponseStringStubBuilder(post("/echo/body/Tag/response_string") - .configurer() - ) - - inner class TestEchoBodyTagResponseStringStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } -} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubBuilders.kt new file mode 100644 index 000000000000..99c2f0f1d65c --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubBuilders.kt @@ -0,0 +1,255 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +class TestBinaryGifStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: java.io.File, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestBodyApplicationOctetstreamBinaryStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestBodyMultipartFormdataArrayOfBinaryStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestBodyMultipartFormdataSingleBinaryStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestEchoBodyFreeFormObjectResponseStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestEchoBodyPetStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestEchoBodyPetResponseStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestEchoBodyTagResponseStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubs.kt new file mode 100644 index 000000000000..984147b7e871 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubs.kt @@ -0,0 +1,57 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class BodyApiStubs(private val objectMapper: ObjectMapper) { + + fun testBinaryGif(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBinaryGifStubBuilder = + TestBinaryGifStubBuilder(objectMapper, post(urlPathTemplate("/binary/gif")) + .configurer() + ) + + fun testBodyApplicationOctetstreamBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyApplicationOctetstreamBinaryStubBuilder = + TestBodyApplicationOctetstreamBinaryStubBuilder(objectMapper, post(urlPathTemplate("/body/application/octetstream/binary")) + .configurer() + ) + + fun testBodyMultipartFormdataArrayOfBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyMultipartFormdataArrayOfBinaryStubBuilder = + TestBodyMultipartFormdataArrayOfBinaryStubBuilder(objectMapper, post(urlPathTemplate("/body/application/octetstream/array_of_binary")) + .configurer() + ) + + fun testBodyMultipartFormdataSingleBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyMultipartFormdataSingleBinaryStubBuilder = + TestBodyMultipartFormdataSingleBinaryStubBuilder(objectMapper, post(urlPathTemplate("/body/application/octetstream/single_binary")) + .configurer() + ) + + fun testEchoBodyFreeFormObjectResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyFreeFormObjectResponseStringStubBuilder = + TestEchoBodyFreeFormObjectResponseStringStubBuilder(objectMapper, post(urlPathTemplate("/echo/body/FreeFormObject/response_string")) + .configurer() + ) + + fun testEchoBodyPet(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyPetStubBuilder = + TestEchoBodyPetStubBuilder(objectMapper, post(urlPathTemplate("/echo/body/Pet")) + .configurer() + ) + + fun testEchoBodyPetResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyPetResponseStringStubBuilder = + TestEchoBodyPetResponseStringStubBuilder(objectMapper, post(urlPathTemplate("/echo/body/Pet/response_string")) + .configurer() + ) + + fun testEchoBodyTagResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyTagResponseStringStubBuilder = + TestEchoBodyTagResponseStringStubBuilder(objectMapper, post(urlPathTemplate("/echo/body/Tag/response_string")) + .configurer() + ) +} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApi.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApi.kt deleted file mode 100644 index 236156b37a5b..000000000000 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApi.kt +++ /dev/null @@ -1,77 +0,0 @@ -@file:Suppress( - "RemoveRedundantQualifierName", - "UnusedImport", - "unused", -) - -package org.openapitools.apis - -import com.fasterxml.jackson.databind.ObjectMapper -import com.github.tomakehurst.wiremock.client.MappingBuilder -import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder -import com.github.tomakehurst.wiremock.client.WireMock.* -import com.github.tomakehurst.wiremock.matching.StringValuePattern -import org.openapitools.models.* - -open class FormApiStubs(protected val objectMapper: ObjectMapper) { - - fun testFormIntegerBooleanString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestFormIntegerBooleanStringStubBuilder = - TestFormIntegerBooleanStringStubBuilder(post("/form/integer/boolean/string") - .configurer() - ) - - inner class TestFormIntegerBooleanStringStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testFormOneof(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestFormOneofStubBuilder = - TestFormOneofStubBuilder(post("/form/oneof") - .configurer() - ) - - inner class TestFormOneofStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } -} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubBuilders.kt new file mode 100644 index 000000000000..ad1909a52ccc --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubBuilders.kt @@ -0,0 +1,75 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +class TestFormIntegerBooleanStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestFormOneofStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubs.kt new file mode 100644 index 000000000000..369fec485821 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubs.kt @@ -0,0 +1,27 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class FormApiStubs(private val objectMapper: ObjectMapper) { + + fun testFormIntegerBooleanString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestFormIntegerBooleanStringStubBuilder = + TestFormIntegerBooleanStringStubBuilder(objectMapper, post(urlPathTemplate("/form/integer/boolean/string")) + .configurer() + ) + + fun testFormOneof(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestFormOneofStubBuilder = + TestFormOneofStubBuilder(objectMapper, post(urlPathTemplate("/form/oneof")) + .configurer() + ) +} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApi.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApi.kt deleted file mode 100644 index 7c9ef5764dde..000000000000 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApi.kt +++ /dev/null @@ -1,47 +0,0 @@ -@file:Suppress( - "RemoveRedundantQualifierName", - "UnusedImport", - "unused", -) - -package org.openapitools.apis - -import com.fasterxml.jackson.databind.ObjectMapper -import com.github.tomakehurst.wiremock.client.MappingBuilder -import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder -import com.github.tomakehurst.wiremock.client.WireMock.* -import com.github.tomakehurst.wiremock.matching.StringValuePattern -import org.openapitools.models.* - -open class HeaderApiStubs(protected val objectMapper: ObjectMapper) { - - fun testHeaderIntegerBooleanStringEnums(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestHeaderIntegerBooleanStringEnumsStubBuilder = - TestHeaderIntegerBooleanStringEnumsStubBuilder(get("/header/integer/boolean/string/enums") - .configurer() - ) - - inner class TestHeaderIntegerBooleanStringEnumsStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } -} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubBuilders.kt new file mode 100644 index 000000000000..df13c00c2ca3 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubBuilders.kt @@ -0,0 +1,45 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +class TestHeaderIntegerBooleanStringEnumsStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubs.kt new file mode 100644 index 000000000000..4dea547497c9 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubs.kt @@ -0,0 +1,22 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class HeaderApiStubs(private val objectMapper: ObjectMapper) { + + fun testHeaderIntegerBooleanStringEnums(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestHeaderIntegerBooleanStringEnumsStubBuilder = + TestHeaderIntegerBooleanStringEnumsStubBuilder(objectMapper, get(urlPathTemplate("/header/integer/boolean/string/enums")) + .configurer() + ) +} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubBuilders.kt new file mode 100644 index 000000000000..5fdb5bb58adc --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubBuilders.kt @@ -0,0 +1,45 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +class TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApi.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubs.kt similarity index 50% rename from samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApi.kt rename to samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubs.kt index 904677082f2e..d1e1eccdede2 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApi.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubs.kt @@ -13,39 +13,14 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* -open class PathApiStubs(protected val objectMapper: ObjectMapper) { +open class PathApiStubs(private val objectMapper: ObjectMapper) { fun testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath(pathString: StringValuePattern, pathInteger: StringValuePattern, enumNonrefStringPath: StringValuePattern, enumRefStringPath: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder = - TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder(get("/path/string/{path_string}/integer/{path_integer}/{enum_nonref_string_path}/{enum_ref_string_path}") + TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder(objectMapper, get(urlPathTemplate("/path/string/{path_string}/integer/{path_integer}/{enum_nonref_string_path}/{enum_ref_string_path}")) .withPathParam("pathString", pathString) .withPathParam("pathInteger", pathInteger) .withPathParam("enumNonrefStringPath", enumNonrefStringPath) .withPathParam("enumRefStringPath", enumRefStringPath) .configurer() ) - - inner class TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } } diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApi.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApi.kt deleted file mode 100644 index 66f1bfb4b9c4..000000000000 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApi.kt +++ /dev/null @@ -1,208 +0,0 @@ -@file:Suppress( - "RemoveRedundantQualifierName", - "UnusedImport", - "unused", -) - -package org.openapitools.apis - -import com.fasterxml.jackson.databind.ObjectMapper -import com.github.tomakehurst.wiremock.client.MappingBuilder -import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder -import com.github.tomakehurst.wiremock.client.WireMock.* -import com.github.tomakehurst.wiremock.matching.StringValuePattern -import org.openapitools.models.* - -open class QueryApiStubs(protected val objectMapper: ObjectMapper) { - - fun testEnumRefString(enumNonrefStringQuery: StringValuePattern? = null, enumRefStringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEnumRefStringStubBuilder = - TestEnumRefStringStubBuilder(get("/query/enum_ref_string") - .apply { enumNonrefStringQuery?.let { withQueryParam("enumNonrefStringQuery", it) } } - .apply { enumRefStringQuery?.let { withQueryParam("enumRefStringQuery", it) } } - .configurer() - ) - - inner class TestEnumRefStringStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testQueryDatetimeDateString(datetimeQuery: StringValuePattern? = null, dateQuery: StringValuePattern? = null, stringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryDatetimeDateStringStubBuilder = - TestQueryDatetimeDateStringStubBuilder(get("/query/datetime/date/string") - .apply { datetimeQuery?.let { withQueryParam("datetimeQuery", it) } } - .apply { dateQuery?.let { withQueryParam("dateQuery", it) } } - .apply { stringQuery?.let { withQueryParam("stringQuery", it) } } - .configurer() - ) - - inner class TestQueryDatetimeDateStringStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testQueryIntegerBooleanString(integerQuery: StringValuePattern? = null, booleanQuery: StringValuePattern? = null, stringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryIntegerBooleanStringStubBuilder = - TestQueryIntegerBooleanStringStubBuilder(get("/query/integer/boolean/string") - .apply { integerQuery?.let { withQueryParam("integerQuery", it) } } - .apply { booleanQuery?.let { withQueryParam("booleanQuery", it) } } - .apply { stringQuery?.let { withQueryParam("stringQuery", it) } } - .configurer() - ) - - inner class TestQueryIntegerBooleanStringStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testQueryStyleDeepObjectExplodeTrueObject(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder = - TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder(get("/query/style_deepObject/explode_true/object") - .apply { queryObject?.let { withQueryParam("queryObject", it) } } - .configurer() - ) - - inner class TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testQueryStyleFormExplodeTrueArrayString(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleFormExplodeTrueArrayStringStubBuilder = - TestQueryStyleFormExplodeTrueArrayStringStubBuilder(get("/query/style_form/explode_true/array_string") - .apply { queryObject?.let { withQueryParam("queryObject", it) } } - .configurer() - ) - - inner class TestQueryStyleFormExplodeTrueArrayStringStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun testQueryStyleFormExplodeTrueObject(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleFormExplodeTrueObjectStubBuilder = - TestQueryStyleFormExplodeTrueObjectStubBuilder(get("/query/style_form/explode_true/object") - .apply { queryObject?.let { withQueryParam("queryObject", it) } } - .configurer() - ) - - inner class TestQueryStyleFormExplodeTrueObjectStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } -} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubBuilders.kt new file mode 100644 index 000000000000..70574df68e9f --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubBuilders.kt @@ -0,0 +1,195 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +class TestEnumRefStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestQueryDatetimeDateStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestQueryIntegerBooleanStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestQueryStyleFormExplodeTrueArrayStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class TestQueryStyleFormExplodeTrueObjectStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubs.kt new file mode 100644 index 000000000000..39e64774f779 --- /dev/null +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubs.kt @@ -0,0 +1,58 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class QueryApiStubs(private val objectMapper: ObjectMapper) { + + fun testEnumRefString(enumNonrefStringQuery: StringValuePattern? = null, enumRefStringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEnumRefStringStubBuilder = + TestEnumRefStringStubBuilder(objectMapper, get(urlPathTemplate("/query/enum_ref_string")) + .apply { enumNonrefStringQuery?.let { withQueryParam("enumNonrefStringQuery", it) } } + .apply { enumRefStringQuery?.let { withQueryParam("enumRefStringQuery", it) } } + .configurer() + ) + + fun testQueryDatetimeDateString(datetimeQuery: StringValuePattern? = null, dateQuery: StringValuePattern? = null, stringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryDatetimeDateStringStubBuilder = + TestQueryDatetimeDateStringStubBuilder(objectMapper, get(urlPathTemplate("/query/datetime/date/string")) + .apply { datetimeQuery?.let { withQueryParam("datetimeQuery", it) } } + .apply { dateQuery?.let { withQueryParam("dateQuery", it) } } + .apply { stringQuery?.let { withQueryParam("stringQuery", it) } } + .configurer() + ) + + fun testQueryIntegerBooleanString(integerQuery: StringValuePattern? = null, booleanQuery: StringValuePattern? = null, stringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryIntegerBooleanStringStubBuilder = + TestQueryIntegerBooleanStringStubBuilder(objectMapper, get(urlPathTemplate("/query/integer/boolean/string")) + .apply { integerQuery?.let { withQueryParam("integerQuery", it) } } + .apply { booleanQuery?.let { withQueryParam("booleanQuery", it) } } + .apply { stringQuery?.let { withQueryParam("stringQuery", it) } } + .configurer() + ) + + fun testQueryStyleDeepObjectExplodeTrueObject(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder = + TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder(objectMapper, get(urlPathTemplate("/query/style_deepObject/explode_true/object")) + .apply { queryObject?.let { withQueryParam("queryObject", it) } } + .configurer() + ) + + fun testQueryStyleFormExplodeTrueArrayString(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleFormExplodeTrueArrayStringStubBuilder = + TestQueryStyleFormExplodeTrueArrayStringStubBuilder(objectMapper, get(urlPathTemplate("/query/style_form/explode_true/array_string")) + .apply { queryObject?.let { withQueryParam("queryObject", it) } } + .configurer() + ) + + fun testQueryStyleFormExplodeTrueObject(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleFormExplodeTrueObjectStubBuilder = + TestQueryStyleFormExplodeTrueObjectStubBuilder(objectMapper, get(urlPathTemplate("/query/style_form/explode_true/object")) + .apply { queryObject?.let { withQueryParam("queryObject", it) } } + .configurer() + ) +} diff --git a/samples/server/petstore/kotlin-wiremock/.gitignore b/samples/server/petstore/kotlin-wiremock/.gitignore new file mode 100644 index 000000000000..2983e3c1db32 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/.gitignore @@ -0,0 +1,106 @@ +./bin/ +# Created by https://www.gitignore.io/api/java,intellij,gradle + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/sonarlint + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### Gradle ### +.gradle +/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 +# gradle/wrapper/gradle-wrapper.properties + +# End of https://www.gitignore.io/api/java,intellij,gradle diff --git a/samples/server/petstore/kotlin-wiremock/.openapi-generator/FILES b/samples/server/petstore/kotlin-wiremock/.openapi-generator/FILES index fb9c57f7dc8e..20ae24df3871 100644 --- a/samples/server/petstore/kotlin-wiremock/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-wiremock/.openapi-generator/FILES @@ -1,3 +1,4 @@ +.gitignore build.gradle.kts gradle/libs.versions.toml gradle/wrapper/gradle-wrapper.jar @@ -5,11 +6,14 @@ gradle/wrapper/gradle-wrapper.properties gradlew gradlew.bat settings.gradle.kts -src/main/kotlin/org/openapitools/apis/PetApi.kt -src/main/kotlin/org/openapitools/apis/StoreApi.kt -src/main/kotlin/org/openapitools/apis/UserApi.kt +src/main/kotlin/org/openapitools/apis/PetApiStubBuilders.kt +src/main/kotlin/org/openapitools/apis/PetApiStubs.kt +src/main/kotlin/org/openapitools/apis/StoreApiStubBuilders.kt +src/main/kotlin/org/openapitools/apis/StoreApiStubs.kt +src/main/kotlin/org/openapitools/apis/UserApiStubBuilders.kt +src/main/kotlin/org/openapitools/apis/UserApiStubs.kt +src/main/kotlin/org/openapitools/models/ApiResponse.kt src/main/kotlin/org/openapitools/models/Category.kt -src/main/kotlin/org/openapitools/models/ModelApiResponse.kt src/main/kotlin/org/openapitools/models/Order.kt src/main/kotlin/org/openapitools/models/Pet.kt src/main/kotlin/org/openapitools/models/Tag.kt diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApi.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApi.kt deleted file mode 100644 index ec3f63edfef7..000000000000 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApi.kt +++ /dev/null @@ -1,345 +0,0 @@ -@file:Suppress( - "RemoveRedundantQualifierName", - "UnusedImport", - "unused", -) - -package org.openapitools.apis - -import com.fasterxml.jackson.databind.ObjectMapper -import com.github.tomakehurst.wiremock.client.MappingBuilder -import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder -import com.github.tomakehurst.wiremock.client.WireMock.* -import com.github.tomakehurst.wiremock.matching.StringValuePattern -import org.openapitools.models.* - -open class PetApiStubs(protected val objectMapper: ObjectMapper) { - - fun addPet(configurer: MappingBuilder.() -> MappingBuilder = { this }): AddPetStubBuilder = - AddPetStubBuilder(post("/pet") - .configurer() - ) - - inner class AddPetStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: Pet, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith405( - body: Pet, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(405) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun deletePet(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeletePetStubBuilder = - DeletePetStubBuilder(delete("/pet/{petId}") - .withPathParam("petId", petId) - .configurer() - ) - - inner class DeletePetStubBuilder(private val stub: MappingBuilder) { - - fun respondWith400( - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(400) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun findPetsByStatus(status: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): FindPetsByStatusStubBuilder = - FindPetsByStatusStubBuilder(get("/pet/findByStatus") - .apply { status?.let { withQueryParam("status", it) } } - .configurer() - ) - - inner class FindPetsByStatusStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.collections.List, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith400( - body: kotlin.collections.List, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(400) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun findPetsByTags(tags: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): FindPetsByTagsStubBuilder = - FindPetsByTagsStubBuilder(get("/pet/findByTags") - .apply { tags?.let { withQueryParam("tags", it) } } - .configurer() - ) - - inner class FindPetsByTagsStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.collections.List, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith400( - body: kotlin.collections.List, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(400) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun getPetById(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetPetByIdStubBuilder = - GetPetByIdStubBuilder(get("/pet/{petId}") - .withPathParam("petId", petId) - .configurer() - ) - - inner class GetPetByIdStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: Pet, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith400( - body: Pet, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(400) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith404( - body: Pet, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(404) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun updatePet(configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdatePetStubBuilder = - UpdatePetStubBuilder(put("/pet") - .configurer() - ) - - inner class UpdatePetStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: Pet, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith400( - body: Pet, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(400) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith404( - body: Pet, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(404) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith405( - body: Pet, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(405) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun updatePetWithForm(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdatePetWithFormStubBuilder = - UpdatePetWithFormStubBuilder(post("/pet/{petId}") - .withPathParam("petId", petId) - .configurer() - ) - - inner class UpdatePetWithFormStubBuilder(private val stub: MappingBuilder) { - - fun respondWith405( - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(405) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun uploadFile(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UploadFileStubBuilder = - UploadFileStubBuilder(post("/pet/{petId}/uploadImage") - .withPathParam("petId", petId) - .configurer() - ) - - inner class UploadFileStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: ModelApiResponse, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } -} diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubBuilders.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubBuilders.kt new file mode 100644 index 000000000000..6cf0f6f3f535 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubBuilders.kt @@ -0,0 +1,337 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +class AddPetStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith405( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(405) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class DeletePetStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith400( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(400) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class FindPetsByStatusStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.collections.List, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith400( + body: kotlin.collections.List, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class FindPetsByTagsStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.collections.List, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith400( + body: kotlin.collections.List, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class GetPetByIdStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith400( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith404( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(404) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class UpdatePetStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith400( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith404( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(404) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith405( + body: Pet, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(405) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class UpdatePetWithFormStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith405( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(405) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class UploadFileStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: ApiResponse, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubs.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubs.kt new file mode 100644 index 000000000000..720fedc08f95 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubs.kt @@ -0,0 +1,63 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class PetApiStubs(private val objectMapper: ObjectMapper) { + + fun addPet(configurer: MappingBuilder.() -> MappingBuilder = { this }): AddPetStubBuilder = + AddPetStubBuilder(objectMapper, post(urlPathTemplate("/pet")) + .configurer() + ) + + fun deletePet(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeletePetStubBuilder = + DeletePetStubBuilder(objectMapper, delete(urlPathTemplate("/pet/{petId}")) + .withPathParam("petId", petId) + .configurer() + ) + + fun findPetsByStatus(status: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): FindPetsByStatusStubBuilder = + FindPetsByStatusStubBuilder(objectMapper, get(urlPathTemplate("/pet/findByStatus")) + .apply { status?.let { withQueryParam("status", it) } } + .configurer() + ) + + fun findPetsByTags(tags: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): FindPetsByTagsStubBuilder = + FindPetsByTagsStubBuilder(objectMapper, get(urlPathTemplate("/pet/findByTags")) + .apply { tags?.let { withQueryParam("tags", it) } } + .configurer() + ) + + fun getPetById(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetPetByIdStubBuilder = + GetPetByIdStubBuilder(objectMapper, get(urlPathTemplate("/pet/{petId}")) + .withPathParam("petId", petId) + .configurer() + ) + + fun updatePet(configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdatePetStubBuilder = + UpdatePetStubBuilder(objectMapper, put(urlPathTemplate("/pet")) + .configurer() + ) + + fun updatePetWithForm(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdatePetWithFormStubBuilder = + UpdatePetWithFormStubBuilder(objectMapper, post(urlPathTemplate("/pet/{petId}")) + .withPathParam("petId", petId) + .configurer() + ) + + fun uploadFile(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UploadFileStubBuilder = + UploadFileStubBuilder(objectMapper, post(urlPathTemplate("/pet/{petId}/uploadImage")) + .withPathParam("petId", petId) + .configurer() + ) +} diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApi.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApi.kt deleted file mode 100644 index 5526244df165..000000000000 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApi.kt +++ /dev/null @@ -1,177 +0,0 @@ -@file:Suppress( - "RemoveRedundantQualifierName", - "UnusedImport", - "unused", -) - -package org.openapitools.apis - -import com.fasterxml.jackson.databind.ObjectMapper -import com.github.tomakehurst.wiremock.client.MappingBuilder -import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder -import com.github.tomakehurst.wiremock.client.WireMock.* -import com.github.tomakehurst.wiremock.matching.StringValuePattern -import org.openapitools.models.* - -open class StoreApiStubs(protected val objectMapper: ObjectMapper) { - - fun deleteOrder(orderId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeleteOrderStubBuilder = - DeleteOrderStubBuilder(delete("/store/order/{orderId}") - .withPathParam("orderId", orderId) - .configurer() - ) - - inner class DeleteOrderStubBuilder(private val stub: MappingBuilder) { - - fun respondWith400( - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(400) - .configurer() - ) - - fun respondWith404( - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(404) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun getInventory(configurer: MappingBuilder.() -> MappingBuilder = { this }): GetInventoryStubBuilder = - GetInventoryStubBuilder(get("/store/inventory") - .configurer() - ) - - inner class GetInventoryStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.collections.Map, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun getOrderById(orderId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetOrderByIdStubBuilder = - GetOrderByIdStubBuilder(get("/store/order/{orderId}") - .withPathParam("orderId", orderId) - .configurer() - ) - - inner class GetOrderByIdStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: Order, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith400( - body: Order, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(400) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith404( - body: Order, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(404) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun placeOrder(configurer: MappingBuilder.() -> MappingBuilder = { this }): PlaceOrderStubBuilder = - PlaceOrderStubBuilder(post("/store/order") - .configurer() - ) - - inner class PlaceOrderStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: Order, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith400( - body: Order, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(400) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } -} diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubBuilders.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubBuilders.kt new file mode 100644 index 000000000000..7b61203d585a --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubBuilders.kt @@ -0,0 +1,173 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +class DeleteOrderStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith400( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(400) + .configurer() + ) + + fun respondWith404( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(404) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class GetInventoryStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.collections.Map, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class GetOrderByIdStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: Order, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith400( + body: Order, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith404( + body: Order, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(404) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class PlaceOrderStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: Order, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith400( + body: Order, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubs.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubs.kt new file mode 100644 index 000000000000..b86c054c8c9d --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubs.kt @@ -0,0 +1,39 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class StoreApiStubs(private val objectMapper: ObjectMapper) { + + fun deleteOrder(orderId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeleteOrderStubBuilder = + DeleteOrderStubBuilder(objectMapper, delete(urlPathTemplate("/store/order/{orderId}")) + .withPathParam("orderId", orderId) + .configurer() + ) + + fun getInventory(configurer: MappingBuilder.() -> MappingBuilder = { this }): GetInventoryStubBuilder = + GetInventoryStubBuilder(objectMapper, get(urlPathTemplate("/store/inventory")) + .configurer() + ) + + fun getOrderById(orderId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetOrderByIdStubBuilder = + GetOrderByIdStubBuilder(objectMapper, get(urlPathTemplate("/store/order/{orderId}")) + .withPathParam("orderId", orderId) + .configurer() + ) + + fun placeOrder(configurer: MappingBuilder.() -> MappingBuilder = { this }): PlaceOrderStubBuilder = + PlaceOrderStubBuilder(objectMapper, post(urlPathTemplate("/store/order")) + .configurer() + ) +} diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApi.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApi.kt deleted file mode 100644 index 951644dc1569..000000000000 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApi.kt +++ /dev/null @@ -1,261 +0,0 @@ -@file:Suppress( - "RemoveRedundantQualifierName", - "UnusedImport", - "unused", -) - -package org.openapitools.apis - -import com.fasterxml.jackson.databind.ObjectMapper -import com.github.tomakehurst.wiremock.client.MappingBuilder -import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder -import com.github.tomakehurst.wiremock.client.WireMock.* -import com.github.tomakehurst.wiremock.matching.StringValuePattern -import org.openapitools.models.* - -open class UserApiStubs(protected val objectMapper: ObjectMapper) { - - fun createUser(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUserStubBuilder = - CreateUserStubBuilder(post("/user") - .configurer() - ) - - inner class CreateUserStubBuilder(private val stub: MappingBuilder) { - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun createUsersWithArrayInput(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUsersWithArrayInputStubBuilder = - CreateUsersWithArrayInputStubBuilder(post("/user/createWithArray") - .configurer() - ) - - inner class CreateUsersWithArrayInputStubBuilder(private val stub: MappingBuilder) { - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun createUsersWithListInput(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUsersWithListInputStubBuilder = - CreateUsersWithListInputStubBuilder(post("/user/createWithList") - .configurer() - ) - - inner class CreateUsersWithListInputStubBuilder(private val stub: MappingBuilder) { - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun deleteUser(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeleteUserStubBuilder = - DeleteUserStubBuilder(delete("/user/{username}") - .withPathParam("username", username) - .configurer() - ) - - inner class DeleteUserStubBuilder(private val stub: MappingBuilder) { - - fun respondWith400( - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(400) - .configurer() - ) - - fun respondWith404( - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(404) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun getUserByName(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetUserByNameStubBuilder = - GetUserByNameStubBuilder(get("/user/{username}") - .withPathParam("username", username) - .configurer() - ) - - inner class GetUserByNameStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: User, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith400( - body: User, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(400) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith404( - body: User, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(404) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun loginUser(username: StringValuePattern? = null, password: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): LoginUserStubBuilder = - LoginUserStubBuilder(get("/user/login") - .apply { username?.let { withQueryParam("username", it) } } - .apply { password?.let { withQueryParam("password", it) } } - .configurer() - ) - - inner class LoginUserStubBuilder(private val stub: MappingBuilder) { - - fun respondWith200( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith400( - body: kotlin.String, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(400) - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(body)) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun logoutUser(configurer: MappingBuilder.() -> MappingBuilder = { this }): LogoutUserStubBuilder = - LogoutUserStubBuilder(get("/user/logout") - .configurer() - ) - - inner class LogoutUserStubBuilder(private val stub: MappingBuilder) { - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } - - fun updateUser(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdateUserStubBuilder = - UpdateUserStubBuilder(put("/user/{username}") - .withPathParam("username", username) - .configurer() - ) - - inner class UpdateUserStubBuilder(private val stub: MappingBuilder) { - - fun respondWith400( - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(400) - .configurer() - ) - - fun respondWith404( - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(404) - .configurer() - ) - - fun respondWith( - code: Int, - body: Any? = null, - configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } - ): MappingBuilder = - stub.willReturn(aResponse() - .withStatus(code) - .apply { body?.let { withBody(objectMapper.writeValueAsString(it)) } } - .configurer() - ) - } -} diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubBuilders.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubBuilders.kt new file mode 100644 index 000000000000..182f75401a76 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubBuilders.kt @@ -0,0 +1,254 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +class CreateUserStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class CreateUsersWithArrayInputStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class CreateUsersWithListInputStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class DeleteUserStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith400( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(400) + .configurer() + ) + + fun respondWith404( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(404) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class GetUserByNameStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: User, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith400( + body: User, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith404( + body: User, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(404) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class LoginUserStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith200( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith400( + body: kotlin.String, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(400) + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(body)) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class LogoutUserStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + +class UpdateUserStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + + fun respondWith400( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(400) + .configurer() + ) + + fun respondWith404( + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(404) + .configurer() + ) + + fun respondWith( + code: Int, + body: Any? = null, + configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this } + ): MappingBuilder = + stub.willReturn(aResponse() + .withStatus(code) + .apply { + body?.let { + withHeader("Content-Type", "application/json") + withBody(objectMapper.writeValueAsString(it)) + } + } + .configurer() + ) +} + diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubs.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubs.kt new file mode 100644 index 000000000000..32c999d0dad3 --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubs.kt @@ -0,0 +1,62 @@ +@file:Suppress( + "RemoveRedundantQualifierName", + "UnusedImport", + "unused", +) + +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.tomakehurst.wiremock.client.MappingBuilder +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.matching.StringValuePattern +import org.openapitools.models.* + +open class UserApiStubs(private val objectMapper: ObjectMapper) { + + fun createUser(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUserStubBuilder = + CreateUserStubBuilder(objectMapper, post(urlPathTemplate("/user")) + .configurer() + ) + + fun createUsersWithArrayInput(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUsersWithArrayInputStubBuilder = + CreateUsersWithArrayInputStubBuilder(objectMapper, post(urlPathTemplate("/user/createWithArray")) + .configurer() + ) + + fun createUsersWithListInput(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUsersWithListInputStubBuilder = + CreateUsersWithListInputStubBuilder(objectMapper, post(urlPathTemplate("/user/createWithList")) + .configurer() + ) + + fun deleteUser(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeleteUserStubBuilder = + DeleteUserStubBuilder(objectMapper, delete(urlPathTemplate("/user/{username}")) + .withPathParam("username", username) + .configurer() + ) + + fun getUserByName(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetUserByNameStubBuilder = + GetUserByNameStubBuilder(objectMapper, get(urlPathTemplate("/user/{username}")) + .withPathParam("username", username) + .configurer() + ) + + fun loginUser(username: StringValuePattern? = null, password: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): LoginUserStubBuilder = + LoginUserStubBuilder(objectMapper, get(urlPathTemplate("/user/login")) + .apply { username?.let { withQueryParam("username", it) } } + .apply { password?.let { withQueryParam("password", it) } } + .configurer() + ) + + fun logoutUser(configurer: MappingBuilder.() -> MappingBuilder = { this }): LogoutUserStubBuilder = + LogoutUserStubBuilder(objectMapper, get(urlPathTemplate("/user/logout")) + .configurer() + ) + + fun updateUser(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdateUserStubBuilder = + UpdateUserStubBuilder(objectMapper, put(urlPathTemplate("/user/{username}")) + .withPathParam("username", username) + .configurer() + ) +} diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ModelApiResponse.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ApiResponse.kt similarity index 86% rename from samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ModelApiResponse.kt rename to samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ApiResponse.kt index 82a00d18b212..85fc4e476ec5 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ModelApiResponse.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ApiResponse.kt @@ -5,7 +5,7 @@ package org.openapitools.models -data class ModelApiResponse( +data class ApiResponse( val code: kotlin.Int?, val type: kotlin.String?, val message: kotlin.String?, diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt index 76db79fb5e89..2e3230eb4359 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt @@ -11,5 +11,5 @@ data class Order( val quantity: kotlin.Int?, val shipDate: java.time.OffsetDateTime?, val status: kotlin.String?, - val complete: kotlin.Boolean? = false, + val complete: kotlin.Boolean?, ) diff --git a/samples/server/petstore/kotlin-wiremock/src/test/kotlin/org/openapitools/apis/PetApiStubsTest.kt b/samples/server/petstore/kotlin-wiremock/src/test/kotlin/org/openapitools/apis/PetApiStubsTest.kt new file mode 100644 index 000000000000..2b3bb824e93e --- /dev/null +++ b/samples/server/petstore/kotlin-wiremock/src/test/kotlin/org/openapitools/apis/PetApiStubsTest.kt @@ -0,0 +1,44 @@ +package org.openapitools.apis + +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule +import com.fasterxml.jackson.module.kotlin.kotlinModule +import com.github.tomakehurst.wiremock.client.WireMock.equalTo +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo +import com.github.tomakehurst.wiremock.junit5.WireMockTest +import org.openapitools.models.Pet +import java.net.URI +import java.net.http.HttpClient +import java.net.http.HttpRequest +import java.net.http.HttpResponse +import kotlin.test.Test +import kotlin.test.assertEquals + +@WireMockTest +class PetApiStubsTest { + + private val objectMapper = ObjectMapper() + .registerModules(JavaTimeModule()) + .registerModules(kotlinModule()) + + private val stubs = PetApiStubs(objectMapper) + + private val client = HttpClient.newBuilder().build() + + @Test + fun `stub and retrieve`(wiremock: WireMockRuntimeInfo) { + val pet = Pet("Pet", emptyList(), null, null, null, null) + + wiremock.wireMock.register( + stubs.getPetById(equalTo("2")).respondWith200(pet) + ) + + val request = HttpRequest.newBuilder(URI.create(wiremock.httpBaseUrl + "/pet/1")) + .GET() + .build() + + val response = client.send(request, HttpResponse.BodyHandlers.ofString()) + + assertEquals(pet, objectMapper.readValue(response.body(), Pet::class.java)) + } +} \ No newline at end of file From da33ddd23d39c139adcf8625e6b16f2eb6d307d6 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sat, 18 May 2024 11:15:42 +0200 Subject: [PATCH 08/22] [kotlin-wiremock] Added default values and jackson annotations to models --- .../KotlinWiremockServerCodegen.java | 33 ++++++++++++++++++ .../resources/kotlin-wiremock/model.mustache | 10 ++++-- .../kotlin/org/openapitools/models/Bird.kt | 10 ++++-- .../org/openapitools/models/Category.kt | 10 ++++-- .../org/openapitools/models/DefaultValue.kt | 34 ++++++++++++++----- .../models/NumberPropertiesOnly.kt | 14 ++++++-- .../kotlin/org/openapitools/models/Pet.kt | 22 +++++++++--- .../kotlin/org/openapitools/models/Query.kt | 10 ++++-- .../org/openapitools/models/StringEnumRef.kt | 8 +++-- .../kotlin/org/openapitools/models/Tag.kt | 10 ++++-- ...lodeTrueArrayStringQueryObjectParameter.kt | 6 +++- .../org/openapitools/models/ApiResponse.kt | 14 ++++++-- .../org/openapitools/models/Category.kt | 10 ++++-- .../kotlin/org/openapitools/models/Order.kt | 26 ++++++++++---- .../kotlin/org/openapitools/models/Pet.kt | 22 +++++++++--- .../kotlin/org/openapitools/models/Tag.kt | 10 ++++-- .../kotlin/org/openapitools/models/User.kt | 34 ++++++++++++++----- 17 files changed, 229 insertions(+), 54 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java index a8f267f90454..554e596ea8cb 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java @@ -1,6 +1,7 @@ package org.openapitools.codegen.languages; import org.openapitools.codegen.CodegenConstants; +import org.openapitools.codegen.CodegenProperty; import org.openapitools.codegen.CodegenType; import org.openapitools.codegen.SupportingFile; import org.openapitools.codegen.meta.GeneratorMetadata; @@ -9,13 +10,19 @@ import org.openapitools.codegen.meta.features.ParameterFeature; import org.openapitools.codegen.meta.features.SecurityFeature; import org.openapitools.codegen.meta.features.WireFormatFeature; +import org.openapitools.codegen.model.ModelMap; +import org.openapitools.codegen.model.ModelsMap; import java.io.File; import java.util.EnumSet; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class KotlinWiremockServerCodegen extends AbstractKotlinCodegen { + protected static final String VENDOR_EXTENSION_BASE_NAME_LITERAL = "x-base-name-literal"; + @Override public CodegenType getTag() { return CodegenType.SERVER; @@ -90,6 +97,32 @@ public void processOpts() { ); } + @Override + public ModelsMap postProcessModels(ModelsMap objs) { + var objects = super.postProcessModels(objs); + + for (ModelMap model : objects.getModels()) { + var cm = model.getModel(); + var vars = Stream.of( + cm.vars, + cm.allVars, + cm.optionalVars, + cm.requiredVars, + cm.readOnlyVars, + cm.readWriteVars, + cm.parentVars + ) + .flatMap(List::stream) + .collect(Collectors.toList()); + + for (CodegenProperty var : vars) { + var.vendorExtensions.put(VENDOR_EXTENSION_BASE_NAME_LITERAL, var.baseName.replace("$", "\\$")); + } + } + + return objects; + } + @Override public void postProcess() { System.out.println("################################################################################"); diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache index 52d1edf056f5..076771996a79 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache @@ -5,13 +5,15 @@ package {{modelPackage}} +import com.fasterxml.jackson.annotation.JsonProperty + {{#models}} {{#model}} {{#isEnum}} enum class {{classname}} { {{#allowableValues}} {{#enumVars}} - {{&name}}, + @JsonProperty(value = {{#lambda.doublequote}}{{{value}}}{{/lambda.doublequote}}) {{&name}}, {{/enumVars}} {{/allowableValues}} } @@ -19,7 +21,11 @@ enum class {{classname}} { {{^isEnum}} data class {{classname}}( {{#allVars}} - val {{{name}}}: {{{dataType}}}{{^required}}?{{/required}}, + @field:JsonProperty("{{{vendorExtensions.x-base-name-literal}}}") + val {{{name}}}: {{{dataType}}}{{^required}}?{{/required}}{{! + !}}{{^required}} = {{^defaultValue}}null{{/defaultValue}}{{#defaultValue}}{{{.}}}{{/defaultValue}}{{/required}}{{! + }}{{#required}}{{#defaultValue}}{{{.}}}{{/defaultValue}}{{/required}}, + {{/allVars}} ) {{/isEnum}} diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Bird.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Bird.kt index a464613dbfa1..e98d044343b0 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Bird.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Bird.kt @@ -5,7 +5,13 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class Bird( - val propertySize: kotlin.String?, - val color: kotlin.String?, + @field:JsonProperty("size") + val propertySize: kotlin.String? = null, + + @field:JsonProperty("color") + val color: kotlin.String? = null, + ) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt index 05276682856c..8904ea0c3b82 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt @@ -5,7 +5,13 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class Category( - val id: kotlin.Long?, - val name: kotlin.String?, + @field:JsonProperty("id") + val id: kotlin.Long? = null, + + @field:JsonProperty("name") + val name: kotlin.String? = null, + ) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/DefaultValue.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/DefaultValue.kt index a4bef0507c3f..f99343080101 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/DefaultValue.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/DefaultValue.kt @@ -5,13 +5,31 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class DefaultValue( - val arrayStringEnumRefDefault: kotlin.collections.List?, - val arrayStringEnumDefault: kotlin.collections.List?, - val arrayStringDefault: kotlin.collections.List?, - val arrayIntegerDefault: kotlin.collections.List?, - val arrayString: kotlin.collections.List?, - val arrayStringNullable: kotlin.collections.List?, - val arrayStringExtensionNullable: kotlin.collections.List?, - val stringNullable: kotlin.String?, + @field:JsonProperty("array_string_enum_ref_default") + val arrayStringEnumRefDefault: kotlin.collections.List? = null, + + @field:JsonProperty("array_string_enum_default") + val arrayStringEnumDefault: kotlin.collections.List? = null, + + @field:JsonProperty("array_string_default") + val arrayStringDefault: kotlin.collections.List? = arrayListOf("failure","skipped"), + + @field:JsonProperty("array_integer_default") + val arrayIntegerDefault: kotlin.collections.List? = arrayListOf(1,3), + + @field:JsonProperty("array_string") + val arrayString: kotlin.collections.List? = null, + + @field:JsonProperty("array_string_nullable") + val arrayStringNullable: kotlin.collections.List? = null, + + @field:JsonProperty("array_string_extension_nullable") + val arrayStringExtensionNullable: kotlin.collections.List? = null, + + @field:JsonProperty("string_nullable") + val stringNullable: kotlin.String? = null, + ) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/NumberPropertiesOnly.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/NumberPropertiesOnly.kt index 6ec9c48bb48e..b16a9ec2306d 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/NumberPropertiesOnly.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/NumberPropertiesOnly.kt @@ -5,8 +5,16 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class NumberPropertiesOnly( - val number: java.math.BigDecimal?, - val float: kotlin.Float?, - val double: kotlin.Double?, + @field:JsonProperty("number") + val number: java.math.BigDecimal? = null, + + @field:JsonProperty("float") + val float: kotlin.Float? = null, + + @field:JsonProperty("double") + val double: kotlin.Double? = null, + ) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt index 4e5c9420c3fa..2498edf60525 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt @@ -5,11 +5,25 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class Pet( + @field:JsonProperty("name") val name: kotlin.String, + + @field:JsonProperty("photoUrls") val photoUrls: kotlin.collections.List, - val id: kotlin.Long?, - val category: Category?, - val tags: kotlin.collections.List?, - val status: kotlin.String?, + + @field:JsonProperty("id") + val id: kotlin.Long? = null, + + @field:JsonProperty("category") + val category: Category? = null, + + @field:JsonProperty("tags") + val tags: kotlin.collections.List? = null, + + @field:JsonProperty("status") + val status: kotlin.String? = null, + ) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Query.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Query.kt index d99052e71f8b..77b111d9042d 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Query.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Query.kt @@ -5,7 +5,13 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class Query( - val id: kotlin.Long?, - val outcomes: kotlin.collections.List?, + @field:JsonProperty("id") + val id: kotlin.Long? = null, + + @field:JsonProperty("outcomes") + val outcomes: kotlin.collections.List? = null, + ) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/StringEnumRef.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/StringEnumRef.kt index 4da9bf1ae3a5..8c89d4f7f8df 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/StringEnumRef.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/StringEnumRef.kt @@ -5,8 +5,10 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + enum class StringEnumRef { - success, - failure, - unclassified, + @JsonProperty(value = "success") success, + @JsonProperty(value = "failure") failure, + @JsonProperty(value = "unclassified") unclassified, } diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt index cdfd9a8f2231..b1b72f4cd188 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt @@ -5,7 +5,13 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class Tag( - val id: kotlin.Long?, - val name: kotlin.String?, + @field:JsonProperty("id") + val id: kotlin.Long? = null, + + @field:JsonProperty("name") + val name: kotlin.String? = null, + ) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter.kt index 5c8084cd6185..4f541fb34589 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/models/TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter.kt @@ -5,6 +5,10 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter( - val propertyValues: kotlin.collections.List?, + @field:JsonProperty("values") + val propertyValues: kotlin.collections.List? = null, + ) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ApiResponse.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ApiResponse.kt index 85fc4e476ec5..762ff9aefc91 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ApiResponse.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/ApiResponse.kt @@ -5,8 +5,16 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class ApiResponse( - val code: kotlin.Int?, - val type: kotlin.String?, - val message: kotlin.String?, + @field:JsonProperty("code") + val code: kotlin.Int? = null, + + @field:JsonProperty("type") + val type: kotlin.String? = null, + + @field:JsonProperty("message") + val message: kotlin.String? = null, + ) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt index 05276682856c..8904ea0c3b82 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Category.kt @@ -5,7 +5,13 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class Category( - val id: kotlin.Long?, - val name: kotlin.String?, + @field:JsonProperty("id") + val id: kotlin.Long? = null, + + @field:JsonProperty("name") + val name: kotlin.String? = null, + ) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt index 2e3230eb4359..bd5fb1641883 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Order.kt @@ -5,11 +5,25 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class Order( - val id: kotlin.Long?, - val petId: kotlin.Long?, - val quantity: kotlin.Int?, - val shipDate: java.time.OffsetDateTime?, - val status: kotlin.String?, - val complete: kotlin.Boolean?, + @field:JsonProperty("id") + val id: kotlin.Long? = null, + + @field:JsonProperty("petId") + val petId: kotlin.Long? = null, + + @field:JsonProperty("quantity") + val quantity: kotlin.Int? = null, + + @field:JsonProperty("shipDate") + val shipDate: java.time.OffsetDateTime? = null, + + @field:JsonProperty("status") + val status: kotlin.String? = null, + + @field:JsonProperty("complete") + val complete: kotlin.Boolean? = false, + ) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt index 4e5c9420c3fa..2498edf60525 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Pet.kt @@ -5,11 +5,25 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class Pet( + @field:JsonProperty("name") val name: kotlin.String, + + @field:JsonProperty("photoUrls") val photoUrls: kotlin.collections.List, - val id: kotlin.Long?, - val category: Category?, - val tags: kotlin.collections.List?, - val status: kotlin.String?, + + @field:JsonProperty("id") + val id: kotlin.Long? = null, + + @field:JsonProperty("category") + val category: Category? = null, + + @field:JsonProperty("tags") + val tags: kotlin.collections.List? = null, + + @field:JsonProperty("status") + val status: kotlin.String? = null, + ) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt index cdfd9a8f2231..b1b72f4cd188 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/Tag.kt @@ -5,7 +5,13 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class Tag( - val id: kotlin.Long?, - val name: kotlin.String?, + @field:JsonProperty("id") + val id: kotlin.Long? = null, + + @field:JsonProperty("name") + val name: kotlin.String? = null, + ) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/User.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/User.kt index dd35ce088054..1090a716110c 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/User.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/models/User.kt @@ -5,13 +5,31 @@ package org.openapitools.models +import com.fasterxml.jackson.annotation.JsonProperty + data class User( - val id: kotlin.Long?, - val username: kotlin.String?, - val firstName: kotlin.String?, - val lastName: kotlin.String?, - val email: kotlin.String?, - val password: kotlin.String?, - val phone: kotlin.String?, - val userStatus: kotlin.Int?, + @field:JsonProperty("id") + val id: kotlin.Long? = null, + + @field:JsonProperty("username") + val username: kotlin.String? = null, + + @field:JsonProperty("firstName") + val firstName: kotlin.String? = null, + + @field:JsonProperty("lastName") + val lastName: kotlin.String? = null, + + @field:JsonProperty("email") + val email: kotlin.String? = null, + + @field:JsonProperty("password") + val password: kotlin.String? = null, + + @field:JsonProperty("phone") + val phone: kotlin.String? = null, + + @field:JsonProperty("userStatus") + val userStatus: kotlin.Int? = null, + ) From ffd9dc3a21ba77415861bb88787c5e29cac29044 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 09:17:57 +0200 Subject: [PATCH 09/22] [kotlin-wiremock] Small default value fix --- .../src/main/resources/kotlin-wiremock/model.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache index 076771996a79..c060ec50935c 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/model.mustache @@ -24,7 +24,7 @@ data class {{classname}}( @field:JsonProperty("{{{vendorExtensions.x-base-name-literal}}}") val {{{name}}}: {{{dataType}}}{{^required}}?{{/required}}{{! !}}{{^required}} = {{^defaultValue}}null{{/defaultValue}}{{#defaultValue}}{{{.}}}{{/defaultValue}}{{/required}}{{! - }}{{#required}}{{#defaultValue}}{{{.}}}{{/defaultValue}}{{/required}}, + }}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}, {{/allVars}} ) From 496501c5bc3ba6613caf759e526cb554ab9b182c Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 09:31:45 +0200 Subject: [PATCH 10/22] [kotlin-wiremock] Use Gradle wrapper version in samples-kotlin-server GitHub workflow --- .github/workflows/samples-kotlin-server.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/samples-kotlin-server.yaml b/.github/workflows/samples-kotlin-server.yaml index 60724dd8c4db..996ac4af5b48 100644 --- a/.github/workflows/samples-kotlin-server.yaml +++ b/.github/workflows/samples-kotlin-server.yaml @@ -16,9 +16,6 @@ on: # comment out due to gradle build failure # - samples/server/petstore/kotlin-spring-default/** -env: - GRADLE_VERSION: 6.9 - jobs: build: name: Build Kotlin server @@ -66,7 +63,6 @@ jobs: - name: Install Gradle wrapper uses: eskatos/gradle-command-action@v3 with: - gradle-version: ${{ env.GRADLE_VERSION }} build-root-directory: ${{ matrix.sample }} arguments: wrapper - name: Build From 839d214353e44188eee19c50a7b6374b1e31c833 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 09:32:15 +0200 Subject: [PATCH 11/22] [kotlin-wiremock] Added default artifact name --- bin/configs/kotlin-wiremock-echo-api.yaml | 2 -- bin/configs/kotlin-wiremock.yaml | 2 -- .../codegen/languages/KotlinWiremockServerCodegen.java | 3 ++- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/bin/configs/kotlin-wiremock-echo-api.yaml b/bin/configs/kotlin-wiremock-echo-api.yaml index 585e308e5037..5230b295075a 100644 --- a/bin/configs/kotlin-wiremock-echo-api.yaml +++ b/bin/configs/kotlin-wiremock-echo-api.yaml @@ -2,5 +2,3 @@ generatorName: kotlin-wiremock outputDir: samples/server/echo_api/kotlin-wiremock inputSpec: modules/openapi-generator/src/test/resources/3_0/kotlin/echo_api.yaml templateDir: modules/openapi-generator/src/main/resources/kotlin-wiremock -additionalProperties: - artifactId: echo-api-kotlin-wiremock diff --git a/bin/configs/kotlin-wiremock.yaml b/bin/configs/kotlin-wiremock.yaml index c3864bfeb085..0e63dfe3cc41 100644 --- a/bin/configs/kotlin-wiremock.yaml +++ b/bin/configs/kotlin-wiremock.yaml @@ -2,5 +2,3 @@ generatorName: kotlin-wiremock outputDir: samples/server/petstore/kotlin-wiremock inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml templateDir: modules/openapi-generator/src/main/resources/kotlin-wiremock -additionalProperties: - artifactId: petstore-kotlin-wiremock diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java index 554e596ea8cb..2de5bda7e1fd 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinWiremockServerCodegen.java @@ -35,7 +35,7 @@ public String getName() { @Override public String getHelp() { - return "Generates Kotlin WireMock stubs, requests and responses samples."; + return "Generates Kotlin WireMock stub request and response samples."; } public KotlinWiremockServerCodegen() { @@ -45,6 +45,7 @@ public KotlinWiremockServerCodegen() { .stability(Stability.BETA) .build(); + setArtifactId("kotlin-wiremock"); setApiPackage(packageName + ".apis"); setModelPackage(packageName + ".models"); } From 518a6cab1db087cee07e10c623d48bba1e183976 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 09:51:38 +0200 Subject: [PATCH 12/22] [kotlin-wiremock] Added kotlin docs --- .../kotlin-wiremock/api-stub-builder.mustache | 21 ++ .../kotlin-wiremock/api-stub.mustache | 15 ++ .../kotlin-wiremock/settings.gradle.kts | 2 +- .../openapitools/apis/AuthApiStubBuilders.kt | 34 ++++ .../org/openapitools/apis/AuthApiStubs.kt | 15 ++ .../openapitools/apis/BodyApiStubBuilders.kt | 136 +++++++++++++ .../org/openapitools/apis/BodyApiStubs.kt | 51 +++++ .../openapitools/apis/FormApiStubBuilders.kt | 34 ++++ .../org/openapitools/apis/FormApiStubs.kt | 15 ++ .../apis/HeaderApiStubBuilders.kt | 17 ++ .../org/openapitools/apis/HeaderApiStubs.kt | 9 + .../openapitools/apis/PathApiStubBuilders.kt | 17 ++ .../org/openapitools/apis/PathApiStubs.kt | 13 ++ .../openapitools/apis/QueryApiStubBuilders.kt | 102 ++++++++++ .../org/openapitools/apis/QueryApiStubs.kt | 50 +++++ .../kotlin-wiremock/settings.gradle.kts | 2 +- .../openapitools/apis/PetApiStubBuilders.kt | 188 ++++++++++++++++++ .../org/openapitools/apis/PetApiStubs.kt | 57 ++++++ .../openapitools/apis/StoreApiStubBuilders.kt | 93 +++++++++ .../org/openapitools/apis/StoreApiStubs.kt | 29 +++ .../openapitools/apis/UserApiStubBuilders.kt | 133 +++++++++++++ .../org/openapitools/apis/UserApiStubs.kt | 56 ++++++ 22 files changed, 1087 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub-builder.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub-builder.mustache index 8ffcc5f905d8..620405e2239e 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub-builder.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub-builder.mustache @@ -15,10 +15,22 @@ import {{modelPackage}}.* {{#operations}} {{#operation}} +/** + * Builder for WireMock stubs of operation {{operationId}}. + */ class {{operationIdCamelCase}}StubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { {{#responses}} {{^wildcard}} + /** + * Let the stub for {{operationId}} respond with HTTP status code {{code}}. + * + {{#returnType}} + * @param body Response body for the [MappingBuilder]. + {{/returnType}} + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith{{code}}( {{#returnType}} body: {{{.}}}, @@ -36,6 +48,15 @@ class {{operationIdCamelCase}}StubBuilder internal constructor(private val objec {{/wildcard}} {{/responses}} + /** + * Let the stub for {{operationId}} respond with HTTP status code [code]. + * + {{#returnType}} + * @param body Response body for the [MappingBuilder]. + {{/returnType}} + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub.mustache index ce21b5cef1e0..f43cda686726 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub.mustache @@ -14,9 +14,24 @@ import com.github.tomakehurst.wiremock.matching.StringValuePattern import {{modelPackage}}.* {{#operations}} +/** + * WireMock stub request builder. + */ open class {{classname}}Stubs(private val objectMapper: ObjectMapper) { {{#operation}} + /** + * Construct a stub for the operation {{operationId}}. + * + {{#pathParams}} + * @param {{paramName}} Path parameter {{paramName}} pattern. + {{/pathParams}} + {{#queryParams}} + * @param {{paramName}} Query parameter {{paramName}} pattern. + {{/queryParams}} + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [{{operationIdCamelCase}}StubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun {{operationId}}({{#pathParams}}{{paramName}}: StringValuePattern, {{/pathParams}}{{#queryParams}}{{paramName}}: StringValuePattern? = null, {{/queryParams}}configurer: MappingBuilder.() -> MappingBuilder = { this }): {{operationIdCamelCase}}StubBuilder = {{operationIdCamelCase}}StubBuilder(objectMapper, {{#lambda.lowercase}}{{httpMethod}}{{/lambda.lowercase}}(urlPathTemplate("{{path}}")) {{#pathParams}} diff --git a/samples/server/echo_api/kotlin-wiremock/settings.gradle.kts b/samples/server/echo_api/kotlin-wiremock/settings.gradle.kts index c19bbc6e52fd..537908ca655b 100644 --- a/samples/server/echo_api/kotlin-wiremock/settings.gradle.kts +++ b/samples/server/echo_api/kotlin-wiremock/settings.gradle.kts @@ -1,4 +1,4 @@ -rootProject.name = "echo-api-kotlin-wiremock" +rootProject.name = "kotlin-wiremock" dependencyResolutionManagement { repositories { diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubBuilders.kt index 967e686ed46a..c12c8799572a 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubBuilders.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubBuilders.kt @@ -13,8 +13,18 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * Builder for WireMock stubs of operation testAuthHttpBasic. + */ class TestAuthHttpBasicStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testAuthHttpBasic respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -26,6 +36,13 @@ class TestAuthHttpBasicStubBuilder internal constructor(private val objectMapper .configurer() ) + /** + * Let the stub for testAuthHttpBasic respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -43,8 +60,18 @@ class TestAuthHttpBasicStubBuilder internal constructor(private val objectMapper ) } +/** + * Builder for WireMock stubs of operation testAuthHttpBearer. + */ class TestAuthHttpBearerStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testAuthHttpBearer respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -56,6 +83,13 @@ class TestAuthHttpBearerStubBuilder internal constructor(private val objectMappe .configurer() ) + /** + * Let the stub for testAuthHttpBearer respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubs.kt index 2a2992a85d77..0474266db95d 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubs.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubs.kt @@ -13,13 +13,28 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * WireMock stub request builder. + */ open class AuthApiStubs(private val objectMapper: ObjectMapper) { + /** + * Construct a stub for the operation testAuthHttpBasic. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestAuthHttpBasicStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testAuthHttpBasic(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestAuthHttpBasicStubBuilder = TestAuthHttpBasicStubBuilder(objectMapper, post(urlPathTemplate("/auth/http/basic")) .configurer() ) + /** + * Construct a stub for the operation testAuthHttpBearer. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestAuthHttpBearerStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testAuthHttpBearer(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestAuthHttpBearerStubBuilder = TestAuthHttpBearerStubBuilder(objectMapper, post(urlPathTemplate("/auth/http/bearer")) .configurer() diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubBuilders.kt index 99c2f0f1d65c..5a194438c010 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubBuilders.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubBuilders.kt @@ -13,8 +13,18 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * Builder for WireMock stubs of operation testBinaryGif. + */ class TestBinaryGifStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testBinaryGif respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: java.io.File, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -26,6 +36,13 @@ class TestBinaryGifStubBuilder internal constructor(private val objectMapper: Ob .configurer() ) + /** + * Let the stub for testBinaryGif respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -43,8 +60,18 @@ class TestBinaryGifStubBuilder internal constructor(private val objectMapper: Ob ) } +/** + * Builder for WireMock stubs of operation testBodyApplicationOctetstreamBinary. + */ class TestBodyApplicationOctetstreamBinaryStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testBodyApplicationOctetstreamBinary respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -56,6 +83,13 @@ class TestBodyApplicationOctetstreamBinaryStubBuilder internal constructor(priva .configurer() ) + /** + * Let the stub for testBodyApplicationOctetstreamBinary respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -73,8 +107,18 @@ class TestBodyApplicationOctetstreamBinaryStubBuilder internal constructor(priva ) } +/** + * Builder for WireMock stubs of operation testBodyMultipartFormdataArrayOfBinary. + */ class TestBodyMultipartFormdataArrayOfBinaryStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testBodyMultipartFormdataArrayOfBinary respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -86,6 +130,13 @@ class TestBodyMultipartFormdataArrayOfBinaryStubBuilder internal constructor(pri .configurer() ) + /** + * Let the stub for testBodyMultipartFormdataArrayOfBinary respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -103,8 +154,18 @@ class TestBodyMultipartFormdataArrayOfBinaryStubBuilder internal constructor(pri ) } +/** + * Builder for WireMock stubs of operation testBodyMultipartFormdataSingleBinary. + */ class TestBodyMultipartFormdataSingleBinaryStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testBodyMultipartFormdataSingleBinary respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -116,6 +177,13 @@ class TestBodyMultipartFormdataSingleBinaryStubBuilder internal constructor(priv .configurer() ) + /** + * Let the stub for testBodyMultipartFormdataSingleBinary respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -133,8 +201,18 @@ class TestBodyMultipartFormdataSingleBinaryStubBuilder internal constructor(priv ) } +/** + * Builder for WireMock stubs of operation testEchoBodyFreeFormObjectResponseString. + */ class TestEchoBodyFreeFormObjectResponseStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testEchoBodyFreeFormObjectResponseString respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -146,6 +224,13 @@ class TestEchoBodyFreeFormObjectResponseStringStubBuilder internal constructor(p .configurer() ) + /** + * Let the stub for testEchoBodyFreeFormObjectResponseString respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -163,8 +248,18 @@ class TestEchoBodyFreeFormObjectResponseStringStubBuilder internal constructor(p ) } +/** + * Builder for WireMock stubs of operation testEchoBodyPet. + */ class TestEchoBodyPetStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testEchoBodyPet respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: Pet, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -176,6 +271,13 @@ class TestEchoBodyPetStubBuilder internal constructor(private val objectMapper: .configurer() ) + /** + * Let the stub for testEchoBodyPet respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -193,8 +295,18 @@ class TestEchoBodyPetStubBuilder internal constructor(private val objectMapper: ) } +/** + * Builder for WireMock stubs of operation testEchoBodyPetResponseString. + */ class TestEchoBodyPetResponseStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testEchoBodyPetResponseString respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -206,6 +318,13 @@ class TestEchoBodyPetResponseStringStubBuilder internal constructor(private val .configurer() ) + /** + * Let the stub for testEchoBodyPetResponseString respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -223,8 +342,18 @@ class TestEchoBodyPetResponseStringStubBuilder internal constructor(private val ) } +/** + * Builder for WireMock stubs of operation testEchoBodyTagResponseString. + */ class TestEchoBodyTagResponseStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testEchoBodyTagResponseString respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -236,6 +365,13 @@ class TestEchoBodyTagResponseStringStubBuilder internal constructor(private val .configurer() ) + /** + * Let the stub for testEchoBodyTagResponseString respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubs.kt index 984147b7e871..a96f9f0e8502 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubs.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubs.kt @@ -13,43 +13,94 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * WireMock stub request builder. + */ open class BodyApiStubs(private val objectMapper: ObjectMapper) { + /** + * Construct a stub for the operation testBinaryGif. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestBinaryGifStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testBinaryGif(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBinaryGifStubBuilder = TestBinaryGifStubBuilder(objectMapper, post(urlPathTemplate("/binary/gif")) .configurer() ) + /** + * Construct a stub for the operation testBodyApplicationOctetstreamBinary. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestBodyApplicationOctetstreamBinaryStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testBodyApplicationOctetstreamBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyApplicationOctetstreamBinaryStubBuilder = TestBodyApplicationOctetstreamBinaryStubBuilder(objectMapper, post(urlPathTemplate("/body/application/octetstream/binary")) .configurer() ) + /** + * Construct a stub for the operation testBodyMultipartFormdataArrayOfBinary. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestBodyMultipartFormdataArrayOfBinaryStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testBodyMultipartFormdataArrayOfBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyMultipartFormdataArrayOfBinaryStubBuilder = TestBodyMultipartFormdataArrayOfBinaryStubBuilder(objectMapper, post(urlPathTemplate("/body/application/octetstream/array_of_binary")) .configurer() ) + /** + * Construct a stub for the operation testBodyMultipartFormdataSingleBinary. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestBodyMultipartFormdataSingleBinaryStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testBodyMultipartFormdataSingleBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyMultipartFormdataSingleBinaryStubBuilder = TestBodyMultipartFormdataSingleBinaryStubBuilder(objectMapper, post(urlPathTemplate("/body/application/octetstream/single_binary")) .configurer() ) + /** + * Construct a stub for the operation testEchoBodyFreeFormObjectResponseString. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestEchoBodyFreeFormObjectResponseStringStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testEchoBodyFreeFormObjectResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyFreeFormObjectResponseStringStubBuilder = TestEchoBodyFreeFormObjectResponseStringStubBuilder(objectMapper, post(urlPathTemplate("/echo/body/FreeFormObject/response_string")) .configurer() ) + /** + * Construct a stub for the operation testEchoBodyPet. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestEchoBodyPetStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testEchoBodyPet(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyPetStubBuilder = TestEchoBodyPetStubBuilder(objectMapper, post(urlPathTemplate("/echo/body/Pet")) .configurer() ) + /** + * Construct a stub for the operation testEchoBodyPetResponseString. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestEchoBodyPetResponseStringStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testEchoBodyPetResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyPetResponseStringStubBuilder = TestEchoBodyPetResponseStringStubBuilder(objectMapper, post(urlPathTemplate("/echo/body/Pet/response_string")) .configurer() ) + /** + * Construct a stub for the operation testEchoBodyTagResponseString. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestEchoBodyTagResponseStringStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testEchoBodyTagResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyTagResponseStringStubBuilder = TestEchoBodyTagResponseStringStubBuilder(objectMapper, post(urlPathTemplate("/echo/body/Tag/response_string")) .configurer() diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubBuilders.kt index ad1909a52ccc..4964effc4e72 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubBuilders.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubBuilders.kt @@ -13,8 +13,18 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * Builder for WireMock stubs of operation testFormIntegerBooleanString. + */ class TestFormIntegerBooleanStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testFormIntegerBooleanString respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -26,6 +36,13 @@ class TestFormIntegerBooleanStringStubBuilder internal constructor(private val o .configurer() ) + /** + * Let the stub for testFormIntegerBooleanString respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -43,8 +60,18 @@ class TestFormIntegerBooleanStringStubBuilder internal constructor(private val o ) } +/** + * Builder for WireMock stubs of operation testFormOneof. + */ class TestFormOneofStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testFormOneof respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -56,6 +83,13 @@ class TestFormOneofStubBuilder internal constructor(private val objectMapper: Ob .configurer() ) + /** + * Let the stub for testFormOneof respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubs.kt index 369fec485821..00cd50163c8d 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubs.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubs.kt @@ -13,13 +13,28 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * WireMock stub request builder. + */ open class FormApiStubs(private val objectMapper: ObjectMapper) { + /** + * Construct a stub for the operation testFormIntegerBooleanString. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestFormIntegerBooleanStringStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testFormIntegerBooleanString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestFormIntegerBooleanStringStubBuilder = TestFormIntegerBooleanStringStubBuilder(objectMapper, post(urlPathTemplate("/form/integer/boolean/string")) .configurer() ) + /** + * Construct a stub for the operation testFormOneof. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestFormOneofStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testFormOneof(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestFormOneofStubBuilder = TestFormOneofStubBuilder(objectMapper, post(urlPathTemplate("/form/oneof")) .configurer() diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubBuilders.kt index df13c00c2ca3..d5f572ab955c 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubBuilders.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubBuilders.kt @@ -13,8 +13,18 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * Builder for WireMock stubs of operation testHeaderIntegerBooleanStringEnums. + */ class TestHeaderIntegerBooleanStringEnumsStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testHeaderIntegerBooleanStringEnums respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -26,6 +36,13 @@ class TestHeaderIntegerBooleanStringEnumsStubBuilder internal constructor(privat .configurer() ) + /** + * Let the stub for testHeaderIntegerBooleanStringEnums respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubs.kt index 4dea547497c9..0d5e608fe7ae 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubs.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubs.kt @@ -13,8 +13,17 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * WireMock stub request builder. + */ open class HeaderApiStubs(private val objectMapper: ObjectMapper) { + /** + * Construct a stub for the operation testHeaderIntegerBooleanStringEnums. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestHeaderIntegerBooleanStringEnumsStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testHeaderIntegerBooleanStringEnums(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestHeaderIntegerBooleanStringEnumsStubBuilder = TestHeaderIntegerBooleanStringEnumsStubBuilder(objectMapper, get(urlPathTemplate("/header/integer/boolean/string/enums")) .configurer() diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubBuilders.kt index 5fdb5bb58adc..79e19365b15e 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubBuilders.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubBuilders.kt @@ -13,8 +13,18 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * Builder for WireMock stubs of operation testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath. + */ class TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -26,6 +36,13 @@ class TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStri .configurer() ) + /** + * Let the stub for testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubs.kt index d1e1eccdede2..e5e4350fb484 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubs.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubs.kt @@ -13,8 +13,21 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * WireMock stub request builder. + */ open class PathApiStubs(private val objectMapper: ObjectMapper) { + /** + * Construct a stub for the operation testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath. + * + * @param pathString Path parameter pathString pattern. + * @param pathInteger Path parameter pathInteger pattern. + * @param enumNonrefStringPath Path parameter enumNonrefStringPath pattern. + * @param enumRefStringPath Path parameter enumRefStringPath pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath(pathString: StringValuePattern, pathInteger: StringValuePattern, enumNonrefStringPath: StringValuePattern, enumRefStringPath: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder = TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder(objectMapper, get(urlPathTemplate("/path/string/{path_string}/integer/{path_integer}/{enum_nonref_string_path}/{enum_ref_string_path}")) .withPathParam("pathString", pathString) diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubBuilders.kt index 70574df68e9f..81cd12fd688a 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubBuilders.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubBuilders.kt @@ -13,8 +13,18 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * Builder for WireMock stubs of operation testEnumRefString. + */ class TestEnumRefStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testEnumRefString respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -26,6 +36,13 @@ class TestEnumRefStringStubBuilder internal constructor(private val objectMapper .configurer() ) + /** + * Let the stub for testEnumRefString respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -43,8 +60,18 @@ class TestEnumRefStringStubBuilder internal constructor(private val objectMapper ) } +/** + * Builder for WireMock stubs of operation testQueryDatetimeDateString. + */ class TestQueryDatetimeDateStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testQueryDatetimeDateString respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -56,6 +83,13 @@ class TestQueryDatetimeDateStringStubBuilder internal constructor(private val ob .configurer() ) + /** + * Let the stub for testQueryDatetimeDateString respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -73,8 +107,18 @@ class TestQueryDatetimeDateStringStubBuilder internal constructor(private val ob ) } +/** + * Builder for WireMock stubs of operation testQueryIntegerBooleanString. + */ class TestQueryIntegerBooleanStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testQueryIntegerBooleanString respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -86,6 +130,13 @@ class TestQueryIntegerBooleanStringStubBuilder internal constructor(private val .configurer() ) + /** + * Let the stub for testQueryIntegerBooleanString respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -103,8 +154,18 @@ class TestQueryIntegerBooleanStringStubBuilder internal constructor(private val ) } +/** + * Builder for WireMock stubs of operation testQueryStyleDeepObjectExplodeTrueObject. + */ class TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testQueryStyleDeepObjectExplodeTrueObject respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -116,6 +177,13 @@ class TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder internal constructor( .configurer() ) + /** + * Let the stub for testQueryStyleDeepObjectExplodeTrueObject respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -133,8 +201,18 @@ class TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder internal constructor( ) } +/** + * Builder for WireMock stubs of operation testQueryStyleFormExplodeTrueArrayString. + */ class TestQueryStyleFormExplodeTrueArrayStringStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testQueryStyleFormExplodeTrueArrayString respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -146,6 +224,13 @@ class TestQueryStyleFormExplodeTrueArrayStringStubBuilder internal constructor(p .configurer() ) + /** + * Let the stub for testQueryStyleFormExplodeTrueArrayString respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -163,8 +248,18 @@ class TestQueryStyleFormExplodeTrueArrayStringStubBuilder internal constructor(p ) } +/** + * Builder for WireMock stubs of operation testQueryStyleFormExplodeTrueObject. + */ class TestQueryStyleFormExplodeTrueObjectStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for testQueryStyleFormExplodeTrueObject respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -176,6 +271,13 @@ class TestQueryStyleFormExplodeTrueObjectStubBuilder internal constructor(privat .configurer() ) + /** + * Let the stub for testQueryStyleFormExplodeTrueObject respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubs.kt index 39e64774f779..d2b71b443167 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubs.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubs.kt @@ -13,8 +13,19 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * WireMock stub request builder. + */ open class QueryApiStubs(private val objectMapper: ObjectMapper) { + /** + * Construct a stub for the operation testEnumRefString. + * + * @param enumNonrefStringQuery Query parameter enumNonrefStringQuery pattern. + * @param enumRefStringQuery Query parameter enumRefStringQuery pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestEnumRefStringStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testEnumRefString(enumNonrefStringQuery: StringValuePattern? = null, enumRefStringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEnumRefStringStubBuilder = TestEnumRefStringStubBuilder(objectMapper, get(urlPathTemplate("/query/enum_ref_string")) .apply { enumNonrefStringQuery?.let { withQueryParam("enumNonrefStringQuery", it) } } @@ -22,6 +33,15 @@ open class QueryApiStubs(private val objectMapper: ObjectMapper) { .configurer() ) + /** + * Construct a stub for the operation testQueryDatetimeDateString. + * + * @param datetimeQuery Query parameter datetimeQuery pattern. + * @param dateQuery Query parameter dateQuery pattern. + * @param stringQuery Query parameter stringQuery pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestQueryDatetimeDateStringStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testQueryDatetimeDateString(datetimeQuery: StringValuePattern? = null, dateQuery: StringValuePattern? = null, stringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryDatetimeDateStringStubBuilder = TestQueryDatetimeDateStringStubBuilder(objectMapper, get(urlPathTemplate("/query/datetime/date/string")) .apply { datetimeQuery?.let { withQueryParam("datetimeQuery", it) } } @@ -30,6 +50,15 @@ open class QueryApiStubs(private val objectMapper: ObjectMapper) { .configurer() ) + /** + * Construct a stub for the operation testQueryIntegerBooleanString. + * + * @param integerQuery Query parameter integerQuery pattern. + * @param booleanQuery Query parameter booleanQuery pattern. + * @param stringQuery Query parameter stringQuery pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestQueryIntegerBooleanStringStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testQueryIntegerBooleanString(integerQuery: StringValuePattern? = null, booleanQuery: StringValuePattern? = null, stringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryIntegerBooleanStringStubBuilder = TestQueryIntegerBooleanStringStubBuilder(objectMapper, get(urlPathTemplate("/query/integer/boolean/string")) .apply { integerQuery?.let { withQueryParam("integerQuery", it) } } @@ -38,18 +67,39 @@ open class QueryApiStubs(private val objectMapper: ObjectMapper) { .configurer() ) + /** + * Construct a stub for the operation testQueryStyleDeepObjectExplodeTrueObject. + * + * @param queryObject Query parameter queryObject pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testQueryStyleDeepObjectExplodeTrueObject(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder = TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder(objectMapper, get(urlPathTemplate("/query/style_deepObject/explode_true/object")) .apply { queryObject?.let { withQueryParam("queryObject", it) } } .configurer() ) + /** + * Construct a stub for the operation testQueryStyleFormExplodeTrueArrayString. + * + * @param queryObject Query parameter queryObject pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestQueryStyleFormExplodeTrueArrayStringStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testQueryStyleFormExplodeTrueArrayString(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleFormExplodeTrueArrayStringStubBuilder = TestQueryStyleFormExplodeTrueArrayStringStubBuilder(objectMapper, get(urlPathTemplate("/query/style_form/explode_true/array_string")) .apply { queryObject?.let { withQueryParam("queryObject", it) } } .configurer() ) + /** + * Construct a stub for the operation testQueryStyleFormExplodeTrueObject. + * + * @param queryObject Query parameter queryObject pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [TestQueryStyleFormExplodeTrueObjectStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun testQueryStyleFormExplodeTrueObject(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleFormExplodeTrueObjectStubBuilder = TestQueryStyleFormExplodeTrueObjectStubBuilder(objectMapper, get(urlPathTemplate("/query/style_form/explode_true/object")) .apply { queryObject?.let { withQueryParam("queryObject", it) } } diff --git a/samples/server/petstore/kotlin-wiremock/settings.gradle.kts b/samples/server/petstore/kotlin-wiremock/settings.gradle.kts index 2953b690dda4..537908ca655b 100644 --- a/samples/server/petstore/kotlin-wiremock/settings.gradle.kts +++ b/samples/server/petstore/kotlin-wiremock/settings.gradle.kts @@ -1,4 +1,4 @@ -rootProject.name = "petstore-kotlin-wiremock" +rootProject.name = "kotlin-wiremock" dependencyResolutionManagement { repositories { diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubBuilders.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubBuilders.kt index 6cf0f6f3f535..923d6fd551b3 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubBuilders.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubBuilders.kt @@ -13,8 +13,18 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * Builder for WireMock stubs of operation addPet. + */ class AddPetStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for addPet respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: Pet, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -26,6 +36,13 @@ class AddPetStubBuilder internal constructor(private val objectMapper: ObjectMap .configurer() ) + /** + * Let the stub for addPet respond with HTTP status code 405. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith405( body: Pet, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -37,6 +54,13 @@ class AddPetStubBuilder internal constructor(private val objectMapper: ObjectMap .configurer() ) + /** + * Let the stub for addPet respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -54,8 +78,17 @@ class AddPetStubBuilder internal constructor(private val objectMapper: ObjectMap ) } +/** + * Builder for WireMock stubs of operation deletePet. + */ class DeletePetStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for deletePet respond with HTTP status code 400. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith400( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = @@ -64,6 +97,12 @@ class DeletePetStubBuilder internal constructor(private val objectMapper: Object .configurer() ) + /** + * Let the stub for deletePet respond with HTTP status code [code]. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -81,8 +120,18 @@ class DeletePetStubBuilder internal constructor(private val objectMapper: Object ) } +/** + * Builder for WireMock stubs of operation findPetsByStatus. + */ class FindPetsByStatusStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for findPetsByStatus respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.collections.List, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -94,6 +143,13 @@ class FindPetsByStatusStubBuilder internal constructor(private val objectMapper: .configurer() ) + /** + * Let the stub for findPetsByStatus respond with HTTP status code 400. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith400( body: kotlin.collections.List, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -105,6 +161,13 @@ class FindPetsByStatusStubBuilder internal constructor(private val objectMapper: .configurer() ) + /** + * Let the stub for findPetsByStatus respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -122,8 +185,18 @@ class FindPetsByStatusStubBuilder internal constructor(private val objectMapper: ) } +/** + * Builder for WireMock stubs of operation findPetsByTags. + */ class FindPetsByTagsStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for findPetsByTags respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.collections.List, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -135,6 +208,13 @@ class FindPetsByTagsStubBuilder internal constructor(private val objectMapper: O .configurer() ) + /** + * Let the stub for findPetsByTags respond with HTTP status code 400. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith400( body: kotlin.collections.List, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -146,6 +226,13 @@ class FindPetsByTagsStubBuilder internal constructor(private val objectMapper: O .configurer() ) + /** + * Let the stub for findPetsByTags respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -163,8 +250,18 @@ class FindPetsByTagsStubBuilder internal constructor(private val objectMapper: O ) } +/** + * Builder for WireMock stubs of operation getPetById. + */ class GetPetByIdStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for getPetById respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: Pet, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -176,6 +273,13 @@ class GetPetByIdStubBuilder internal constructor(private val objectMapper: Objec .configurer() ) + /** + * Let the stub for getPetById respond with HTTP status code 400. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith400( body: Pet, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -187,6 +291,13 @@ class GetPetByIdStubBuilder internal constructor(private val objectMapper: Objec .configurer() ) + /** + * Let the stub for getPetById respond with HTTP status code 404. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith404( body: Pet, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -198,6 +309,13 @@ class GetPetByIdStubBuilder internal constructor(private val objectMapper: Objec .configurer() ) + /** + * Let the stub for getPetById respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -215,8 +333,18 @@ class GetPetByIdStubBuilder internal constructor(private val objectMapper: Objec ) } +/** + * Builder for WireMock stubs of operation updatePet. + */ class UpdatePetStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for updatePet respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: Pet, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -228,6 +356,13 @@ class UpdatePetStubBuilder internal constructor(private val objectMapper: Object .configurer() ) + /** + * Let the stub for updatePet respond with HTTP status code 400. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith400( body: Pet, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -239,6 +374,13 @@ class UpdatePetStubBuilder internal constructor(private val objectMapper: Object .configurer() ) + /** + * Let the stub for updatePet respond with HTTP status code 404. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith404( body: Pet, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -250,6 +392,13 @@ class UpdatePetStubBuilder internal constructor(private val objectMapper: Object .configurer() ) + /** + * Let the stub for updatePet respond with HTTP status code 405. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith405( body: Pet, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -261,6 +410,13 @@ class UpdatePetStubBuilder internal constructor(private val objectMapper: Object .configurer() ) + /** + * Let the stub for updatePet respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -278,8 +434,17 @@ class UpdatePetStubBuilder internal constructor(private val objectMapper: Object ) } +/** + * Builder for WireMock stubs of operation updatePetWithForm. + */ class UpdatePetWithFormStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for updatePetWithForm respond with HTTP status code 405. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith405( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = @@ -288,6 +453,12 @@ class UpdatePetWithFormStubBuilder internal constructor(private val objectMapper .configurer() ) + /** + * Let the stub for updatePetWithForm respond with HTTP status code [code]. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -305,8 +476,18 @@ class UpdatePetWithFormStubBuilder internal constructor(private val objectMapper ) } +/** + * Builder for WireMock stubs of operation uploadFile. + */ class UploadFileStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for uploadFile respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: ApiResponse, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -318,6 +499,13 @@ class UploadFileStubBuilder internal constructor(private val objectMapper: Objec .configurer() ) + /** + * Let the stub for uploadFile respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubs.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubs.kt index 720fedc08f95..4e16ceda201f 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubs.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubs.kt @@ -13,48 +13,105 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * WireMock stub request builder. + */ open class PetApiStubs(private val objectMapper: ObjectMapper) { + /** + * Construct a stub for the operation addPet. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [AddPetStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun addPet(configurer: MappingBuilder.() -> MappingBuilder = { this }): AddPetStubBuilder = AddPetStubBuilder(objectMapper, post(urlPathTemplate("/pet")) .configurer() ) + /** + * Construct a stub for the operation deletePet. + * + * @param petId Path parameter petId pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [DeletePetStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun deletePet(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeletePetStubBuilder = DeletePetStubBuilder(objectMapper, delete(urlPathTemplate("/pet/{petId}")) .withPathParam("petId", petId) .configurer() ) + /** + * Construct a stub for the operation findPetsByStatus. + * + * @param status Query parameter status pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [FindPetsByStatusStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun findPetsByStatus(status: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): FindPetsByStatusStubBuilder = FindPetsByStatusStubBuilder(objectMapper, get(urlPathTemplate("/pet/findByStatus")) .apply { status?.let { withQueryParam("status", it) } } .configurer() ) + /** + * Construct a stub for the operation findPetsByTags. + * + * @param tags Query parameter tags pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [FindPetsByTagsStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun findPetsByTags(tags: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): FindPetsByTagsStubBuilder = FindPetsByTagsStubBuilder(objectMapper, get(urlPathTemplate("/pet/findByTags")) .apply { tags?.let { withQueryParam("tags", it) } } .configurer() ) + /** + * Construct a stub for the operation getPetById. + * + * @param petId Path parameter petId pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [GetPetByIdStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun getPetById(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetPetByIdStubBuilder = GetPetByIdStubBuilder(objectMapper, get(urlPathTemplate("/pet/{petId}")) .withPathParam("petId", petId) .configurer() ) + /** + * Construct a stub for the operation updatePet. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [UpdatePetStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun updatePet(configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdatePetStubBuilder = UpdatePetStubBuilder(objectMapper, put(urlPathTemplate("/pet")) .configurer() ) + /** + * Construct a stub for the operation updatePetWithForm. + * + * @param petId Path parameter petId pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [UpdatePetWithFormStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun updatePetWithForm(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdatePetWithFormStubBuilder = UpdatePetWithFormStubBuilder(objectMapper, post(urlPathTemplate("/pet/{petId}")) .withPathParam("petId", petId) .configurer() ) + /** + * Construct a stub for the operation uploadFile. + * + * @param petId Path parameter petId pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [UploadFileStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun uploadFile(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UploadFileStubBuilder = UploadFileStubBuilder(objectMapper, post(urlPathTemplate("/pet/{petId}/uploadImage")) .withPathParam("petId", petId) diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubBuilders.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubBuilders.kt index 7b61203d585a..bbca4042d12a 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubBuilders.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubBuilders.kt @@ -13,8 +13,17 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * Builder for WireMock stubs of operation deleteOrder. + */ class DeleteOrderStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for deleteOrder respond with HTTP status code 400. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith400( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = @@ -23,6 +32,12 @@ class DeleteOrderStubBuilder internal constructor(private val objectMapper: Obje .configurer() ) + /** + * Let the stub for deleteOrder respond with HTTP status code 404. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith404( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = @@ -31,6 +46,12 @@ class DeleteOrderStubBuilder internal constructor(private val objectMapper: Obje .configurer() ) + /** + * Let the stub for deleteOrder respond with HTTP status code [code]. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -48,8 +69,18 @@ class DeleteOrderStubBuilder internal constructor(private val objectMapper: Obje ) } +/** + * Builder for WireMock stubs of operation getInventory. + */ class GetInventoryStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for getInventory respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.collections.Map, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -61,6 +92,13 @@ class GetInventoryStubBuilder internal constructor(private val objectMapper: Obj .configurer() ) + /** + * Let the stub for getInventory respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -78,8 +116,18 @@ class GetInventoryStubBuilder internal constructor(private val objectMapper: Obj ) } +/** + * Builder for WireMock stubs of operation getOrderById. + */ class GetOrderByIdStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for getOrderById respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: Order, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -91,6 +139,13 @@ class GetOrderByIdStubBuilder internal constructor(private val objectMapper: Obj .configurer() ) + /** + * Let the stub for getOrderById respond with HTTP status code 400. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith400( body: Order, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -102,6 +157,13 @@ class GetOrderByIdStubBuilder internal constructor(private val objectMapper: Obj .configurer() ) + /** + * Let the stub for getOrderById respond with HTTP status code 404. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith404( body: Order, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -113,6 +175,13 @@ class GetOrderByIdStubBuilder internal constructor(private val objectMapper: Obj .configurer() ) + /** + * Let the stub for getOrderById respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -130,8 +199,18 @@ class GetOrderByIdStubBuilder internal constructor(private val objectMapper: Obj ) } +/** + * Builder for WireMock stubs of operation placeOrder. + */ class PlaceOrderStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for placeOrder respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: Order, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -143,6 +222,13 @@ class PlaceOrderStubBuilder internal constructor(private val objectMapper: Objec .configurer() ) + /** + * Let the stub for placeOrder respond with HTTP status code 400. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith400( body: Order, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -154,6 +240,13 @@ class PlaceOrderStubBuilder internal constructor(private val objectMapper: Objec .configurer() ) + /** + * Let the stub for placeOrder respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubs.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubs.kt index b86c054c8c9d..27bc79580b87 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubs.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubs.kt @@ -13,25 +13,54 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * WireMock stub request builder. + */ open class StoreApiStubs(private val objectMapper: ObjectMapper) { + /** + * Construct a stub for the operation deleteOrder. + * + * @param orderId Path parameter orderId pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [DeleteOrderStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun deleteOrder(orderId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeleteOrderStubBuilder = DeleteOrderStubBuilder(objectMapper, delete(urlPathTemplate("/store/order/{orderId}")) .withPathParam("orderId", orderId) .configurer() ) + /** + * Construct a stub for the operation getInventory. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [GetInventoryStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun getInventory(configurer: MappingBuilder.() -> MappingBuilder = { this }): GetInventoryStubBuilder = GetInventoryStubBuilder(objectMapper, get(urlPathTemplate("/store/inventory")) .configurer() ) + /** + * Construct a stub for the operation getOrderById. + * + * @param orderId Path parameter orderId pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [GetOrderByIdStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun getOrderById(orderId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetOrderByIdStubBuilder = GetOrderByIdStubBuilder(objectMapper, get(urlPathTemplate("/store/order/{orderId}")) .withPathParam("orderId", orderId) .configurer() ) + /** + * Construct a stub for the operation placeOrder. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [PlaceOrderStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun placeOrder(configurer: MappingBuilder.() -> MappingBuilder = { this }): PlaceOrderStubBuilder = PlaceOrderStubBuilder(objectMapper, post(urlPathTemplate("/store/order")) .configurer() diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubBuilders.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubBuilders.kt index 182f75401a76..a3798bae2216 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubBuilders.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubBuilders.kt @@ -13,8 +13,17 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * Builder for WireMock stubs of operation createUser. + */ class CreateUserStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for createUser respond with HTTP status code [code]. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -32,8 +41,17 @@ class CreateUserStubBuilder internal constructor(private val objectMapper: Objec ) } +/** + * Builder for WireMock stubs of operation createUsersWithArrayInput. + */ class CreateUsersWithArrayInputStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for createUsersWithArrayInput respond with HTTP status code [code]. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -51,8 +69,17 @@ class CreateUsersWithArrayInputStubBuilder internal constructor(private val obje ) } +/** + * Builder for WireMock stubs of operation createUsersWithListInput. + */ class CreateUsersWithListInputStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for createUsersWithListInput respond with HTTP status code [code]. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -70,8 +97,17 @@ class CreateUsersWithListInputStubBuilder internal constructor(private val objec ) } +/** + * Builder for WireMock stubs of operation deleteUser. + */ class DeleteUserStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for deleteUser respond with HTTP status code 400. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith400( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = @@ -80,6 +116,12 @@ class DeleteUserStubBuilder internal constructor(private val objectMapper: Objec .configurer() ) + /** + * Let the stub for deleteUser respond with HTTP status code 404. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith404( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = @@ -88,6 +130,12 @@ class DeleteUserStubBuilder internal constructor(private val objectMapper: Objec .configurer() ) + /** + * Let the stub for deleteUser respond with HTTP status code [code]. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -105,8 +153,18 @@ class DeleteUserStubBuilder internal constructor(private val objectMapper: Objec ) } +/** + * Builder for WireMock stubs of operation getUserByName. + */ class GetUserByNameStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for getUserByName respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: User, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -118,6 +176,13 @@ class GetUserByNameStubBuilder internal constructor(private val objectMapper: Ob .configurer() ) + /** + * Let the stub for getUserByName respond with HTTP status code 400. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith400( body: User, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -129,6 +194,13 @@ class GetUserByNameStubBuilder internal constructor(private val objectMapper: Ob .configurer() ) + /** + * Let the stub for getUserByName respond with HTTP status code 404. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith404( body: User, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -140,6 +212,13 @@ class GetUserByNameStubBuilder internal constructor(private val objectMapper: Ob .configurer() ) + /** + * Let the stub for getUserByName respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -157,8 +236,18 @@ class GetUserByNameStubBuilder internal constructor(private val objectMapper: Ob ) } +/** + * Builder for WireMock stubs of operation loginUser. + */ class LoginUserStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for loginUser respond with HTTP status code 200. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith200( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -170,6 +259,13 @@ class LoginUserStubBuilder internal constructor(private val objectMapper: Object .configurer() ) + /** + * Let the stub for loginUser respond with HTTP status code 400. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith400( body: kotlin.String, configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -181,6 +277,13 @@ class LoginUserStubBuilder internal constructor(private val objectMapper: Object .configurer() ) + /** + * Let the stub for loginUser respond with HTTP status code [code]. + * + * @param body Response body for the [MappingBuilder]. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -198,8 +301,17 @@ class LoginUserStubBuilder internal constructor(private val objectMapper: Object ) } +/** + * Builder for WireMock stubs of operation logoutUser. + */ class LogoutUserStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for logoutUser respond with HTTP status code [code]. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, @@ -217,8 +329,17 @@ class LogoutUserStubBuilder internal constructor(private val objectMapper: Objec ) } +/** + * Builder for WireMock stubs of operation updateUser. + */ class UpdateUserStubBuilder internal constructor(private val objectMapper: ObjectMapper, private val stub: MappingBuilder) { + /** + * Let the stub for updateUser respond with HTTP status code 400. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith400( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = @@ -227,6 +348,12 @@ class UpdateUserStubBuilder internal constructor(private val objectMapper: Objec .configurer() ) + /** + * Let the stub for updateUser respond with HTTP status code 404. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith404( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, ): MappingBuilder = @@ -235,6 +362,12 @@ class UpdateUserStubBuilder internal constructor(private val objectMapper: Objec .configurer() ) + /** + * Let the stub for updateUser respond with HTTP status code [code]. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [MappingBuilder] to be registered with a WireMock instance. + */ fun respondWith( code: Int, body: Any? = null, diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubs.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubs.kt index 32c999d0dad3..639908cd0995 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubs.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubs.kt @@ -13,35 +13,78 @@ import com.github.tomakehurst.wiremock.client.WireMock.* import com.github.tomakehurst.wiremock.matching.StringValuePattern import org.openapitools.models.* +/** + * WireMock stub request builder. + */ open class UserApiStubs(private val objectMapper: ObjectMapper) { + /** + * Construct a stub for the operation createUser. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [CreateUserStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun createUser(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUserStubBuilder = CreateUserStubBuilder(objectMapper, post(urlPathTemplate("/user")) .configurer() ) + /** + * Construct a stub for the operation createUsersWithArrayInput. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [CreateUsersWithArrayInputStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun createUsersWithArrayInput(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUsersWithArrayInputStubBuilder = CreateUsersWithArrayInputStubBuilder(objectMapper, post(urlPathTemplate("/user/createWithArray")) .configurer() ) + /** + * Construct a stub for the operation createUsersWithListInput. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [CreateUsersWithListInputStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun createUsersWithListInput(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUsersWithListInputStubBuilder = CreateUsersWithListInputStubBuilder(objectMapper, post(urlPathTemplate("/user/createWithList")) .configurer() ) + /** + * Construct a stub for the operation deleteUser. + * + * @param username Path parameter username pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [DeleteUserStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun deleteUser(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeleteUserStubBuilder = DeleteUserStubBuilder(objectMapper, delete(urlPathTemplate("/user/{username}")) .withPathParam("username", username) .configurer() ) + /** + * Construct a stub for the operation getUserByName. + * + * @param username Path parameter username pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [GetUserByNameStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun getUserByName(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetUserByNameStubBuilder = GetUserByNameStubBuilder(objectMapper, get(urlPathTemplate("/user/{username}")) .withPathParam("username", username) .configurer() ) + /** + * Construct a stub for the operation loginUser. + * + * @param username Query parameter username pattern. + * @param password Query parameter password pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [LoginUserStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun loginUser(username: StringValuePattern? = null, password: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): LoginUserStubBuilder = LoginUserStubBuilder(objectMapper, get(urlPathTemplate("/user/login")) .apply { username?.let { withQueryParam("username", it) } } @@ -49,11 +92,24 @@ open class UserApiStubs(private val objectMapper: ObjectMapper) { .configurer() ) + /** + * Construct a stub for the operation logoutUser. + * + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [LogoutUserStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun logoutUser(configurer: MappingBuilder.() -> MappingBuilder = { this }): LogoutUserStubBuilder = LogoutUserStubBuilder(objectMapper, get(urlPathTemplate("/user/logout")) .configurer() ) + /** + * Construct a stub for the operation updateUser. + * + * @param username Path parameter username pattern. + * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return A [UpdateUserStubBuilder] to configure the response, and the final [MappingBuilder]. + */ fun updateUser(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdateUserStubBuilder = UpdateUserStubBuilder(objectMapper, put(urlPathTemplate("/user/{username}")) .withPathParam("username", username) From 039891c3113087ba24aabbf5d1f83b9a7277a02a Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 09:54:47 +0200 Subject: [PATCH 13/22] [kotlin-wiremock] Fixed capitalization in kotlin docs --- .../kotlin-wiremock/api-stub-builder.mustache | 12 +- .../kotlin-wiremock/api-stub.mustache | 6 +- .../openapitools/apis/AuthApiStubBuilders.kt | 24 ++-- .../org/openapitools/apis/AuthApiStubs.kt | 4 +- .../openapitools/apis/BodyApiStubBuilders.kt | 96 ++++++------- .../org/openapitools/apis/BodyApiStubs.kt | 16 +-- .../openapitools/apis/FormApiStubBuilders.kt | 24 ++-- .../org/openapitools/apis/FormApiStubs.kt | 4 +- .../apis/HeaderApiStubBuilders.kt | 12 +- .../org/openapitools/apis/HeaderApiStubs.kt | 2 +- .../openapitools/apis/PathApiStubBuilders.kt | 12 +- .../org/openapitools/apis/PathApiStubs.kt | 10 +- .../openapitools/apis/QueryApiStubBuilders.kt | 72 +++++----- .../org/openapitools/apis/QueryApiStubs.kt | 34 ++--- .../openapitools/apis/PetApiStubBuilders.kt | 136 +++++++++--------- .../org/openapitools/apis/PetApiStubs.kt | 28 ++-- .../openapitools/apis/StoreApiStubBuilders.kt | 66 ++++----- .../org/openapitools/apis/StoreApiStubs.kt | 12 +- .../openapitools/apis/UserApiStubBuilders.kt | 82 +++++------ .../org/openapitools/apis/UserApiStubs.kt | 26 ++-- 20 files changed, 339 insertions(+), 339 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub-builder.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub-builder.mustache index 620405e2239e..ef98a549fe39 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub-builder.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub-builder.mustache @@ -26,10 +26,10 @@ class {{operationIdCamelCase}}StubBuilder internal constructor(private val objec * Let the stub for {{operationId}} respond with HTTP status code {{code}}. * {{#returnType}} - * @param body Response body for the [MappingBuilder]. + * @param body response body for the [MappingBuilder]. {{/returnType}} - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith{{code}}( {{#returnType}} @@ -52,10 +52,10 @@ class {{operationIdCamelCase}}StubBuilder internal constructor(private val objec * Let the stub for {{operationId}} respond with HTTP status code [code]. * {{#returnType}} - * @param body Response body for the [MappingBuilder]. + * @param body response body for the [MappingBuilder]. {{/returnType}} - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub.mustache index f43cda686726..804e23134966 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/api-stub.mustache @@ -24,12 +24,12 @@ open class {{classname}}Stubs(private val objectMapper: ObjectMapper) { * Construct a stub for the operation {{operationId}}. * {{#pathParams}} - * @param {{paramName}} Path parameter {{paramName}} pattern. + * @param {{paramName}} path parameter {{paramName}} pattern. {{/pathParams}} {{#queryParams}} - * @param {{paramName}} Query parameter {{paramName}} pattern. + * @param {{paramName}} query parameter {{paramName}} pattern. {{/queryParams}} - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [{{operationIdCamelCase}}StubBuilder] to configure the response, and the final [MappingBuilder]. */ fun {{operationId}}({{#pathParams}}{{paramName}}: StringValuePattern, {{/pathParams}}{{#queryParams}}{{paramName}}: StringValuePattern? = null, {{/queryParams}}configurer: MappingBuilder.() -> MappingBuilder = { this }): {{operationIdCamelCase}}StubBuilder = diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubBuilders.kt index c12c8799572a..cccbcd941687 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubBuilders.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubBuilders.kt @@ -21,9 +21,9 @@ class TestAuthHttpBasicStubBuilder internal constructor(private val objectMapper /** * Let the stub for testAuthHttpBasic respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -39,9 +39,9 @@ class TestAuthHttpBasicStubBuilder internal constructor(private val objectMapper /** * Let the stub for testAuthHttpBasic respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -68,9 +68,9 @@ class TestAuthHttpBearerStubBuilder internal constructor(private val objectMappe /** * Let the stub for testAuthHttpBearer respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -86,9 +86,9 @@ class TestAuthHttpBearerStubBuilder internal constructor(private val objectMappe /** * Let the stub for testAuthHttpBearer respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubs.kt index 0474266db95d..2de65e35b680 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubs.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/AuthApiStubs.kt @@ -21,7 +21,7 @@ open class AuthApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testAuthHttpBasic. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestAuthHttpBasicStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testAuthHttpBasic(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestAuthHttpBasicStubBuilder = @@ -32,7 +32,7 @@ open class AuthApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testAuthHttpBearer. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestAuthHttpBearerStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testAuthHttpBearer(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestAuthHttpBearerStubBuilder = diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubBuilders.kt index 5a194438c010..16286fdec9d7 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubBuilders.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubBuilders.kt @@ -21,9 +21,9 @@ class TestBinaryGifStubBuilder internal constructor(private val objectMapper: Ob /** * Let the stub for testBinaryGif respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: java.io.File, @@ -39,9 +39,9 @@ class TestBinaryGifStubBuilder internal constructor(private val objectMapper: Ob /** * Let the stub for testBinaryGif respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -68,9 +68,9 @@ class TestBodyApplicationOctetstreamBinaryStubBuilder internal constructor(priva /** * Let the stub for testBodyApplicationOctetstreamBinary respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -86,9 +86,9 @@ class TestBodyApplicationOctetstreamBinaryStubBuilder internal constructor(priva /** * Let the stub for testBodyApplicationOctetstreamBinary respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -115,9 +115,9 @@ class TestBodyMultipartFormdataArrayOfBinaryStubBuilder internal constructor(pri /** * Let the stub for testBodyMultipartFormdataArrayOfBinary respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -133,9 +133,9 @@ class TestBodyMultipartFormdataArrayOfBinaryStubBuilder internal constructor(pri /** * Let the stub for testBodyMultipartFormdataArrayOfBinary respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -162,9 +162,9 @@ class TestBodyMultipartFormdataSingleBinaryStubBuilder internal constructor(priv /** * Let the stub for testBodyMultipartFormdataSingleBinary respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -180,9 +180,9 @@ class TestBodyMultipartFormdataSingleBinaryStubBuilder internal constructor(priv /** * Let the stub for testBodyMultipartFormdataSingleBinary respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -209,9 +209,9 @@ class TestEchoBodyFreeFormObjectResponseStringStubBuilder internal constructor(p /** * Let the stub for testEchoBodyFreeFormObjectResponseString respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -227,9 +227,9 @@ class TestEchoBodyFreeFormObjectResponseStringStubBuilder internal constructor(p /** * Let the stub for testEchoBodyFreeFormObjectResponseString respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -256,9 +256,9 @@ class TestEchoBodyPetStubBuilder internal constructor(private val objectMapper: /** * Let the stub for testEchoBodyPet respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: Pet, @@ -274,9 +274,9 @@ class TestEchoBodyPetStubBuilder internal constructor(private val objectMapper: /** * Let the stub for testEchoBodyPet respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -303,9 +303,9 @@ class TestEchoBodyPetResponseStringStubBuilder internal constructor(private val /** * Let the stub for testEchoBodyPetResponseString respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -321,9 +321,9 @@ class TestEchoBodyPetResponseStringStubBuilder internal constructor(private val /** * Let the stub for testEchoBodyPetResponseString respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -350,9 +350,9 @@ class TestEchoBodyTagResponseStringStubBuilder internal constructor(private val /** * Let the stub for testEchoBodyTagResponseString respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -368,9 +368,9 @@ class TestEchoBodyTagResponseStringStubBuilder internal constructor(private val /** * Let the stub for testEchoBodyTagResponseString respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubs.kt index a96f9f0e8502..9a4f49a9ce0b 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubs.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/BodyApiStubs.kt @@ -21,7 +21,7 @@ open class BodyApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testBinaryGif. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestBinaryGifStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testBinaryGif(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBinaryGifStubBuilder = @@ -32,7 +32,7 @@ open class BodyApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testBodyApplicationOctetstreamBinary. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestBodyApplicationOctetstreamBinaryStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testBodyApplicationOctetstreamBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyApplicationOctetstreamBinaryStubBuilder = @@ -43,7 +43,7 @@ open class BodyApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testBodyMultipartFormdataArrayOfBinary. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestBodyMultipartFormdataArrayOfBinaryStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testBodyMultipartFormdataArrayOfBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyMultipartFormdataArrayOfBinaryStubBuilder = @@ -54,7 +54,7 @@ open class BodyApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testBodyMultipartFormdataSingleBinary. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestBodyMultipartFormdataSingleBinaryStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testBodyMultipartFormdataSingleBinary(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestBodyMultipartFormdataSingleBinaryStubBuilder = @@ -65,7 +65,7 @@ open class BodyApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testEchoBodyFreeFormObjectResponseString. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestEchoBodyFreeFormObjectResponseStringStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testEchoBodyFreeFormObjectResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyFreeFormObjectResponseStringStubBuilder = @@ -76,7 +76,7 @@ open class BodyApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testEchoBodyPet. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestEchoBodyPetStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testEchoBodyPet(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyPetStubBuilder = @@ -87,7 +87,7 @@ open class BodyApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testEchoBodyPetResponseString. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestEchoBodyPetResponseStringStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testEchoBodyPetResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyPetResponseStringStubBuilder = @@ -98,7 +98,7 @@ open class BodyApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testEchoBodyTagResponseString. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestEchoBodyTagResponseStringStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testEchoBodyTagResponseString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEchoBodyTagResponseStringStubBuilder = diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubBuilders.kt index 4964effc4e72..a25e427db019 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubBuilders.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubBuilders.kt @@ -21,9 +21,9 @@ class TestFormIntegerBooleanStringStubBuilder internal constructor(private val o /** * Let the stub for testFormIntegerBooleanString respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -39,9 +39,9 @@ class TestFormIntegerBooleanStringStubBuilder internal constructor(private val o /** * Let the stub for testFormIntegerBooleanString respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -68,9 +68,9 @@ class TestFormOneofStubBuilder internal constructor(private val objectMapper: Ob /** * Let the stub for testFormOneof respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -86,9 +86,9 @@ class TestFormOneofStubBuilder internal constructor(private val objectMapper: Ob /** * Let the stub for testFormOneof respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubs.kt index 00cd50163c8d..d428eadc7b9e 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubs.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/FormApiStubs.kt @@ -21,7 +21,7 @@ open class FormApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testFormIntegerBooleanString. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestFormIntegerBooleanStringStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testFormIntegerBooleanString(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestFormIntegerBooleanStringStubBuilder = @@ -32,7 +32,7 @@ open class FormApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testFormOneof. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestFormOneofStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testFormOneof(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestFormOneofStubBuilder = diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubBuilders.kt index d5f572ab955c..4dbe40addb0a 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubBuilders.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubBuilders.kt @@ -21,9 +21,9 @@ class TestHeaderIntegerBooleanStringEnumsStubBuilder internal constructor(privat /** * Let the stub for testHeaderIntegerBooleanStringEnums respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -39,9 +39,9 @@ class TestHeaderIntegerBooleanStringEnumsStubBuilder internal constructor(privat /** * Let the stub for testHeaderIntegerBooleanStringEnums respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubs.kt index 0d5e608fe7ae..3a394fe962e9 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubs.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/HeaderApiStubs.kt @@ -21,7 +21,7 @@ open class HeaderApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testHeaderIntegerBooleanStringEnums. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestHeaderIntegerBooleanStringEnumsStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testHeaderIntegerBooleanStringEnums(configurer: MappingBuilder.() -> MappingBuilder = { this }): TestHeaderIntegerBooleanStringEnumsStubBuilder = diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubBuilders.kt index 79e19365b15e..c33be23bb98f 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubBuilders.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubBuilders.kt @@ -21,9 +21,9 @@ class TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStri /** * Let the stub for testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -39,9 +39,9 @@ class TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStri /** * Let the stub for testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubs.kt index e5e4350fb484..011d4e396e0c 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubs.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PathApiStubs.kt @@ -21,11 +21,11 @@ open class PathApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath. * - * @param pathString Path parameter pathString pattern. - * @param pathInteger Path parameter pathInteger pattern. - * @param enumNonrefStringPath Path parameter enumNonrefStringPath pattern. - * @param enumRefStringPath Path parameter enumRefStringPath pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param pathString path parameter pathString pattern. + * @param pathInteger path parameter pathInteger pattern. + * @param enumNonrefStringPath path parameter enumNonrefStringPath pattern. + * @param enumRefStringPath path parameter enumRefStringPath pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath(pathString: StringValuePattern, pathInteger: StringValuePattern, enumNonrefStringPath: StringValuePattern, enumRefStringPath: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPathStubBuilder = diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubBuilders.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubBuilders.kt index 81cd12fd688a..77e10817e14c 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubBuilders.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubBuilders.kt @@ -21,9 +21,9 @@ class TestEnumRefStringStubBuilder internal constructor(private val objectMapper /** * Let the stub for testEnumRefString respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -39,9 +39,9 @@ class TestEnumRefStringStubBuilder internal constructor(private val objectMapper /** * Let the stub for testEnumRefString respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -68,9 +68,9 @@ class TestQueryDatetimeDateStringStubBuilder internal constructor(private val ob /** * Let the stub for testQueryDatetimeDateString respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -86,9 +86,9 @@ class TestQueryDatetimeDateStringStubBuilder internal constructor(private val ob /** * Let the stub for testQueryDatetimeDateString respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -115,9 +115,9 @@ class TestQueryIntegerBooleanStringStubBuilder internal constructor(private val /** * Let the stub for testQueryIntegerBooleanString respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -133,9 +133,9 @@ class TestQueryIntegerBooleanStringStubBuilder internal constructor(private val /** * Let the stub for testQueryIntegerBooleanString respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -162,9 +162,9 @@ class TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder internal constructor( /** * Let the stub for testQueryStyleDeepObjectExplodeTrueObject respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -180,9 +180,9 @@ class TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder internal constructor( /** * Let the stub for testQueryStyleDeepObjectExplodeTrueObject respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -209,9 +209,9 @@ class TestQueryStyleFormExplodeTrueArrayStringStubBuilder internal constructor(p /** * Let the stub for testQueryStyleFormExplodeTrueArrayString respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -227,9 +227,9 @@ class TestQueryStyleFormExplodeTrueArrayStringStubBuilder internal constructor(p /** * Let the stub for testQueryStyleFormExplodeTrueArrayString respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -256,9 +256,9 @@ class TestQueryStyleFormExplodeTrueObjectStubBuilder internal constructor(privat /** * Let the stub for testQueryStyleFormExplodeTrueObject respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -274,9 +274,9 @@ class TestQueryStyleFormExplodeTrueObjectStubBuilder internal constructor(privat /** * Let the stub for testQueryStyleFormExplodeTrueObject respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, diff --git a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubs.kt b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubs.kt index d2b71b443167..96f7bf35cb21 100644 --- a/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubs.kt +++ b/samples/server/echo_api/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/QueryApiStubs.kt @@ -21,9 +21,9 @@ open class QueryApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testEnumRefString. * - * @param enumNonrefStringQuery Query parameter enumNonrefStringQuery pattern. - * @param enumRefStringQuery Query parameter enumRefStringQuery pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param enumNonrefStringQuery query parameter enumNonrefStringQuery pattern. + * @param enumRefStringQuery query parameter enumRefStringQuery pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestEnumRefStringStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testEnumRefString(enumNonrefStringQuery: StringValuePattern? = null, enumRefStringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestEnumRefStringStubBuilder = @@ -36,10 +36,10 @@ open class QueryApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testQueryDatetimeDateString. * - * @param datetimeQuery Query parameter datetimeQuery pattern. - * @param dateQuery Query parameter dateQuery pattern. - * @param stringQuery Query parameter stringQuery pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param datetimeQuery query parameter datetimeQuery pattern. + * @param dateQuery query parameter dateQuery pattern. + * @param stringQuery query parameter stringQuery pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestQueryDatetimeDateStringStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testQueryDatetimeDateString(datetimeQuery: StringValuePattern? = null, dateQuery: StringValuePattern? = null, stringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryDatetimeDateStringStubBuilder = @@ -53,10 +53,10 @@ open class QueryApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testQueryIntegerBooleanString. * - * @param integerQuery Query parameter integerQuery pattern. - * @param booleanQuery Query parameter booleanQuery pattern. - * @param stringQuery Query parameter stringQuery pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param integerQuery query parameter integerQuery pattern. + * @param booleanQuery query parameter booleanQuery pattern. + * @param stringQuery query parameter stringQuery pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestQueryIntegerBooleanStringStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testQueryIntegerBooleanString(integerQuery: StringValuePattern? = null, booleanQuery: StringValuePattern? = null, stringQuery: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryIntegerBooleanStringStubBuilder = @@ -70,8 +70,8 @@ open class QueryApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testQueryStyleDeepObjectExplodeTrueObject. * - * @param queryObject Query parameter queryObject pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param queryObject query parameter queryObject pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testQueryStyleDeepObjectExplodeTrueObject(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleDeepObjectExplodeTrueObjectStubBuilder = @@ -83,8 +83,8 @@ open class QueryApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testQueryStyleFormExplodeTrueArrayString. * - * @param queryObject Query parameter queryObject pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param queryObject query parameter queryObject pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestQueryStyleFormExplodeTrueArrayStringStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testQueryStyleFormExplodeTrueArrayString(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleFormExplodeTrueArrayStringStubBuilder = @@ -96,8 +96,8 @@ open class QueryApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation testQueryStyleFormExplodeTrueObject. * - * @param queryObject Query parameter queryObject pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param queryObject query parameter queryObject pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [TestQueryStyleFormExplodeTrueObjectStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun testQueryStyleFormExplodeTrueObject(queryObject: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): TestQueryStyleFormExplodeTrueObjectStubBuilder = diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubBuilders.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubBuilders.kt index 923d6fd551b3..429cb65a3ce5 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubBuilders.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubBuilders.kt @@ -21,9 +21,9 @@ class AddPetStubBuilder internal constructor(private val objectMapper: ObjectMap /** * Let the stub for addPet respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: Pet, @@ -39,9 +39,9 @@ class AddPetStubBuilder internal constructor(private val objectMapper: ObjectMap /** * Let the stub for addPet respond with HTTP status code 405. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith405( body: Pet, @@ -57,9 +57,9 @@ class AddPetStubBuilder internal constructor(private val objectMapper: ObjectMap /** * Let the stub for addPet respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -86,8 +86,8 @@ class DeletePetStubBuilder internal constructor(private val objectMapper: Object /** * Let the stub for deletePet respond with HTTP status code 400. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith400( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -100,8 +100,8 @@ class DeletePetStubBuilder internal constructor(private val objectMapper: Object /** * Let the stub for deletePet respond with HTTP status code [code]. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -128,9 +128,9 @@ class FindPetsByStatusStubBuilder internal constructor(private val objectMapper: /** * Let the stub for findPetsByStatus respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.collections.List, @@ -146,9 +146,9 @@ class FindPetsByStatusStubBuilder internal constructor(private val objectMapper: /** * Let the stub for findPetsByStatus respond with HTTP status code 400. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith400( body: kotlin.collections.List, @@ -164,9 +164,9 @@ class FindPetsByStatusStubBuilder internal constructor(private val objectMapper: /** * Let the stub for findPetsByStatus respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -193,9 +193,9 @@ class FindPetsByTagsStubBuilder internal constructor(private val objectMapper: O /** * Let the stub for findPetsByTags respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.collections.List, @@ -211,9 +211,9 @@ class FindPetsByTagsStubBuilder internal constructor(private val objectMapper: O /** * Let the stub for findPetsByTags respond with HTTP status code 400. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith400( body: kotlin.collections.List, @@ -229,9 +229,9 @@ class FindPetsByTagsStubBuilder internal constructor(private val objectMapper: O /** * Let the stub for findPetsByTags respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -258,9 +258,9 @@ class GetPetByIdStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for getPetById respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: Pet, @@ -276,9 +276,9 @@ class GetPetByIdStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for getPetById respond with HTTP status code 400. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith400( body: Pet, @@ -294,9 +294,9 @@ class GetPetByIdStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for getPetById respond with HTTP status code 404. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith404( body: Pet, @@ -312,9 +312,9 @@ class GetPetByIdStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for getPetById respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -341,9 +341,9 @@ class UpdatePetStubBuilder internal constructor(private val objectMapper: Object /** * Let the stub for updatePet respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: Pet, @@ -359,9 +359,9 @@ class UpdatePetStubBuilder internal constructor(private val objectMapper: Object /** * Let the stub for updatePet respond with HTTP status code 400. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith400( body: Pet, @@ -377,9 +377,9 @@ class UpdatePetStubBuilder internal constructor(private val objectMapper: Object /** * Let the stub for updatePet respond with HTTP status code 404. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith404( body: Pet, @@ -395,9 +395,9 @@ class UpdatePetStubBuilder internal constructor(private val objectMapper: Object /** * Let the stub for updatePet respond with HTTP status code 405. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith405( body: Pet, @@ -413,9 +413,9 @@ class UpdatePetStubBuilder internal constructor(private val objectMapper: Object /** * Let the stub for updatePet respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -442,8 +442,8 @@ class UpdatePetWithFormStubBuilder internal constructor(private val objectMapper /** * Let the stub for updatePetWithForm respond with HTTP status code 405. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith405( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -456,8 +456,8 @@ class UpdatePetWithFormStubBuilder internal constructor(private val objectMapper /** * Let the stub for updatePetWithForm respond with HTTP status code [code]. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -484,9 +484,9 @@ class UploadFileStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for uploadFile respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: ApiResponse, @@ -502,9 +502,9 @@ class UploadFileStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for uploadFile respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubs.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubs.kt index 4e16ceda201f..133e670964ec 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubs.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/PetApiStubs.kt @@ -21,7 +21,7 @@ open class PetApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation addPet. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [AddPetStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun addPet(configurer: MappingBuilder.() -> MappingBuilder = { this }): AddPetStubBuilder = @@ -32,8 +32,8 @@ open class PetApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation deletePet. * - * @param petId Path parameter petId pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param petId path parameter petId pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [DeletePetStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun deletePet(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeletePetStubBuilder = @@ -45,8 +45,8 @@ open class PetApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation findPetsByStatus. * - * @param status Query parameter status pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param status query parameter status pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [FindPetsByStatusStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun findPetsByStatus(status: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): FindPetsByStatusStubBuilder = @@ -58,8 +58,8 @@ open class PetApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation findPetsByTags. * - * @param tags Query parameter tags pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param tags query parameter tags pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [FindPetsByTagsStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun findPetsByTags(tags: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): FindPetsByTagsStubBuilder = @@ -71,8 +71,8 @@ open class PetApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation getPetById. * - * @param petId Path parameter petId pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param petId path parameter petId pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [GetPetByIdStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun getPetById(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetPetByIdStubBuilder = @@ -84,7 +84,7 @@ open class PetApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation updatePet. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [UpdatePetStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun updatePet(configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdatePetStubBuilder = @@ -95,8 +95,8 @@ open class PetApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation updatePetWithForm. * - * @param petId Path parameter petId pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param petId path parameter petId pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [UpdatePetWithFormStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun updatePetWithForm(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdatePetWithFormStubBuilder = @@ -108,8 +108,8 @@ open class PetApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation uploadFile. * - * @param petId Path parameter petId pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param petId path parameter petId pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [UploadFileStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun uploadFile(petId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UploadFileStubBuilder = diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubBuilders.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubBuilders.kt index bbca4042d12a..297a5498bf27 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubBuilders.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubBuilders.kt @@ -21,8 +21,8 @@ class DeleteOrderStubBuilder internal constructor(private val objectMapper: Obje /** * Let the stub for deleteOrder respond with HTTP status code 400. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith400( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -35,8 +35,8 @@ class DeleteOrderStubBuilder internal constructor(private val objectMapper: Obje /** * Let the stub for deleteOrder respond with HTTP status code 404. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith404( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -49,8 +49,8 @@ class DeleteOrderStubBuilder internal constructor(private val objectMapper: Obje /** * Let the stub for deleteOrder respond with HTTP status code [code]. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -77,9 +77,9 @@ class GetInventoryStubBuilder internal constructor(private val objectMapper: Obj /** * Let the stub for getInventory respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.collections.Map, @@ -95,9 +95,9 @@ class GetInventoryStubBuilder internal constructor(private val objectMapper: Obj /** * Let the stub for getInventory respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -124,9 +124,9 @@ class GetOrderByIdStubBuilder internal constructor(private val objectMapper: Obj /** * Let the stub for getOrderById respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: Order, @@ -142,9 +142,9 @@ class GetOrderByIdStubBuilder internal constructor(private val objectMapper: Obj /** * Let the stub for getOrderById respond with HTTP status code 400. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith400( body: Order, @@ -160,9 +160,9 @@ class GetOrderByIdStubBuilder internal constructor(private val objectMapper: Obj /** * Let the stub for getOrderById respond with HTTP status code 404. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith404( body: Order, @@ -178,9 +178,9 @@ class GetOrderByIdStubBuilder internal constructor(private val objectMapper: Obj /** * Let the stub for getOrderById respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -207,9 +207,9 @@ class PlaceOrderStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for placeOrder respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: Order, @@ -225,9 +225,9 @@ class PlaceOrderStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for placeOrder respond with HTTP status code 400. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith400( body: Order, @@ -243,9 +243,9 @@ class PlaceOrderStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for placeOrder respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubs.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubs.kt index 27bc79580b87..dc6a53855742 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubs.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/StoreApiStubs.kt @@ -21,8 +21,8 @@ open class StoreApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation deleteOrder. * - * @param orderId Path parameter orderId pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param orderId path parameter orderId pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [DeleteOrderStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun deleteOrder(orderId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeleteOrderStubBuilder = @@ -34,7 +34,7 @@ open class StoreApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation getInventory. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [GetInventoryStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun getInventory(configurer: MappingBuilder.() -> MappingBuilder = { this }): GetInventoryStubBuilder = @@ -45,8 +45,8 @@ open class StoreApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation getOrderById. * - * @param orderId Path parameter orderId pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param orderId path parameter orderId pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [GetOrderByIdStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun getOrderById(orderId: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetOrderByIdStubBuilder = @@ -58,7 +58,7 @@ open class StoreApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation placeOrder. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [PlaceOrderStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun placeOrder(configurer: MappingBuilder.() -> MappingBuilder = { this }): PlaceOrderStubBuilder = diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubBuilders.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubBuilders.kt index a3798bae2216..817c40844f23 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubBuilders.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubBuilders.kt @@ -21,8 +21,8 @@ class CreateUserStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for createUser respond with HTTP status code [code]. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -49,8 +49,8 @@ class CreateUsersWithArrayInputStubBuilder internal constructor(private val obje /** * Let the stub for createUsersWithArrayInput respond with HTTP status code [code]. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -77,8 +77,8 @@ class CreateUsersWithListInputStubBuilder internal constructor(private val objec /** * Let the stub for createUsersWithListInput respond with HTTP status code [code]. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -105,8 +105,8 @@ class DeleteUserStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for deleteUser respond with HTTP status code 400. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith400( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -119,8 +119,8 @@ class DeleteUserStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for deleteUser respond with HTTP status code 404. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith404( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -133,8 +133,8 @@ class DeleteUserStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for deleteUser respond with HTTP status code [code]. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -161,9 +161,9 @@ class GetUserByNameStubBuilder internal constructor(private val objectMapper: Ob /** * Let the stub for getUserByName respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: User, @@ -179,9 +179,9 @@ class GetUserByNameStubBuilder internal constructor(private val objectMapper: Ob /** * Let the stub for getUserByName respond with HTTP status code 400. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith400( body: User, @@ -197,9 +197,9 @@ class GetUserByNameStubBuilder internal constructor(private val objectMapper: Ob /** * Let the stub for getUserByName respond with HTTP status code 404. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith404( body: User, @@ -215,9 +215,9 @@ class GetUserByNameStubBuilder internal constructor(private val objectMapper: Ob /** * Let the stub for getUserByName respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -244,9 +244,9 @@ class LoginUserStubBuilder internal constructor(private val objectMapper: Object /** * Let the stub for loginUser respond with HTTP status code 200. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith200( body: kotlin.String, @@ -262,9 +262,9 @@ class LoginUserStubBuilder internal constructor(private val objectMapper: Object /** * Let the stub for loginUser respond with HTTP status code 400. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith400( body: kotlin.String, @@ -280,9 +280,9 @@ class LoginUserStubBuilder internal constructor(private val objectMapper: Object /** * Let the stub for loginUser respond with HTTP status code [code]. * - * @param body Response body for the [MappingBuilder]. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param body response body for the [MappingBuilder]. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -309,8 +309,8 @@ class LogoutUserStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for logoutUser respond with HTTP status code [code]. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, @@ -337,8 +337,8 @@ class UpdateUserStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for updateUser respond with HTTP status code 400. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith400( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -351,8 +351,8 @@ class UpdateUserStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for updateUser respond with HTTP status code 404. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer fonfigurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith404( configurer: ResponseDefinitionBuilder.() -> ResponseDefinitionBuilder = { this }, @@ -365,8 +365,8 @@ class UpdateUserStubBuilder internal constructor(private val objectMapper: Objec /** * Let the stub for updateUser respond with HTTP status code [code]. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. - * @return A [MappingBuilder] to be registered with a WireMock instance. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. + * @return a [MappingBuilder] to be registered with a WireMock instance. */ fun respondWith( code: Int, diff --git a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubs.kt b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubs.kt index 639908cd0995..72a458086869 100644 --- a/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubs.kt +++ b/samples/server/petstore/kotlin-wiremock/src/main/kotlin/org/openapitools/apis/UserApiStubs.kt @@ -21,7 +21,7 @@ open class UserApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation createUser. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [CreateUserStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun createUser(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUserStubBuilder = @@ -32,7 +32,7 @@ open class UserApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation createUsersWithArrayInput. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [CreateUsersWithArrayInputStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun createUsersWithArrayInput(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUsersWithArrayInputStubBuilder = @@ -43,7 +43,7 @@ open class UserApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation createUsersWithListInput. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [CreateUsersWithListInputStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun createUsersWithListInput(configurer: MappingBuilder.() -> MappingBuilder = { this }): CreateUsersWithListInputStubBuilder = @@ -54,8 +54,8 @@ open class UserApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation deleteUser. * - * @param username Path parameter username pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param username path parameter username pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [DeleteUserStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun deleteUser(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): DeleteUserStubBuilder = @@ -67,8 +67,8 @@ open class UserApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation getUserByName. * - * @param username Path parameter username pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param username path parameter username pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [GetUserByNameStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun getUserByName(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): GetUserByNameStubBuilder = @@ -80,9 +80,9 @@ open class UserApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation loginUser. * - * @param username Query parameter username pattern. - * @param password Query parameter password pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param username query parameter username pattern. + * @param password query parameter password pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [LoginUserStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun loginUser(username: StringValuePattern? = null, password: StringValuePattern? = null, configurer: MappingBuilder.() -> MappingBuilder = { this }): LoginUserStubBuilder = @@ -95,7 +95,7 @@ open class UserApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation logoutUser. * - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [LogoutUserStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun logoutUser(configurer: MappingBuilder.() -> MappingBuilder = { this }): LogoutUserStubBuilder = @@ -106,8 +106,8 @@ open class UserApiStubs(private val objectMapper: ObjectMapper) { /** * Construct a stub for the operation updateUser. * - * @param username Path parameter username pattern. - * @param configurer Configurer for the [MappingBuilder], allowing for arbitrary changes. + * @param username path parameter username pattern. + * @param configurer configurer for the [MappingBuilder], allowing for arbitrary changes. * @return A [UpdateUserStubBuilder] to configure the response, and the final [MappingBuilder]. */ fun updateUser(username: StringValuePattern, configurer: MappingBuilder.() -> MappingBuilder = { this }): UpdateUserStubBuilder = From 1bcac1378106fa821dcd036d7ab1e003c5dab518 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 09:56:11 +0200 Subject: [PATCH 14/22] [kotlin-wiremock] Added kotlin-wiremock echo_api sample to GitHub workflow --- .github/workflows/samples-kotlin-server.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/samples-kotlin-server.yaml b/.github/workflows/samples-kotlin-server.yaml index 996ac4af5b48..58fe9796161c 100644 --- a/.github/workflows/samples-kotlin-server.yaml +++ b/.github/workflows/samples-kotlin-server.yaml @@ -41,6 +41,7 @@ jobs: - samples/server/others/kotlin-server/jaxrs-spec - samples/server/others/kotlin-server/jaxrs-spec-array-response - samples/server/petstore/kotlin-wiremock + - samples/server/echo_api/kotlin-wiremock - samples/server/petstore/kotlin-spring-cloud # comment out due to gradle build failure #- samples/server/petstore/kotlin-spring-default From 1fafa38640e0bd4eac2572e1622357433b98b1e3 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 09:59:34 +0200 Subject: [PATCH 15/22] [kotlin-wiremock] Added new generator to README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 31ac8d785762..7674dafc82bd 100644 --- a/README.md +++ b/README.md @@ -1091,6 +1091,7 @@ Here is a list of template creators: * Kotlin (Spring Boot): @dr4ke616 * Kotlin (Vertx): @Wooyme * Kotlin (JAX-RS): @anttileppa + * Kotlin WireMock: @stefankoppier * NodeJS Express: @YishTish * PHP Flight: @daniel-sc * PHP Laravel: @renepardon From 265ea5da299b9298dc4899b533f33966cb3d7f49 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 10:01:36 +0200 Subject: [PATCH 16/22] [kotlin-wiremock] Generated docs --- docs/generators/kotlin-wiremock.md | 277 +++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 docs/generators/kotlin-wiremock.md diff --git a/docs/generators/kotlin-wiremock.md b/docs/generators/kotlin-wiremock.md new file mode 100644 index 000000000000..c836ebc7f23b --- /dev/null +++ b/docs/generators/kotlin-wiremock.md @@ -0,0 +1,277 @@ +--- +title: Documentation for the kotlin-wiremock Generator +--- + +## METADATA + +| Property | Value | Notes | +| -------- | ----- | ----- | +| generator name | kotlin-wiremock | pass this to the generate command after -g | +| generator stability | BETA | | +| generator type | SERVER | | +| generator language | Kotlin | | +| generator default templating engine | mustache | | +| helpTxt | Generates Kotlin WireMock stub request and response samples. | | + +## CONFIG OPTIONS +These options may be applied as additional-properties (cli) or configOptions (plugins). Refer to [configuration docs](https://openapi-generator.tech/docs/configuration) for more details. + +| Option | Description | Values | Default | +| ------ | ----------- | ------ | ------- | +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| +|apiSuffix|suffix for api classes| |Api| +|artifactId|Generated artifact id (name of jar).| |null| +|artifactVersion|Generated artifact's package version.| |1.0.0| +|enumPropertyNaming|Naming convention for enum properties: 'camelCase', 'PascalCase', 'snake_case', 'UPPERCASE', and 'original'| |original| +|groupId|Generated artifact package's organization (i.e. maven groupId).| |org.openapitools| +|modelMutable|Create mutable models| |false| +|packageName|Generated artifact package name.| |org.openapitools| +|parcelizeModels|toggle "@Parcelize" for generated models| |null| +|serializableModel|boolean - toggle "implements Serializable" for generated models| |null| +|sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |null| +|sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |null| +|sourceFolder|source folder for generated code| |src/main/kotlin| + +## IMPORT MAPPING + +| Type/Alias | Imports | +| ---------- | ------- | +|BigDecimal|java.math.BigDecimal| +|Date|java.time.LocalDate| +|DateTime|java.time.OffsetDateTime| +|File|java.io.File| +|LocalDate|java.time.LocalDate| +|LocalDateTime|java.time.LocalDateTime| +|LocalTime|java.time.LocalTime| +|Timestamp|java.sql.Timestamp| +|URI|java.net.URI| +|UUID|java.util.UUID| + + +## INSTANTIATION TYPES + +| Type/Alias | Instantiated By | +| ---------- | --------------- | +|array|kotlin.collections.ArrayList| +|list|kotlin.collections.ArrayList| +|map|kotlin.collections.HashMap| + + +## LANGUAGE PRIMITIVES + +

    +
  • kotlin.Array
  • +
  • kotlin.Boolean
  • +
  • kotlin.Byte
  • +
  • kotlin.ByteArray
  • +
  • kotlin.Char
  • +
  • kotlin.Double
  • +
  • kotlin.Float
  • +
  • kotlin.Int
  • +
  • kotlin.Long
  • +
  • kotlin.Short
  • +
  • kotlin.String
  • +
  • kotlin.collections.List
  • +
  • kotlin.collections.Map
  • +
  • kotlin.collections.MutableList
  • +
  • kotlin.collections.MutableMap
  • +
  • kotlin.collections.MutableSet
  • +
  • kotlin.collections.Set
  • +
+ +## RESERVED WORDS + +
    +
  • ApiResponse
  • +
  • abstract
  • +
  • actual
  • +
  • annotation
  • +
  • as
  • +
  • break
  • +
  • class
  • +
  • companion
  • +
  • const
  • +
  • constructor
  • +
  • continue
  • +
  • contract
  • +
  • crossinline
  • +
  • data
  • +
  • delegate
  • +
  • do
  • +
  • dynamic
  • +
  • else
  • +
  • enum
  • +
  • expect
  • +
  • external
  • +
  • false
  • +
  • field
  • +
  • final
  • +
  • finally
  • +
  • for
  • +
  • fun
  • +
  • if
  • +
  • import
  • +
  • in
  • +
  • infix
  • +
  • init
  • +
  • inline
  • +
  • inner
  • +
  • interface
  • +
  • internal
  • +
  • is
  • +
  • it
  • +
  • lateinit
  • +
  • noinline
  • +
  • null
  • +
  • object
  • +
  • open
  • +
  • operator
  • +
  • out
  • +
  • override
  • +
  • package
  • +
  • param
  • +
  • private
  • +
  • property
  • +
  • protected
  • +
  • public
  • +
  • receiver
  • +
  • reified
  • +
  • return
  • +
  • sealed
  • +
  • setparam
  • +
  • super
  • +
  • suspend
  • +
  • tailrec
  • +
  • this
  • +
  • throw
  • +
  • true
  • +
  • try
  • +
  • typealias
  • +
  • typeof
  • +
  • val
  • +
  • value
  • +
  • var
  • +
  • vararg
  • +
  • when
  • +
  • where
  • +
  • while
  • +
+ +## FEATURE SET + + +### Client Modification Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|BasePath|✗|ToolingExtension +|Authorizations|✗|ToolingExtension +|UserAgent|✗|ToolingExtension +|MockServer|✗|ToolingExtension + +### Data Type Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|Custom|✗|OAS2,OAS3 +|Int32|✓|OAS2,OAS3 +|Int64|✓|OAS2,OAS3 +|Float|✓|OAS2,OAS3 +|Double|✓|OAS2,OAS3 +|Decimal|✓|ToolingExtension +|String|✓|OAS2,OAS3 +|Byte|✓|OAS2,OAS3 +|Binary|✓|OAS2,OAS3 +|Boolean|✓|OAS2,OAS3 +|Date|✓|OAS2,OAS3 +|DateTime|✓|OAS2,OAS3 +|Password|✓|OAS2,OAS3 +|File|✓|OAS2 +|Uuid|✗| +|Array|✓|OAS2,OAS3 +|Null|✗|OAS3 +|AnyType|✗|OAS2,OAS3 +|Object|✓|OAS2,OAS3 +|Maps|✓|ToolingExtension +|CollectionFormat|✓|OAS2 +|CollectionFormatMulti|✓|OAS2 +|Enum|✓|OAS2,OAS3 +|ArrayOfEnum|✓|ToolingExtension +|ArrayOfModel|✓|ToolingExtension +|ArrayOfCollectionOfPrimitives|✓|ToolingExtension +|ArrayOfCollectionOfModel|✓|ToolingExtension +|ArrayOfCollectionOfEnum|✓|ToolingExtension +|MapOfEnum|✓|ToolingExtension +|MapOfModel|✓|ToolingExtension +|MapOfCollectionOfPrimitives|✓|ToolingExtension +|MapOfCollectionOfModel|✓|ToolingExtension +|MapOfCollectionOfEnum|✓|ToolingExtension + +### Documentation Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|Readme|✗|ToolingExtension +|Model|✓|ToolingExtension +|Api|✓|ToolingExtension + +### Global Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|Host|✓|OAS2,OAS3 +|BasePath|✓|OAS2,OAS3 +|Info|✓|OAS2,OAS3 +|Schemes|✗|OAS2,OAS3 +|PartialSchemes|✓|OAS2,OAS3 +|Consumes|✓|OAS2 +|Produces|✓|OAS2 +|ExternalDocumentation|✓|OAS2,OAS3 +|Examples|✓|OAS2,OAS3 +|XMLStructureDefinitions|✗|OAS2,OAS3 +|MultiServer|✗|OAS3 +|ParameterizedServer|✗|OAS3 +|ParameterStyling|✗|OAS3 +|Callbacks|✓|OAS3 +|LinkObjects|✗|OAS3 + +### Parameter Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|Path|✓|OAS2,OAS3 +|Query|✓|OAS2,OAS3 +|Header|✓|OAS2,OAS3 +|Body|✓|OAS2 +|FormUnencoded|✓|OAS2 +|FormMultipart|✓|OAS2 +|Cookie|✓|OAS3 + +### Schema Support Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|Simple|✓|OAS2,OAS3 +|Composite|✓|OAS2,OAS3 +|Polymorphism|✓|OAS2,OAS3 +|Union|✗|OAS3 +|allOf|✗|OAS2,OAS3 +|anyOf|✗|OAS3 +|oneOf|✗|OAS3 +|not|✗|OAS3 + +### Security Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|BasicAuth|✓|OAS2,OAS3 +|ApiKey|✓|OAS2,OAS3 +|OpenIDConnect|✗|OAS3 +|BearerToken|✓|OAS3 +|OAuth2_Implicit|✓|OAS2,OAS3 +|OAuth2_Password|✓|OAS2,OAS3 +|OAuth2_ClientCredentials|✓|OAS2,OAS3 +|OAuth2_AuthorizationCode|✓|OAS2,OAS3 +|SignatureAuth|✗|OAS3 +|AWSV4Signature|✗|ToolingExtension + +### Wire Format Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|JSON|✓|OAS2,OAS3 +|XML|✓|OAS2,OAS3 +|PROTOBUF|✗|ToolingExtension +|Custom|✗|OAS2,OAS3 From 5f7de6d2e08165f0e616774484a2bfe68fb274d9 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 10:12:26 +0200 Subject: [PATCH 17/22] [kotlin-wiremock] Generated docs (missed commit) --- docs/generators/java-wiremock.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/generators/java-wiremock.md b/docs/generators/java-wiremock.md index 1ae178f9927c..081a1296745e 100644 --- a/docs/generators/java-wiremock.md +++ b/docs/generators/java-wiremock.md @@ -11,7 +11,7 @@ title: Documentation for the java-wiremock Generator | generator type | SERVER | | | generator language | Java | | | generator default templating engine | mustache | | -| helpTxt | Generates Java Wiremock stubs, requests and responses samples. | | +| helpTxt | Generates Java WireMock stubs, requests and responses samples. | | ## CONFIG OPTIONS These options may be applied as additional-properties (cli) or configOptions (plugins). Refer to [configuration docs](https://openapi-generator.tech/docs/configuration) for more details. From 71e1c47def93fdcb9c7e4efe999fc34e21d7518c Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 10:12:44 +0200 Subject: [PATCH 18/22] [kotlin-wiremock] Explicit Gradle wrapper version in kotlin server generators --- .../libraries/javalin5/build.gradle.kts.mustache | 4 ++++ .../libraries/spring-boot/buildGradle-sb3-Kts.mustache | 4 ++++ .../libraries/spring-boot/buildGradleKts.mustache | 4 ++++ .../libraries/spring-cloud/buildGradle-sb3-Kts.mustache | 4 ++++ .../libraries/spring-cloud/buildGradleKts.mustache | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/modules/openapi-generator/src/main/resources/kotlin-server/libraries/javalin5/build.gradle.kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-server/libraries/javalin5/build.gradle.kts.mustache index 7ca2fab59f89..774664014163 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-server/libraries/javalin5/build.gradle.kts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-server/libraries/javalin5/build.gradle.kts.mustache @@ -12,6 +12,10 @@ repositories { mavenCentral() } +tasks.wrapper { + gradleVersion = "6.9" +} + tasks.withType { kotlinOptions.jvmTarget = "17" } diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradle-sb3-Kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradle-sb3-Kts.mustache index 7f4a6f3105e7..a7453a883b6c 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradle-sb3-Kts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradle-sb3-Kts.mustache @@ -13,6 +13,10 @@ tasks.withType { kotlinOptions.jvmTarget = "17" } +tasks.wrapper { + gradleVersion = "6.9" +} + plugins { val kotlinVersion = "1.7.10" id("org.jetbrains.kotlin.jvm") version kotlinVersion diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache index 77abd068b75c..338f323f9a87 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache @@ -16,6 +16,10 @@ repositories { mavenCentral() } +tasks.wrapper { + gradleVersion = "6.9" +} + tasks.withType { kotlinOptions.jvmTarget = "1.8" } diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradle-sb3-Kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradle-sb3-Kts.mustache index 1bf4d3130667..3af38bbb63be 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradle-sb3-Kts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradle-sb3-Kts.mustache @@ -9,6 +9,10 @@ repositories { maven { url = uri("https://repo.spring.io/milestone") } } +tasks.wrapper { + gradleVersion = "6.9" +} + tasks.withType { kotlinOptions.jvmTarget = "17" } diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradleKts.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradleKts.mustache index b1a7e08ce4b9..498c22566eae 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradleKts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradleKts.mustache @@ -16,6 +16,10 @@ repositories { mavenCentral() } +tasks.wrapper { + gradleVersion = "6.9" +} + tasks.withType { kotlinOptions.jvmTarget = "1.8" } From d6dd1363987bf048ced6d583aeb25f60980d9b37 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 10:17:39 +0200 Subject: [PATCH 19/22] Revert "[kotlin-wiremock] Explicit Gradle wrapper version in kotlin server generators" This reverts commit 71e1c47def93fdcb9c7e4efe999fc34e21d7518c. --- .../libraries/javalin5/build.gradle.kts.mustache | 4 ---- .../libraries/spring-boot/buildGradle-sb3-Kts.mustache | 4 ---- .../libraries/spring-boot/buildGradleKts.mustache | 4 ---- .../libraries/spring-cloud/buildGradle-sb3-Kts.mustache | 4 ---- .../libraries/spring-cloud/buildGradleKts.mustache | 4 ---- 5 files changed, 20 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/kotlin-server/libraries/javalin5/build.gradle.kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-server/libraries/javalin5/build.gradle.kts.mustache index 774664014163..7ca2fab59f89 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-server/libraries/javalin5/build.gradle.kts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-server/libraries/javalin5/build.gradle.kts.mustache @@ -12,10 +12,6 @@ repositories { mavenCentral() } -tasks.wrapper { - gradleVersion = "6.9" -} - tasks.withType { kotlinOptions.jvmTarget = "17" } diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradle-sb3-Kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradle-sb3-Kts.mustache index a7453a883b6c..7f4a6f3105e7 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradle-sb3-Kts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradle-sb3-Kts.mustache @@ -13,10 +13,6 @@ tasks.withType { kotlinOptions.jvmTarget = "17" } -tasks.wrapper { - gradleVersion = "6.9" -} - plugins { val kotlinVersion = "1.7.10" id("org.jetbrains.kotlin.jvm") version kotlinVersion diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache index 338f323f9a87..77abd068b75c 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache @@ -16,10 +16,6 @@ repositories { mavenCentral() } -tasks.wrapper { - gradleVersion = "6.9" -} - tasks.withType { kotlinOptions.jvmTarget = "1.8" } diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradle-sb3-Kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradle-sb3-Kts.mustache index 3af38bbb63be..1bf4d3130667 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradle-sb3-Kts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradle-sb3-Kts.mustache @@ -9,10 +9,6 @@ repositories { maven { url = uri("https://repo.spring.io/milestone") } } -tasks.wrapper { - gradleVersion = "6.9" -} - tasks.withType { kotlinOptions.jvmTarget = "17" } diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradleKts.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradleKts.mustache index 498c22566eae..b1a7e08ce4b9 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradleKts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradleKts.mustache @@ -16,10 +16,6 @@ repositories { mavenCentral() } -tasks.wrapper { - gradleVersion = "6.9" -} - tasks.withType { kotlinOptions.jvmTarget = "1.8" } From 848d541aa7e4c5f2e8bc3a5e619218dc5cfba620 Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 10:21:06 +0200 Subject: [PATCH 20/22] [kotlin-wiremock] Revert Gradle in workflow samples-kotlin-server and moved kotlin-wiremock samples to separate workflow --- .github/workflows/samples-kotlin-server.yaml | 6 ++- .../workflows/samples-kotlin-wiremock.yaml | 44 +++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/samples-kotlin-wiremock.yaml diff --git a/.github/workflows/samples-kotlin-server.yaml b/.github/workflows/samples-kotlin-server.yaml index 58fe9796161c..b98d4c69532a 100644 --- a/.github/workflows/samples-kotlin-server.yaml +++ b/.github/workflows/samples-kotlin-server.yaml @@ -16,6 +16,9 @@ on: # comment out due to gradle build failure # - samples/server/petstore/kotlin-spring-default/** +env: + GRADLE_VERSION: 6.9 + jobs: build: name: Build Kotlin server @@ -40,8 +43,6 @@ jobs: - samples/server/petstore/kotlin-server/javalin - samples/server/others/kotlin-server/jaxrs-spec - samples/server/others/kotlin-server/jaxrs-spec-array-response - - samples/server/petstore/kotlin-wiremock - - samples/server/echo_api/kotlin-wiremock - samples/server/petstore/kotlin-spring-cloud # comment out due to gradle build failure #- samples/server/petstore/kotlin-spring-default @@ -64,6 +65,7 @@ jobs: - name: Install Gradle wrapper uses: eskatos/gradle-command-action@v3 with: + gradle-version: ${{ env.GRADLE_VERSION }} build-root-directory: ${{ matrix.sample }} arguments: wrapper - name: Build diff --git a/.github/workflows/samples-kotlin-wiremock.yaml b/.github/workflows/samples-kotlin-wiremock.yaml new file mode 100644 index 000000000000..0182a0df4daa --- /dev/null +++ b/.github/workflows/samples-kotlin-wiremock.yaml @@ -0,0 +1,44 @@ +name: Samples Kotlin WireMock + +on: + push: + branches: + - samples/server/petstore/kotlin-wiremock/** + - samples/server/echo_api/kotlin-wiremock/** + pull_request: + paths: + - samples/server/petstore/kotlin-wiremock/** + - samples/server/echo_api/kotlin-wiremock/** + +jobs: + build: + name: Build Kotlin WireMock + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + sample: + - samples/server/petstore/kotlin-wiremock + - samples/server/echo_api/kotlin-wiremock + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: 8 + - name: Cache maven dependencies + uses: actions/cache@v4 + env: + cache-name: maven-repository + with: + path: | + ~/.gradle + key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} + - name: Install Gradle wrapper + uses: eskatos/gradle-command-action@v3 + with: + build-root-directory: ${{ matrix.sample }} + arguments: wrapper + - name: Build + working-directory: ${{ matrix.sample }} + run: ./gradlew build -x test From 5a9b7db491ff2ac7ee6cbd6caadc462a7e7d9bbf Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 10:32:14 +0200 Subject: [PATCH 21/22] [kotlin-wiremock] Use Java 11 instead of Java 8 --- .github/workflows/samples-kotlin-wiremock.yaml | 2 +- .../resources/kotlin-wiremock/build.gradle.kts.mustache | 6 ++++++ samples/server/echo_api/kotlin-wiremock/build.gradle.kts | 6 ++++++ samples/server/petstore/kotlin-wiremock/build.gradle.kts | 6 ++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/workflows/samples-kotlin-wiremock.yaml b/.github/workflows/samples-kotlin-wiremock.yaml index 0182a0df4daa..6b40912dd265 100644 --- a/.github/workflows/samples-kotlin-wiremock.yaml +++ b/.github/workflows/samples-kotlin-wiremock.yaml @@ -25,7 +25,7 @@ jobs: - uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: 8 + java-version: 11 - name: Cache maven dependencies uses: actions/cache@v4 env: diff --git a/modules/openapi-generator/src/main/resources/kotlin-wiremock/build.gradle.kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-wiremock/build.gradle.kts.mustache index 02ba9002a37f..776d58d1be97 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-wiremock/build.gradle.kts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-wiremock/build.gradle.kts.mustache @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + group = "{{groupId}}" version = "{{artifactVersion}}" @@ -9,6 +11,10 @@ plugins { alias(libs.plugins.kotlin.jvm) } +tasks.withType { + kotlinOptions.jvmTarget = "11" +} + dependencies { implementation(libs.wiremock) implementation(libs.jackson.databind) diff --git a/samples/server/echo_api/kotlin-wiremock/build.gradle.kts b/samples/server/echo_api/kotlin-wiremock/build.gradle.kts index ecf4ad85416d..f5d878978f3e 100644 --- a/samples/server/echo_api/kotlin-wiremock/build.gradle.kts +++ b/samples/server/echo_api/kotlin-wiremock/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + group = "org.openapitools" version = "1.0.0" @@ -9,6 +11,10 @@ plugins { alias(libs.plugins.kotlin.jvm) } +tasks.withType { + kotlinOptions.jvmTarget = "11" +} + dependencies { implementation(libs.wiremock) implementation(libs.jackson.databind) diff --git a/samples/server/petstore/kotlin-wiremock/build.gradle.kts b/samples/server/petstore/kotlin-wiremock/build.gradle.kts index ecf4ad85416d..f5d878978f3e 100644 --- a/samples/server/petstore/kotlin-wiremock/build.gradle.kts +++ b/samples/server/petstore/kotlin-wiremock/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + group = "org.openapitools" version = "1.0.0" @@ -9,6 +11,10 @@ plugins { alias(libs.plugins.kotlin.jvm) } +tasks.withType { + kotlinOptions.jvmTarget = "11" +} + dependencies { implementation(libs.wiremock) implementation(libs.jackson.databind) From 0fd29524c0c3396a6da9d5ad14200dbf05a1f86d Mon Sep 17 00:00:00 2001 From: stefankoppier Date: Sun, 19 May 2024 10:56:12 +0200 Subject: [PATCH 22/22] [kotlin-wiremock] ensure-up-to-date --- docs/generators.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/generators.md b/docs/generators.md index 16a044f8d86d..bb058761aea1 100644 --- a/docs/generators.md +++ b/docs/generators.md @@ -120,6 +120,7 @@ The following generators are available: * [kotlin-server](generators/kotlin-server.md) * [kotlin-spring](generators/kotlin-spring.md) * [kotlin-vertx (beta)](generators/kotlin-vertx.md) +* [kotlin-wiremock (beta)](generators/kotlin-wiremock.md) * [nodejs-express-server (beta)](generators/nodejs-express-server.md) * [php-flight (experimental)](generators/php-flight.md) * [php-laravel](generators/php-laravel.md)