Skip to content

Commit 7d2d803

Browse files
authored
test: [Orchestration] Success scenarios for PolymorphicFallbackDeserializer (#279)
* Add success test and change class access * Minor change in order --------- Co-authored-by: Roshin Rajan Panackal <[email protected]>
1 parent f3e3425 commit 7d2d803

File tree

2 files changed

+79
-17
lines changed

2 files changed

+79
-17
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: 78 additions & 16 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 {}
22+
@JsonSubTypes({
23+
@JsonSubTypes.Type(value = CandidateA.class),
24+
@JsonSubTypes.Type(value = CandidateB.class)
25+
})
26+
interface AbstractParent {}
27+
28+
static class CandidateA implements AbstractParent {
29+
@JsonProperty("content")
30+
String content;
31+
}
1932

20-
class KnownCandidate implements AbstractParent {
21-
String content;
22-
}
33+
static class CandidateB implements AbstractParent {
34+
@JsonProperty("content")
35+
List<String> content;
36+
}
2337

24-
class UnknownCandidate implements AbstractParent {
25-
List<String> content;
26-
}
38+
@BeforeEach
39+
void setUp() {
40+
candidateAJson =
41+
"""
42+
{
43+
"content": "I am candidate A"
44+
}
45+
""";
2746

28-
final String unknownCandidateJson =
47+
candidateBJson =
2948
"""
3049
{
3150
"content": [
32-
"Sentence one",
33-
"Sentence two"
51+
"I am candidate B"
3452
]
3553
}
3654
""";
55+
}
3756

57+
@SneakyThrows
58+
@Test
59+
void testValueTypesResolutionSuccess() {
60+
61+
final var fullCandidateList = List.of(CandidateA.class, CandidateB.class);
3862
final var module =
3963
new SimpleModule()
4064
.addDeserializer(
4165
AbstractParent.class,
4266
PolymorphicFallbackDeserializer.fromCandidates(
43-
AbstractParent.class, List.of(KnownCandidate.class)));
67+
AbstractParent.class, fullCandidateList));
4468

4569
final var mapper = new JsonMapper().registerModule(module);
4670

47-
assertThatThrownBy(() -> mapper.readValue(unknownCandidateJson, AbstractParent.class))
71+
final var candidateA = mapper.readValue(candidateAJson, AbstractParent.class);
72+
assertThat(candidateA).isInstanceOf(CandidateA.class);
73+
74+
final var candidateB = mapper.readValue(candidateBJson, AbstractParent.class);
75+
assertThat(candidateB).isInstanceOf(CandidateB.class);
76+
}
77+
78+
@SneakyThrows
79+
@Test
80+
void testValueTypeResolutionFailure() {
81+
82+
final List<Class<? extends AbstractParent>> incompleteCandidateList = List.of(CandidateA.class);
83+
84+
final var moduleWithoutCandidateB =
85+
new SimpleModule()
86+
.addDeserializer(
87+
AbstractParent.class,
88+
PolymorphicFallbackDeserializer.fromCandidates(
89+
AbstractParent.class, incompleteCandidateList));
90+
91+
final var mapper = new JsonMapper().registerModule(moduleWithoutCandidateB);
92+
93+
assertThatThrownBy(() -> mapper.readValue(candidateBJson, AbstractParent.class))
4894
.isInstanceOf(JsonMappingException.class)
4995
.hasMessageContaining(
5096
"PolymorphicFallbackDeserializer failed to deserialize "
5197
+ AbstractParent.class.getName()
5298
+ ". Attempted candidates: "
53-
+ List.of(KnownCandidate.class.getName()));
99+
+ List.of(CandidateA.class.getName()));
100+
}
101+
102+
@SneakyThrows
103+
@Test
104+
void testSubtypeAnnotationSuccess() {
105+
106+
final var module =
107+
new SimpleModule()
108+
.addDeserializer(
109+
AbstractParent.class,
110+
PolymorphicFallbackDeserializer.fromJsonSubTypes(AbstractParent.class));
111+
112+
ObjectMapper mapper = new ObjectMapper().registerModule(module);
113+
114+
final var candidate = mapper.readValue(candidateAJson, AbstractParent.class);
115+
assertThat(candidate).isInstanceOf(CandidateA.class);
54116
}
55117

56118
@Test

0 commit comments

Comments
 (0)