-
Notifications
You must be signed in to change notification settings - Fork 4
/
PresentPropertyCaseFormatDeserializerTest.java
136 lines (101 loc) · 4.02 KB
/
PresentPropertyCaseFormatDeserializerTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package com.infobip.jackson;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import com.google.common.base.CaseFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.List;
import static org.assertj.core.api.BDDAssertions.then;
@AllArgsConstructor
class PresentPropertyCaseFormatDeserializerTest extends TestBase {
@Test
void shouldDeserializeRoadBikeAsBikeFromJson() throws JsonProcessingException {
// given
String json = "{'road_bike':'road bike'}";
// when
Bike actual = objectMapper.readValue(json, Bike.class);
// then
then(actual).isEqualTo(new RoadBike("road bike"));
}
@Test
void shouldDeserializeRoadBikeAsBikeFromSerializedRoadBike() throws JsonProcessingException {
// given
String json = objectMapper.writeValueAsString(new RoadBike("road bike"));
// when
Bike actual = objectMapper.readValue(json, Bike.class);
// then
then(actual).isEqualTo(new RoadBike("road bike"));
}
@Test
void shouldDeserializeMountainBikeAsBikeFromJson() throws JsonProcessingException {
// given
String json = "{'mountain_bike':'mountain bike'}";
// when
Bike actual = objectMapper.readValue(json, Bike.class);
// then
then(actual).isEqualTo(new MountainBike("mountain bike"));
}
@Test
void shouldDeserializeMountainBikeAsBikeFromSerializedMountainBike() throws JsonProcessingException {
// given
String json = objectMapper.writeValueAsString(new MountainBike("mountain bike"));
// when
Bike actual = objectMapper.readValue(json, Bike.class);
// then
then(actual).isEqualTo(new MountainBike("mountain bike"));
}
@Test
void shouldDeserializeListOfBikes() throws JsonProcessingException {
// given
String json = objectMapper.writeValueAsString(
Arrays.asList(new RoadBike("road bike"), new MountainBike("mountain bike")));
// when
List<Bike> actual = objectMapper.readValue(json, new TypeReference<List<Bike>>() {
});
// then
then(actual).isEqualTo(Arrays.asList(new RoadBike("road bike"), new MountainBike("mountain bike")));
}
@Test
void shouldDeserializeBikeWithMultipleMatchingProperties() throws JsonProcessingException {
// given
String json = "{'mountain_bike':'', 'road_bike': 'road bike'}";
// when
Bike actual = objectMapper.readValue(json, Bike.class);
// then
then(actual).isEqualTo(new RoadBike("road bike"));
}
@Test
void shouldDeserializeRoadBikeAsRoadBikeFromJson() throws JsonProcessingException {
// given
String json = "{'road_bike':'road bike'}";
// when
RoadBike actual = objectMapper.readValue(json, RoadBike.class);
// then
then(actual).isEqualTo(new RoadBike("road bike"));
}
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
@JsonTypeResolveWith(LowerUnderscorePresentPropertyJsonTypeResolver.class)
interface Bike extends PresentPropertyJsonHierarchy<BikeType> {
}
static class LowerUnderscorePresentPropertyJsonTypeResolver<E extends Enum<E> & TypeProvider<E>>
extends PresentPropertyJsonTypeResolver<E> {
public LowerUnderscorePresentPropertyJsonTypeResolver(Class<E> type) {
super(type, CaseFormat.LOWER_UNDERSCORE);
}
}
record RoadBike(String roadBike) implements Bike {
}
record MountainBike(String mountainBike) implements Bike {
}
@Getter
@AllArgsConstructor
enum BikeType implements TypeProvider<Bike> {
ROAD_BIKE(RoadBike.class),
MOUNTAIN_BIKE(MountainBike.class);
private final Class<? extends Bike> type;
}
}