Skip to content

Commit 8ecd701

Browse files
authored
Merge pull request #430 from FasterXML/github-211-test
Add test case for GitHub #211
2 parents fe4464d + 8050041 commit 8ecd701

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

release-notes/CREDITS-2.x

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ Authors:
1313

1414
Contributors:
1515

16+
Jocelyn N'TAKPÉ (jntakpe@github)
17+
* #211: Contributed test case for @JsonMerge
18+
(2.12.NEXT)
19+
1620
Christopher Mason (masoncj@github)
1721
* #194: Contributed test case for @JsonIdentityInfo usage
1822
(2.12.NEXT)
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.fasterxml.jackson.module.kotlin.test.github
2+
3+
import com.fasterxml.jackson.annotation.JsonMerge
4+
import com.fasterxml.jackson.databind.JsonNode
5+
import com.fasterxml.jackson.databind.ObjectMapper
6+
import com.fasterxml.jackson.databind.node.JsonNodeFactory
7+
import com.fasterxml.jackson.databind.node.ObjectNode
8+
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
9+
import org.junit.Test
10+
import kotlin.test.assertEquals
11+
12+
class TestGithub211 {
13+
@Test
14+
fun simple() {
15+
val original = Person("original", Address("Rivoli", "Paris"))
16+
val changes = JsonNodeFactory.instance.objectNode().put("username", "updated")
17+
18+
val merged = JsonMerger(jacksonObjectMapper()).merge(original, changes)
19+
20+
assertEquals(original.copy(username = "updated"), merged)
21+
}
22+
23+
@Test
24+
fun nested() {
25+
val original = Person("original", Address("Rivoli", "Paris"))
26+
27+
val merged = JsonMerger(jacksonObjectMapper()).merge(original, nestedChanges())
28+
29+
assertEquals(Person("updated", Address("Magenta", "Paris")), merged)
30+
}
31+
32+
private fun nestedChanges(): ObjectNode {
33+
return JsonNodeFactory.instance.objectNode().put("username", "updated").apply {
34+
putObject("address").put("street", "Magenta")
35+
}
36+
}
37+
38+
class JsonMerger(private val objectMapper: ObjectMapper) {
39+
fun <T> merge(toUpdate: T, changes: JsonNode): T {
40+
return objectMapper.readerForUpdating(toUpdate).readValue(changes)
41+
}
42+
}
43+
44+
data class Address(val street: String, val city: String)
45+
46+
data class Person(val username: String, @JsonMerge val address: Address)
47+
}

0 commit comments

Comments
 (0)