forked from loafle/openapi-generator-original
Add EchoServerResponseParser.kt to Kotlin Echo API client (#17887)
* add kotlin jvm retrofit2 coroutine echo client * add tests for echo server parser * add workflow * remove coroutines sample
This commit is contained in:
parent
7d539bcb78
commit
28b75377b5
50
.github/workflows/samples-kotlin-echo-api.yaml
vendored
Normal file
50
.github/workflows/samples-kotlin-echo-api.yaml
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
name: Kotlin Client (Echo API) JDK17
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- samples/client/echo_api/kotlin**
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- samples/client/echo_api/kotlin**
|
||||||
|
env:
|
||||||
|
GRADLE_VERSION: 7.4
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build Kotlin Client JDK17
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
sample:
|
||||||
|
# clients
|
||||||
|
- samples/client/echo_api/kotlin-jvm-spring-3-restclient
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
distribution: 'temurin'
|
||||||
|
java-version: 17
|
||||||
|
- 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:
|
||||||
|
gradle-version: ${{ env.GRADLE_VERSION }}
|
||||||
|
build-root-directory: ${{ matrix.sample }}
|
||||||
|
arguments: wrapper
|
||||||
|
- name: Setup node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
- name: Run echo server
|
||||||
|
run: |
|
||||||
|
git clone https://github.com/wing328/http-echo-server -b openapi-generator-test-server
|
||||||
|
(cd http-echo-server && npm install && npm start &)
|
||||||
|
- name: Build
|
||||||
|
working-directory: ${{ matrix.sample }}
|
||||||
|
run: ./gradlew build
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -212,6 +212,7 @@ samples/server/petstore/kotlin-springboot/build
|
|||||||
samples/client/petstore/kotlin*/src/main/kotlin/test/
|
samples/client/petstore/kotlin*/src/main/kotlin/test/
|
||||||
samples/client/petstore/kotlin*/build/
|
samples/client/petstore/kotlin*/build/
|
||||||
samples/server/others/kotlin-server/jaxrs-spec/build/
|
samples/server/others/kotlin-server/jaxrs-spec/build/
|
||||||
|
samples/client/echo_api/kotlin-jvm-spring-3-restclient/build/
|
||||||
|
|
||||||
# haskell
|
# haskell
|
||||||
.stack-work
|
.stack-work
|
||||||
|
@ -0,0 +1,74 @@
|
|||||||
|
package org.openapitools.client
|
||||||
|
|
||||||
|
import io.kotlintest.shouldBe
|
||||||
|
import io.kotlintest.specs.ShouldSpec
|
||||||
|
import org.openapitools.client.apis.BodyApi
|
||||||
|
import org.openapitools.client.apis.QueryApi
|
||||||
|
import org.openapitools.client.models.Category
|
||||||
|
import org.openapitools.client.models.Pet
|
||||||
|
import org.openapitools.client.models.Tag
|
||||||
|
|
||||||
|
class PetApiTest : ShouldSpec() {
|
||||||
|
init {
|
||||||
|
val petId:Long = 10006
|
||||||
|
val queryApi = QueryApi("http://localhost:3000")
|
||||||
|
val bodyApi = BodyApi("http://localhost:3000")
|
||||||
|
|
||||||
|
should("return a pet") {
|
||||||
|
val pet : Pet = Pet(
|
||||||
|
id = petId,
|
||||||
|
name = "kotlin client test",
|
||||||
|
photoUrls = listOf("http://test_kotlin_unit_test.com"),
|
||||||
|
category = Category(petId, "test kotlin category"),
|
||||||
|
tags = listOf(Tag(petId, "test kotlin tag"))
|
||||||
|
)
|
||||||
|
|
||||||
|
/* comment out the following as for some reasons http request body contains
|
||||||
|
a line "cc" before the JSON payload, e.g.
|
||||||
|
|
||||||
|
Echo mode switched on for this request
|
||||||
|
--> POST /echo/body/Pet HTTP/1.1
|
||||||
|
--> Connection: Upgrade, HTTP2-Settings
|
||||||
|
--> Host: localhost:3000
|
||||||
|
--> HTTP2-Settings: AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA
|
||||||
|
--> Transfer-encoding: chunked
|
||||||
|
--> Upgrade: h2c
|
||||||
|
--> User-Agent: Java-http-client/17.0.10
|
||||||
|
--> Accept: application/json
|
||||||
|
--> Content-Type: application/json
|
||||||
|
-->
|
||||||
|
-->
|
||||||
|
Found the content-type: application/json
|
||||||
|
Found the blank line before the response body
|
||||||
|
<--
|
||||||
|
[socket#8] event: data
|
||||||
|
--> cc
|
||||||
|
--> {"name":"kotlin client test","photoUrls":["http://test_kotlin_unit_test.com"],"id":10006,"category":{"id":10006,"name":"test kotlin category"},"tags":[{"id":10006,"name":"test kotlin tag"}],"status":null}
|
||||||
|
-->
|
||||||
|
<-- cc
|
||||||
|
<-- {"name":"kotlin client test","photoUrls":["http://test_kotlin_unit_test.com"],"id":10006,"category":{"id":10006,"name":"test kotlin category"},"tags":[{"id":10006,"name":"test kotlin tag"}],"status":null}
|
||||||
|
<--
|
||||||
|
[socket#8] event: data
|
||||||
|
|
||||||
|
val result : Pet = bodyApi.testEchoBodyPet(pet)
|
||||||
|
|
||||||
|
result.id shouldBe (petId)
|
||||||
|
result.name shouldBe ("kotlin client test")
|
||||||
|
result.photoUrls[0] shouldBe ("http://test_kotlin_unit_test.com")
|
||||||
|
result.category!!.id shouldBe (petId)
|
||||||
|
result.category!!.name shouldBe ("test kotlin category")
|
||||||
|
result.tags!![0].id shouldBe (petId)
|
||||||
|
result.tags!![0].name shouldBe ("test kotlin tag")
|
||||||
|
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
should("test echo server response parser") {
|
||||||
|
val response: String = queryApi.testQueryStyleFormExplodeTrueArrayString()
|
||||||
|
val result = EchoServerResponseParser(response)
|
||||||
|
result.path shouldBe ("/query/style_form/explode_true/array_string")
|
||||||
|
result.method shouldBe ("GET")
|
||||||
|
result.body shouldBe ("")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package org.openapitools.client
|
||||||
|
|
||||||
|
class EchoServerResponseParser(response: String) {
|
||||||
|
lateinit var method: String
|
||||||
|
lateinit var path: String
|
||||||
|
lateinit var protocol: String
|
||||||
|
val headers = hashMapOf<String, String>()
|
||||||
|
val body: String
|
||||||
|
|
||||||
|
init {
|
||||||
|
require(response.isNotEmpty()) { "Echo server response cannot be null" }
|
||||||
|
|
||||||
|
val lines = response.lineSequence().iterator()
|
||||||
|
var firstLine = true
|
||||||
|
var bodyStart = false
|
||||||
|
val bodyBuilder = StringBuilder()
|
||||||
|
for (line in lines) {
|
||||||
|
if (firstLine) {
|
||||||
|
val items = line.split(" ")
|
||||||
|
method = items[0]
|
||||||
|
path = items[1]
|
||||||
|
protocol = items[2]
|
||||||
|
firstLine = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (bodyStart) {
|
||||||
|
bodyBuilder.append(line)
|
||||||
|
bodyBuilder.append("\n")
|
||||||
|
}
|
||||||
|
if (line.isEmpty()) {
|
||||||
|
bodyStart = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
val keyValue = line.split(": ")
|
||||||
|
if (keyValue.size == 2) {
|
||||||
|
headers[keyValue[0]] = keyValue[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
body = bodyBuilder.toString().trimEnd()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user