Skip to content

Commit

Permalink
Added reproducer/demo tests for FasterXML/jackson-module-kotlin#650 and
Browse files Browse the repository at this point in the history
  • Loading branch information
ianbrandt committed May 1, 2023
1 parent ccf0037 commit d351b1b
Show file tree
Hide file tree
Showing 7 changed files with 273 additions and 0 deletions.
22 changes: 22 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ assertj = "3.24.2"
dependency-analysis-gradle-plugin = "1.20.0"
equalsverifier = "3.11.1"
jetbrains-annotations = "23.0.0"
jackson = "2.14.2"
jackson-kogera = "2.14.2-alpha7"
jakarta-inject = "2.0.0"
junit = "5.9.3" # Duplicated in unit-test-suite.gradle.kts.
kotlin = "1.8.10" # See also `kotlinTargetVersion` in kotlin-project.gradle.kts.
Expand Down Expand Up @@ -31,6 +33,18 @@ version.ref = "dependency-analysis-gradle-plugin"
module = "nl.jqno.equalsverifier:equalsverifier"
version.ref = "equalsverifier"

[libraries.jackson-bom]
module = "com.fasterxml.jackson:jackson-bom"
version.ref = "jackson"

[libraries.jackson-module-kogera]
module = "com.github.ProjectMapK:jackson-module-kogera"
version.ref = "jackson-kogera"

[libraries.jackson-module-kotlin]
module = "com.fasterxml.jackson.module:jackson-module-kotlin"
version.ref = "jackson"

[libraries.jakarta-inject]
module = "jakarta.inject:jakarta.inject-api"
version.ref = "jakarta-inject"
Expand Down Expand Up @@ -139,6 +153,10 @@ version.ref = "spring-boot"
module = "org.springframework.boot:spring-boot-starter"
version.ref = "spring-boot"

[libraries.spring-boot-starter-json]
module = "org.springframework.boot:spring-boot-starter-json"
version.ref = "spring-boot"

[libraries.spring-boot-starter-log4j2]
module = "org.springframework.boot:spring-boot-starter-log4j2"
version.ref = "spring-boot"
Expand All @@ -151,6 +169,10 @@ version.ref = "spring-boot"
module = "org.springframework.boot:spring-boot-starter-webflux"
version.ref = "spring-boot"

[libraries.spring-boot-test-autoconfigure]
module = "org.springframework.boot:spring-boot-test-autoconfigure"
version.ref = "spring-boot"

[libraries.spring-web]
module = "org.springframework:spring-web"
version.ref = "spring"
Expand Down
2 changes: 2 additions & 0 deletions platforms/app-platform/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ javaPlatform {

dependencies {

api(platform(libs.jackson.bom))
api(platform(libs.kotlinx.coroutines.bom))
api(platform(libs.log4j.bom))
api(platform(libs.spring.boot.bom))

constraints {
api(libs.jackson.module.kogera)
api(libs.jetbrains.annotations)
api(libs.bundles.kotlinx.datetime.jvm)
api(libs.bundles.log4j.kotlin)
Expand Down
3 changes: 3 additions & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ dependencyResolutionManagement {
@Suppress("UnstableApiUsage")
repositories {
mavenCentral()
maven { setUrl("https://jitpack.io") }
}
}

Expand All @@ -22,5 +23,7 @@ includeBuild("platforms")
include("subprojects:app")
include("subprojects:child-context:domain-service")
include("subprojects:child-context:rest-api")
include("subprojects:kotlin-json:jackson")
include("subprojects:kotlin-json:kogera")
include("subprojects:time-logger")
include("subprojects:time-service")
12 changes: 12 additions & 0 deletions subprojects/kotlin-json/jackson/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
plugins {
id("org.sdkotlin.buildlogic.spring-project")
}

dependencies {

integrationTestImplementation(libs.jackson.module.kotlin)
integrationTestImplementation(libs.spring.boot.starter.json)
integrationTestImplementation(libs.spring.boot.starter.test)
integrationTestImplementation(libs.spring.boot.test.autoconfigure)
integrationTestImplementation(libs.spring.context)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package org.sdkotlin.springdemo.kotlin.json.jackson

import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.ThrowingConsumer
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.json.JsonTest
import org.springframework.boot.test.json.JacksonTester
import org.springframework.boot.test.json.JsonContent
import org.springframework.context.annotation.Configuration

@JsonTest
internal class JacksonKotlinUnsignedIT(
@Autowired
val signedTypesJacksonTester: JacksonTester<SignedTypesEntity>,
@Autowired
val unsignedTypesJacksonTester: JacksonTester<UnsignedTypesEntity>,
) {

@Configuration
internal class TestConfig

@Test
fun `test signed value serialization`() {

val signedTypesEntity =
SignedTypesEntity(
signedInteger = 1,
signedLong = 2,
)

val signedTypesJsonContent: JsonContent<SignedTypesEntity> =
signedTypesJacksonTester.write(signedTypesEntity)

assertThat(signedTypesJsonContent)
.extractingJsonPathNumberValue("$.signedInteger")
.isEqualTo(1)
assertThat(signedTypesJsonContent)
.extractingJsonPathNumberValue("$.signedLong")
.satisfies(ThrowingConsumer { number ->
assertThat(number.toLong()).isEqualTo(2L)
})
}

@Test
fun `test signed value deserialization`() {

val signedTypesJson = """
{
"signedInteger": 1,
"signedLong": 2
}
""".trimIndent()

val content: SignedTypesEntity =
signedTypesJacksonTester.parseObject(signedTypesJson)

assertThat(content.signedInteger).isEqualTo(1)
assertThat(content.signedLong).isEqualTo(2L)
}

@Test
fun `test unsigned value serialization`() {

val unsignedTypesEntity =
UnsignedTypesEntity(
unsignedInteger = 1u,
unsignedLong = 2uL,
)

val unsignedTypesJsonContent: JsonContent<UnsignedTypesEntity> =
unsignedTypesJacksonTester.write(unsignedTypesEntity)

assertThat(unsignedTypesJsonContent)
.extractingJsonPathNumberValue("$.unsignedInteger")
.isEqualTo(1)
assertThat(unsignedTypesJsonContent)
.extractingJsonPathNumberValue("$.unsignedLong")
.satisfies(ThrowingConsumer { number ->
assertThat(number.toLong()).isEqualTo(2L)
})
}

@Test
@Disabled("https://github.com/FasterXML/jackson-module-kotlin/issues/650")
fun `test unsigned value deserialization`() {

val unsignedTypesJson = """
{
"unsignedInteger": 1,
"unsignedLong": 2
}
""".trimIndent()

val content: UnsignedTypesEntity =
unsignedTypesJacksonTester.parseObject(unsignedTypesJson)

assertThat(content.unsignedInteger).isEqualTo(1u)
assertThat(content.unsignedLong).isEqualTo(2uL)
}
}

data class SignedTypesEntity(
val signedInteger: Int,
val signedLong: Long,
)

data class UnsignedTypesEntity(
val unsignedInteger: UInt,
val unsignedLong: ULong,
)
12 changes: 12 additions & 0 deletions subprojects/kotlin-json/kogera/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
plugins {
id("org.sdkotlin.buildlogic.spring-project")
}

dependencies {

integrationTestImplementation(libs.jackson.module.kogera)
integrationTestImplementation(libs.spring.boot.starter.json)
integrationTestImplementation(libs.spring.boot.starter.test)
integrationTestImplementation(libs.spring.boot.test.autoconfigure)
integrationTestImplementation(libs.spring.context)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package org.sdkotlin.springdemo.kotlin.json.jackson

import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.ThrowingConsumer
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.json.JsonTest
import org.springframework.boot.test.json.JacksonTester
import org.springframework.boot.test.json.JsonContent
import org.springframework.context.annotation.Configuration

@JsonTest
internal class JacksonKogeraUnsignedIT(
@Autowired
val signedTypesJacksonTester: JacksonTester<SignedTypesEntity>,
@Autowired
val unsignedTypesJacksonTester: JacksonTester<UnsignedTypesEntity>,
) {

@Configuration
internal class TestConfig

@Test
fun `test signed value serialization`() {

val signedTypesEntity =
SignedTypesEntity(
signedInteger = 1,
signedLong = 2,
)

val signedTypesJsonContent: JsonContent<SignedTypesEntity> =
signedTypesJacksonTester.write(signedTypesEntity)

assertThat(signedTypesJsonContent)
.extractingJsonPathNumberValue("$.signedInteger")
.isEqualTo(1)
assertThat(signedTypesJsonContent)
.extractingJsonPathNumberValue("$.signedLong")
.satisfies(ThrowingConsumer { number ->
assertThat(number.toLong()).isEqualTo(2L)
})
}

@Test
fun `test signed value deserialization`() {

val signedTypesJson = """
{
"signedInteger": 1,
"signedLong": 2
}
""".trimIndent()

val content: SignedTypesEntity =
signedTypesJacksonTester.parseObject(signedTypesJson)

assertThat(content.signedInteger).isEqualTo(1)
assertThat(content.signedLong).isEqualTo(2L)
}

@Test
fun `test unsigned value serialization`() {

val unsignedTypesEntity =
UnsignedTypesEntity(
unsignedInteger = 1u,
unsignedLong = 2uL,
)

val unsignedTypesJsonContent: JsonContent<UnsignedTypesEntity> =
unsignedTypesJacksonTester.write(unsignedTypesEntity)

assertThat(unsignedTypesJsonContent)
.extractingJsonPathNumberValue("$.unsignedInteger")
.isEqualTo(1)
assertThat(unsignedTypesJsonContent)
.extractingJsonPathNumberValue("$.unsignedLong")
.satisfies(ThrowingConsumer { number ->
assertThat(number.toLong()).isEqualTo(2L)
})
}

@Test
fun `test unsigned value deserialization`() {

val unsignedTypesJson = """
{
"unsignedInteger": 1,
"unsignedLong": 2
}
""".trimIndent()

val content: UnsignedTypesEntity =
unsignedTypesJacksonTester.parseObject(unsignedTypesJson)

assertThat(content.unsignedInteger).isEqualTo(1u)
assertThat(content.unsignedLong).isEqualTo(2uL)
}
}

data class SignedTypesEntity(
val signedInteger: Int,
val signedLong: Long,
)

data class UnsignedTypesEntity(
val unsignedInteger: UInt,
val unsignedLong: ULong,
)

0 comments on commit d351b1b

Please sign in to comment.