Skip to content

Commit d508c4c

Browse files
committed
Add success test and change class access
1 parent f3e3425 commit d508c4c

File tree

2 files changed

+81
-19
lines changed

2 files changed

+81
-19
lines changed

orchestration/src/main/java/com/sap/ai/sdk/orchestration/PolymorphicFallbackDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
*/
2727
@Beta
2828
@AllArgsConstructor(access = AccessLevel.PROTECTED)
29-
public class PolymorphicFallbackDeserializer<T> extends JsonDeserializer<T> {
29+
class PolymorphicFallbackDeserializer<T> extends JsonDeserializer<T> {
3030

3131
@Nonnull private final Class<T> baseClass;
3232
@Nonnull private final List<Class<? extends T>> candidates;

orchestration/src/test/java/com/sap/ai/sdk/orchestration/PolymorphicFallbackDeserializerTest.java

Lines changed: 80 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,118 @@
11
package com.sap.ai.sdk.orchestration;
22

3+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
34
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
45

6+
import com.fasterxml.jackson.annotation.JsonProperty;
7+
import com.fasterxml.jackson.annotation.JsonSubTypes;
58
import com.fasterxml.jackson.databind.JsonMappingException;
9+
import com.fasterxml.jackson.databind.ObjectMapper;
610
import com.fasterxml.jackson.databind.json.JsonMapper;
711
import com.fasterxml.jackson.databind.module.SimpleModule;
812
import java.util.List;
913
import lombok.SneakyThrows;
14+
import org.junit.jupiter.api.BeforeEach;
1015
import org.junit.jupiter.api.Test;
1116

1217
class PolymorphicFallbackDeserializerTest {
1318

14-
@SneakyThrows
15-
@Test
16-
void testValueTypeResolutionFailure() {
19+
private static String candidateAJson;
20+
private static String candidateBJson;
1721

18-
interface AbstractParent {}
19-
20-
class KnownCandidate implements AbstractParent {
21-
String content;
22-
}
23-
24-
class UnknownCandidate implements AbstractParent {
25-
List<String> content;
26-
}
22+
@BeforeEach
23+
void setUp() {
24+
candidateAJson =
25+
"""
26+
{
27+
"content": "I am candidate A"
28+
}
29+
""";
2730

28-
final String unknownCandidateJson =
31+
candidateBJson =
2932
"""
3033
{
3134
"content": [
32-
"Sentence one",
33-
"Sentence two"
35+
"I am candidate B"
3436
]
3537
}
3638
""";
39+
}
40+
41+
@SneakyThrows
42+
@Test
43+
void testValueTypesResolutionSuccess() {
3744

45+
final var fullCandidateList = List.of(CandidateA.class, CandidateB.class);
3846
final var module =
3947
new SimpleModule()
4048
.addDeserializer(
4149
AbstractParent.class,
4250
PolymorphicFallbackDeserializer.fromCandidates(
43-
AbstractParent.class, List.of(KnownCandidate.class)));
51+
AbstractParent.class, fullCandidateList));
4452

4553
final var mapper = new JsonMapper().registerModule(module);
4654

47-
assertThatThrownBy(() -> mapper.readValue(unknownCandidateJson, AbstractParent.class))
55+
final var candidateA = mapper.readValue(candidateAJson, AbstractParent.class);
56+
assertThat(candidateA).isInstanceOf(CandidateA.class);
57+
58+
final var candidateB = mapper.readValue(candidateBJson, AbstractParent.class);
59+
assertThat(candidateB).isInstanceOf(CandidateB.class);
60+
}
61+
62+
@SneakyThrows
63+
@Test
64+
void testValueTypeResolutionFailure() {
65+
66+
final List<Class<? extends AbstractParent>> incompleteCandidateList = List.of(CandidateA.class);
67+
68+
final var moduleWithoutCandidateB =
69+
new SimpleModule()
70+
.addDeserializer(
71+
AbstractParent.class,
72+
PolymorphicFallbackDeserializer.fromCandidates(
73+
AbstractParent.class, incompleteCandidateList));
74+
75+
final var mapper = new JsonMapper().registerModule(moduleWithoutCandidateB);
76+
77+
assertThatThrownBy(() -> mapper.readValue(candidateBJson, AbstractParent.class))
4878
.isInstanceOf(JsonMappingException.class)
4979
.hasMessageContaining(
5080
"PolymorphicFallbackDeserializer failed to deserialize "
5181
+ AbstractParent.class.getName()
5282
+ ". Attempted candidates: "
53-
+ List.of(KnownCandidate.class.getName()));
83+
+ List.of(CandidateA.class.getName()));
84+
}
85+
86+
@SneakyThrows
87+
@Test
88+
void testSubtypeAnnotationSuccess() {
89+
90+
final var module =
91+
new SimpleModule()
92+
.addDeserializer(
93+
AbstractParent.class,
94+
PolymorphicFallbackDeserializer.fromJsonSubTypes(AbstractParent.class));
95+
96+
ObjectMapper mapper = new ObjectMapper().registerModule(module);
97+
98+
final var candidate = mapper.readValue(candidateAJson, AbstractParent.class);
99+
assertThat(candidate).isInstanceOf(CandidateA.class);
100+
}
101+
102+
@JsonSubTypes({
103+
@JsonSubTypes.Type(value = CandidateA.class),
104+
@JsonSubTypes.Type(value = CandidateB.class)
105+
})
106+
interface AbstractParent {}
107+
108+
static class CandidateA implements AbstractParent {
109+
@JsonProperty("content")
110+
String content;
111+
}
112+
113+
static class CandidateB implements AbstractParent {
114+
@JsonProperty("content")
115+
List<String> content;
54116
}
55117

56118
@Test

0 commit comments

Comments
 (0)