Skip to content

Commit 21406ea

Browse files
authored
test: Add comprehensive tests for ListOutputConverter and StreamHelper (spring-projects#4039)
Signed-off-by: Alex Klimenko <[email protected]>
1 parent 891ef2a commit 21406ea

File tree

2 files changed

+140
-1
lines changed

2 files changed

+140
-1
lines changed

models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/StreamHelperTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,23 @@ void testErrorEventTypeWithEmptyContentBlock() {
2424
assertThat(response).isNotNull();
2525
}
2626

27+
@Test
28+
void testMultipleErrorEventsHandling() {
29+
StreamHelper streamHelper = new StreamHelper();
30+
AtomicReference<ChatCompletionResponseBuilder> contentBlockReference = new AtomicReference<>();
31+
32+
AnthropicApi.ErrorEvent firstError = new AnthropicApi.ErrorEvent(AnthropicApi.EventType.ERROR,
33+
new AnthropicApi.ErrorEvent.Error("validation_error", "Invalid input"));
34+
AnthropicApi.ErrorEvent secondError = new AnthropicApi.ErrorEvent(AnthropicApi.EventType.ERROR,
35+
new AnthropicApi.ErrorEvent.Error("server_error", "Internal server error"));
36+
37+
AnthropicApi.ChatCompletionResponse response1 = streamHelper.eventToChatCompletionResponse(firstError,
38+
contentBlockReference);
39+
AnthropicApi.ChatCompletionResponse response2 = streamHelper.eventToChatCompletionResponse(secondError,
40+
contentBlockReference);
41+
42+
assertThat(response1).isNotNull();
43+
assertThat(response2).isNotNull();
44+
}
45+
2746
}

spring-ai-model/src/test/java/org/springframework/ai/converter/ListOutputConverterTest.java

Lines changed: 121 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,139 @@
1919
import java.util.List;
2020

2121
import org.junit.jupiter.api.Test;
22+
import org.junit.jupiter.api.BeforeEach;
23+
import org.junit.jupiter.params.ParameterizedTest;
24+
import org.junit.jupiter.params.provider.ValueSource;
2225

2326
import org.springframework.core.convert.support.DefaultConversionService;
2427

2528
import static org.assertj.core.api.Assertions.assertThat;
2629

2730
class ListOutputConverterTest {
2831

32+
private ListOutputConverter listOutputConverter;
33+
34+
@BeforeEach
35+
void setUp() {
36+
listOutputConverter = new ListOutputConverter(new DefaultConversionService());
37+
}
38+
2939
@Test
3040
void csv() {
3141
String csvAsString = "foo, bar, baz";
32-
ListOutputConverter listOutputConverter = new ListOutputConverter(new DefaultConversionService());
3342
List<String> list = listOutputConverter.convert(csvAsString);
3443
assertThat(list).containsExactlyElementsOf(List.of("foo", "bar", "baz"));
3544
}
3645

46+
@Test
47+
void csvWithoutSpaces() {
48+
String csvAsString = "A,B,C";
49+
List<String> list = listOutputConverter.convert(csvAsString);
50+
assertThat(list).containsExactlyElementsOf(List.of("A", "B", "C"));
51+
}
52+
53+
@Test
54+
void csvWithExtraSpaces() {
55+
String csvAsString = "A , B , C ";
56+
List<String> list = listOutputConverter.convert(csvAsString);
57+
assertThat(list).containsExactlyElementsOf(List.of("A", "B", "C"));
58+
}
59+
60+
@Test
61+
void csvWithSingleItem() {
62+
String csvAsString = "single-item";
63+
List<String> list = listOutputConverter.convert(csvAsString);
64+
assertThat(list).containsExactlyElementsOf(List.of("single-item"));
65+
}
66+
67+
@Test
68+
void csvWithEmptyString() {
69+
String csvAsString = "";
70+
List<String> list = listOutputConverter.convert(csvAsString);
71+
assertThat(list).isEmpty();
72+
}
73+
74+
@Test
75+
void csvWithEmptyValues() {
76+
String csvAsString = "A, , C";
77+
List<String> list = listOutputConverter.convert(csvAsString);
78+
assertThat(list).containsExactlyElementsOf(List.of("A", "", "C"));
79+
}
80+
81+
@Test
82+
void csvWithOnlyCommas() {
83+
String csvAsString = ",,";
84+
List<String> list = listOutputConverter.convert(csvAsString);
85+
assertThat(list).containsExactlyElementsOf(List.of("", "", ""));
86+
}
87+
88+
@Test
89+
void csvWithTrailingComma() {
90+
String csvAsString = "A, B,";
91+
List<String> list = listOutputConverter.convert(csvAsString);
92+
assertThat(list).containsExactlyElementsOf(List.of("A", "B", ""));
93+
}
94+
95+
@Test
96+
void csvWithLeadingComma() {
97+
String csvAsString = ", A, B";
98+
List<String> list = listOutputConverter.convert(csvAsString);
99+
assertThat(list).containsExactlyElementsOf(List.of("", "A", "B"));
100+
}
101+
102+
@Test
103+
void csvWithSpecialCharacters() {
104+
String csvAsString = "[email protected], item#123, $data%";
105+
List<String> list = listOutputConverter.convert(csvAsString);
106+
assertThat(list).containsExactlyElementsOf(List.of("[email protected]", "item#123", "$data%"));
107+
}
108+
109+
@ParameterizedTest
110+
@ValueSource(strings = { "a,b,c", "1,2,3", "X,Y,Z", "alpha,beta,gamma" })
111+
void csvWithVariousInputs(String csvString) {
112+
List<String> result = listOutputConverter.convert(csvString);
113+
assertThat(result).hasSize(3);
114+
assertThat(result).doesNotContainNull();
115+
}
116+
117+
@Test
118+
void csvWithTabsAndSpecialWhitespace() {
119+
String csvAsString = "A\t, \tB\r, \nC ";
120+
List<String> list = listOutputConverter.convert(csvAsString);
121+
// Behavior depends on implementation - this tests current behavior
122+
assertThat(list).hasSize(3);
123+
assertThat(list).doesNotContainNull();
124+
}
125+
126+
@Test
127+
void csvWithOnlySpacesAndCommas() {
128+
String csvAsString = " , , ";
129+
List<String> list = listOutputConverter.convert(csvAsString);
130+
assertThat(list).containsExactlyElementsOf(List.of("", "", ""));
131+
}
132+
133+
@Test
134+
void csvWithBooleanLikeValues() {
135+
String csvAsString = "true, false, TRUE, FALSE, yes, no";
136+
List<String> list = listOutputConverter.convert(csvAsString);
137+
assertThat(list).containsExactlyElementsOf(List.of("true", "false", "TRUE", "FALSE", "yes", "no"));
138+
}
139+
140+
@Test
141+
void csvWithDifferentDataTypes() {
142+
String csvAsString = "string, 123, 45.67, true, null";
143+
List<String> list = listOutputConverter.convert(csvAsString);
144+
assertThat(list).containsExactlyElementsOf(List.of("string", "123", "45.67", "true", "null"));
145+
// All values should be strings since it's a ListOutputConverter for strings
146+
}
147+
148+
@Test
149+
void csvWithAlternativeDelimiters() {
150+
// Test behavior with semicolon (common in some locales)
151+
String csvAsString = "A; B; C";
152+
List<String> list = listOutputConverter.convert(csvAsString);
153+
// This tests current behavior - might be one item if semicolon isn't supported
154+
assertThat(list).isNotEmpty();
155+
}
156+
37157
}

0 commit comments

Comments
 (0)