Skip to content

Commit b0eec58

Browse files
committed
add ExampleEncoderTest
1 parent 9384802 commit b0eec58

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

ktor-openapi/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ dependencies {
6060
val versionMockk: String by project
6161
testImplementation("io.mockk:mockk:$versionMockk")
6262

63+
val versionLogback: String by project
64+
testImplementation("ch.qos.logback:logback-classic:$versionLogback")
65+
6366
}
6467

6568
kotlin {
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package io.github.smiley4.ktorswaggerui.misc
2+
3+
import io.github.smiley4.ktoropenapi.OpenApi
4+
import io.github.smiley4.ktoropenapi.config.ExampleEncoder
5+
import io.github.smiley4.ktoropenapi.get
6+
import io.github.smiley4.ktoropenapi.openApi
7+
import io.kotest.core.spec.style.StringSpec
8+
import io.kotest.matchers.shouldNotBe
9+
import io.ktor.client.request.get
10+
import io.ktor.client.statement.bodyAsText
11+
import io.ktor.http.HttpStatusCode
12+
import io.ktor.server.response.respond
13+
import io.ktor.server.routing.route
14+
import io.ktor.server.testing.testApplication
15+
import kotlinx.serialization.KSerializer
16+
import kotlinx.serialization.descriptors.PrimitiveKind
17+
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
18+
import kotlinx.serialization.descriptors.SerialDescriptor
19+
import kotlinx.serialization.encoding.Decoder
20+
import kotlinx.serialization.encoding.Encoder
21+
import kotlinx.serialization.json.Json
22+
import kotlinx.serialization.modules.SerializersModule
23+
import java.time.LocalDate
24+
import java.time.format.DateTimeFormatter
25+
26+
27+
class ExampleEncoderTest : StringSpec({
28+
29+
val json = Json {
30+
classDiscriminator = "_type"
31+
serializersModule = SerializersModule {
32+
contextual(LocalDate::class, object : KSerializer<LocalDate> {
33+
private val formatter: DateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE
34+
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("LocalDate", PrimitiveKind.STRING)
35+
override fun deserialize(decoder: Decoder) = LocalDate.parse(decoder.decodeString(), formatter)
36+
override fun serialize(encoder: Encoder, value: LocalDate) = encoder.encodeString(formatter.format(value))
37+
})
38+
}
39+
}
40+
41+
"ExampleEncoder.kotlinx should not fail with contextual type" {
42+
testApplication {
43+
install(OpenApi) {
44+
examples {
45+
encoder(ExampleEncoder.kotlinx(json))
46+
}
47+
}
48+
routing {
49+
route("api.yml") {
50+
openApi()
51+
}
52+
53+
get("test", {
54+
response {
55+
HttpStatusCode.OK to {
56+
body<LocalDate> {
57+
example("example") {
58+
value = LocalDate.of(2025, 12, 9)
59+
}
60+
}
61+
}
62+
}
63+
}) {
64+
call.respond(HttpStatusCode.OK)
65+
}
66+
}
67+
68+
createClient {}.get("api.yml").bodyAsText() shouldNotBe "{}"
69+
}
70+
}
71+
})

0 commit comments

Comments
 (0)