Skip to content

Commit 6c881b3

Browse files
authored
Merge pull request #19 from lcomment/develop/v1.0.2
Merge develop to master
2 parents 3dc7260 + f9e788e commit 6c881b3

File tree

5 files changed

+65
-3
lines changed

5 files changed

+65
-3
lines changed

example/src/main/kotlin/io/github/lcomment/example/dto/request/ExampleRequest.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,21 @@
1818

1919
package io.github.lcomment.example.dto.request
2020

21+
import io.github.lcomment.example.dto.response.ArrayResponse
22+
import io.github.lcomment.example.enums.ExampleEnum
2123
import jakarta.validation.constraints.NotBlank
2224

2325
data class ExampleRequest(
2426
@field:NotBlank
2527
val example: String? = null,
26-
)
28+
val arrayData: ArrayResponse = ArrayResponse(),
29+
val enumData: ExampleEnum = ExampleEnum.EXAMPLE1,
30+
val objectData: ObjectExample = ObjectExample(),
31+
) {
32+
33+
data class ObjectExample(
34+
val value1: String = "value1",
35+
val value2: Int = 1,
36+
val value3: Boolean = true,
37+
)
38+
}

example/src/test/kotlin/io/github/lcomment/example/controller/ApiSpec.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,13 @@ internal class ApiSpec {
140140

141141
requestField {
142142
field("example", "example request", "example")
143+
field("arrayData.array1", "Array Data 1", request.arrayData.array1)
144+
field("arrayData.array2", "Array Data 2", request.arrayData.array2)
145+
field("arrayData.array3", "Array Data 3", request.arrayData.array3)
146+
field("enumData", "Enum Data", ExampleEnum.EXAMPLE1)
147+
field("objectData.value1", "Object Value 1", request.objectData.value1)
148+
field("objectData.value2", "Object Value 2", request.objectData.value2)
149+
field("objectData.value3", "Object Value 3", request.objectData.value3)
143150
}
144151
}
145152
}
@@ -230,7 +237,15 @@ internal class ApiSpec {
230237
}
231238

232239
requestField {
233-
field("example", "example request", "example")
240+
field("example", "Example Request", "example")
241+
ignoredField("arrayData")
242+
field("arrayData.array1", "Array Data 1", listOf("item1", "item2"))
243+
field("arrayData.array2", "Array Data 2", setOf("item1", "item2"))
244+
field("arrayData.array3", "Array Data 3", arrayOf("item1", "item2"))
245+
field("enumData", "Enum Data", ExampleEnum.EXAMPLE1)
246+
field("objectData.value1", "Object Value 1", "value1")
247+
field("objectData.value2", "Object Value 2", 1)
248+
field("objectData.value3", "Object Value 3", true)
234249
}
235250

236251
responseField {

korest-docs-mockmvc/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ dependencies {
1313
implementation(libs.jackson.databind)
1414
implementation(libs.jackson.datatype.jsr310)
1515
implementation(libs.jackson.core)
16+
implementation(libs.jackson.module.kotlin)
1617

1718
testImplementation(libs.kotest.junit)
1819
testImplementation(libs.kotest.assertions.core)

korest-docs-mockmvc/src/main/kotlin/io/github/lcomment/korestdocs/mockmvc/MockMvcDocumentation.kt

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ private fun requestHttp(
9999
header(key, value.toString())
100100
}
101101

102-
content = toJson(requestFieldsSpec?.fields ?: emptyMap<String, Any>())
102+
content = toJsonString(requestFieldsSpec?.fields ?: emptyMap())
103103
contentType = MediaType.APPLICATION_JSON
104104
}
105105
}
@@ -141,6 +141,39 @@ private fun requestMultipart(
141141
}
142142
}
143143

144+
fun toJsonString(flatMap: Map<String, Any>): String {
145+
val nestedMap = mutableMapOf<String, Any>()
146+
147+
val asMap = flatMap.keys
148+
.filter { it.contains('.') }
149+
.map { it.substringBefore('.') }
150+
.toSet()
151+
152+
for ((key, value) in flatMap) {
153+
if (asMap.contains(key) && !key.contains('.')) {
154+
continue
155+
}
156+
157+
insert(nestedMap, key, value)
158+
}
159+
160+
return toJson(nestedMap)
161+
}
162+
163+
fun insert(map: MutableMap<String, Any>, key: String, value: Any) {
164+
val dotIndex = key.indexOf('.')
165+
166+
if (dotIndex == -1) {
167+
map[key] = value
168+
} else {
169+
val first = key.substring(0, dotIndex)
170+
val rest = key.substring(dotIndex + 1)
171+
val child = map.getOrPut(first) { mutableMapOf<String, Any>() } as MutableMap<String, Any>
172+
173+
insert(child, rest, value)
174+
}
175+
}
176+
144177
fun toJson(value: Any): String {
145178
return mapper.writeValueAsString(value)
146179
}

libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ spring-boot-starter-security = { module = "org.springframework.boot:spring-boot-
5151
jackson-core = { module = "com.fasterxml.jackson.core:jackson-core", version.ref = "jackson" }
5252
jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", version.ref = "jackson" }
5353
jackson-datatype-jsr310 = { module = "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", version.ref = "jackson" }
54+
jackson-module-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jackson" }
5455

5556
# test
5657
spring-test = { module = "org.springframework:spring-test", version.ref = "spring6" }

0 commit comments

Comments
 (0)