Add support for JSON streams to Kotlin Serialization
Closes gh-32074
This commit is contained in:
committed by
Sébastien Deleuze
parent
4d7da0059e
commit
11898daed7
@@ -23,6 +23,7 @@ import org.springframework.core.io.buffer.DataBuffer
|
||||
import org.springframework.core.testfixture.codec.AbstractDecoderTests
|
||||
import org.springframework.http.MediaType
|
||||
import org.springframework.http.customJson
|
||||
import reactor.core.publisher.Flux
|
||||
import reactor.core.publisher.Mono
|
||||
import reactor.test.StepVerifier
|
||||
import java.math.BigDecimal
|
||||
@@ -45,12 +46,16 @@ class CustomKotlinSerializationJsonDecoderTests :
|
||||
|
||||
@Test
|
||||
override fun decode() {
|
||||
val output = decoder.decode(Mono.empty(),
|
||||
ResolvableType.forClass(KotlinSerializationJsonDecoderTests.Pojo::class.java), null, emptyMap())
|
||||
val input = Flux.concat(
|
||||
stringBuffer("1.0\n"),
|
||||
stringBuffer("2.0\n")
|
||||
)
|
||||
val output = decoder.decode(input, ResolvableType.forClass(BigDecimal::class.java), null, emptyMap())
|
||||
StepVerifier
|
||||
.create(output)
|
||||
.expectError(UnsupportedOperationException::class.java)
|
||||
.verify()
|
||||
.expectNext(BigDecimal.valueOf(1.0))
|
||||
.expectNext(BigDecimal.valueOf(2.0))
|
||||
.verifyComplete()
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -63,6 +63,8 @@ class KotlinSerializationJsonDecoderTests : AbstractDecoderTests<KotlinSerializa
|
||||
assertThat(decoder.canDecode(ResolvableType.forClass(Ordered::class.java), MediaType.APPLICATION_JSON)).isFalse()
|
||||
assertThat(decoder.canDecode(ResolvableType.NONE, MediaType.APPLICATION_JSON)).isFalse()
|
||||
assertThat(decoder.canDecode(ResolvableType.forClass(BigDecimal::class.java), MediaType.APPLICATION_JSON)).isFalse()
|
||||
|
||||
assertThat(decoder.canDecode(ResolvableType.forClass(Pojo::class.java), MediaType.APPLICATION_NDJSON)).isTrue()
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -73,6 +75,23 @@ class KotlinSerializationJsonDecoderTests : AbstractDecoderTests<KotlinSerializa
|
||||
.expectError(UnsupportedOperationException::class.java)
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
fun decodeStream() {
|
||||
val input = Flux.concat(
|
||||
stringBuffer("{\"bar\":\"b1\",\"foo\":\"f1\"}\n"),
|
||||
stringBuffer("{\"bar\":\"b2\",\"foo\":\"f2\"}\n")
|
||||
)
|
||||
|
||||
testDecodeAll(input, ResolvableType.forClass(Pojo::class.java), { step: FirstStep<Any> ->
|
||||
step
|
||||
.expectNext(Pojo("f1", "b1"))
|
||||
.expectNext(Pojo("f2", "b2"))
|
||||
.expectComplete()
|
||||
.verify()
|
||||
}, null, null)
|
||||
}
|
||||
|
||||
@Test
|
||||
override fun decodeToMono() {
|
||||
val input = Flux.concat(
|
||||
|
||||
@@ -58,14 +58,16 @@ class KotlinSerializationJsonEncoderTests : AbstractEncoderTests<KotlinSerializa
|
||||
assertThat(encoder.canEncode(ResolvableType.forClassWithGenerics(ArrayList::class.java, Int::class.java), MediaType.APPLICATION_JSON)).isTrue()
|
||||
assertThat(encoder.canEncode(ResolvableType.forClassWithGenerics(ArrayList::class.java, Int::class.java), MediaType.APPLICATION_PDF)).isFalse()
|
||||
assertThat(encoder.canEncode(ResolvableType.NONE, MediaType.APPLICATION_JSON)).isFalse()
|
||||
|
||||
assertThat(encoder.canEncode(pojoType, MediaType.APPLICATION_NDJSON)).isTrue()
|
||||
}
|
||||
|
||||
@Test
|
||||
override fun encode() {
|
||||
val input = Flux.just(
|
||||
Pojo("foo", "bar"),
|
||||
Pojo("foofoo", "barbar"),
|
||||
Pojo("foofoofoo", "barbarbar")
|
||||
Pojo("foo", "bar"),
|
||||
Pojo("foofoo", "barbar"),
|
||||
Pojo("foofoofoo", "barbarbar")
|
||||
)
|
||||
testEncode(input, Pojo::class.java, { step: FirstStep<DataBuffer?> -> step
|
||||
.consumeNextWith(expectString("[" +
|
||||
@@ -76,6 +78,26 @@ class KotlinSerializationJsonEncoderTests : AbstractEncoderTests<KotlinSerializa
|
||||
.verifyComplete()
|
||||
})
|
||||
}
|
||||
@Test
|
||||
fun encodeStream() {
|
||||
val input = Flux.just(
|
||||
Pojo("foo", "bar"),
|
||||
Pojo("foofoo", "barbar"),
|
||||
Pojo("foofoofoo", "barbarbar")
|
||||
)
|
||||
testEncodeAll(
|
||||
input,
|
||||
ResolvableType.forClass(Pojo::class.java),
|
||||
MediaType.APPLICATION_NDJSON,
|
||||
null
|
||||
) { step: FirstStep<DataBuffer?> ->
|
||||
step
|
||||
.consumeNextWith(expectString("{\"foo\":\"foo\",\"bar\":\"bar\"}\n"))
|
||||
.consumeNextWith(expectString("{\"foo\":\"foofoo\",\"bar\":\"barbar\"}\n"))
|
||||
.consumeNextWith(expectString("{\"foo\":\"foofoofoo\",\"bar\":\"barbarbar\"}\n"))
|
||||
.verifyComplete()
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun encodeMono() {
|
||||
|
||||
Reference in New Issue
Block a user