Skip to content

Commit 661e916

Browse files
committed
test: Add comprehensive unit tests for SystemMessage, UserMessage, and MessageUtils
Signed-off-by: Alex Klimenko <[email protected]>
1 parent e0ccc13 commit 661e916

File tree

3 files changed

+259
-0
lines changed

3 files changed

+259
-0
lines changed

spring-ai-model/src/test/java/org/springframework/ai/chat/messages/MessageUtilsTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,11 @@ void readResourceWithCharsetWhenNull() {
5757
.hasMessageContaining("charset cannot be null");
5858
}
5959

60+
@Test
61+
void readResourceWithCharsetWhenResourceNull() {
62+
assertThatThrownBy(() -> MessageUtils.readResource(null, StandardCharsets.UTF_8))
63+
.isInstanceOf(IllegalArgumentException.class)
64+
.hasMessageContaining("resource cannot be null");
65+
}
66+
6067
}

spring-ai-model/src/test/java/org/springframework/ai/chat/messages/SystemMessageTests.java

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,4 +110,116 @@ void systemMessageMutate() {
110110
assertThat(systemMessage3.getMetadata()).hasSize(2).isNotSameAs(systemMessage2.getMetadata());
111111
}
112112

113+
@Test
114+
void systemMessageWithEmptyText() {
115+
SystemMessage message = new SystemMessage("");
116+
assertEquals("", message.getText());
117+
assertEquals(MessageType.SYSTEM, message.getMetadata().get(MESSAGE_TYPE));
118+
}
119+
120+
@Test
121+
void systemMessageWithWhitespaceText() {
122+
String text = " \t\n ";
123+
SystemMessage message = new SystemMessage(text);
124+
assertEquals(text, message.getText());
125+
assertEquals(MessageType.SYSTEM, message.getMetadata().get(MESSAGE_TYPE));
126+
}
127+
128+
@Test
129+
void systemMessageBuilderWithNullText() {
130+
assertThrows(IllegalArgumentException.class, () -> SystemMessage.builder().text((String) null).build());
131+
}
132+
133+
@Test
134+
void systemMessageBuilderWithNullResource() {
135+
assertThrows(IllegalArgumentException.class, () -> SystemMessage.builder().text((Resource) null).build());
136+
}
137+
138+
@Test
139+
void systemMessageBuilderWithEmptyMetadata() {
140+
String text = "Test message";
141+
SystemMessage message = SystemMessage.builder().text(text).metadata(Map.of()).build();
142+
assertEquals(text, message.getText());
143+
assertThat(message.getMetadata()).hasSize(1).containsEntry(MESSAGE_TYPE, MessageType.SYSTEM);
144+
}
145+
146+
@Test
147+
void systemMessageBuilderOverwriteMetadata() {
148+
String text = "Test message";
149+
SystemMessage message = SystemMessage.builder()
150+
.text(text)
151+
.metadata(Map.of("key1", "value1"))
152+
.metadata(Map.of("key2", "value2"))
153+
.build();
154+
155+
assertThat(message.getMetadata()).hasSize(2)
156+
.containsEntry(MESSAGE_TYPE, MessageType.SYSTEM)
157+
.containsEntry("key2", "value2")
158+
.doesNotContainKey("key1");
159+
}
160+
161+
@Test
162+
void systemMessageCopyPreservesImmutability() {
163+
String text = "Original text";
164+
Map<String, Object> originalMetadata = Map.of("key", "value");
165+
SystemMessage original = SystemMessage.builder().text(text).metadata(originalMetadata).build();
166+
167+
SystemMessage copy = original.copy();
168+
169+
// Verify they are different instances
170+
assertThat(copy).isNotSameAs(original);
171+
assertThat(copy.getMetadata()).isNotSameAs(original.getMetadata());
172+
173+
// Verify content is equal
174+
assertThat(copy.getText()).isEqualTo(original.getText());
175+
assertThat(copy.getMetadata()).isEqualTo(original.getMetadata());
176+
}
177+
178+
@Test
179+
void systemMessageMutateWithNewMetadata() {
180+
String originalText = "Original text";
181+
SystemMessage original = SystemMessage.builder().text(originalText).metadata(Map.of("key1", "value1")).build();
182+
183+
SystemMessage mutated = original.mutate().metadata(Map.of("key2", "value2")).build();
184+
185+
assertThat(mutated.getText()).isEqualTo(originalText);
186+
assertThat(mutated.getMetadata()).hasSize(2)
187+
.containsEntry(MESSAGE_TYPE, MessageType.SYSTEM)
188+
.containsEntry("key2", "value2")
189+
.doesNotContainKey("key1");
190+
}
191+
192+
@Test
193+
void systemMessageMutateChaining() {
194+
SystemMessage original = SystemMessage.builder().text("Original").metadata(Map.of("key1", "value1")).build();
195+
196+
SystemMessage result = original.mutate().text("Updated").metadata(Map.of("key2", "value2")).build();
197+
198+
assertThat(result.getText()).isEqualTo("Updated");
199+
assertThat(result.getMetadata()).hasSize(2)
200+
.containsEntry(MESSAGE_TYPE, MessageType.SYSTEM)
201+
.containsEntry("key2", "value2");
202+
}
203+
204+
@Test
205+
void systemMessageEqualsAndHashCode() {
206+
String text = "Test message";
207+
Map<String, Object> metadata = Map.of("key", "value");
208+
209+
SystemMessage message1 = SystemMessage.builder().text(text).metadata(metadata).build();
210+
211+
SystemMessage message2 = SystemMessage.builder().text(text).metadata(metadata).build();
212+
213+
assertThat(message1).isEqualTo(message2);
214+
assertThat(message1.hashCode()).isEqualTo(message2.hashCode());
215+
}
216+
217+
@Test
218+
void systemMessageNotEqualsWithDifferentText() {
219+
SystemMessage message1 = new SystemMessage("Text 1");
220+
SystemMessage message2 = new SystemMessage("Text 2");
221+
222+
assertThat(message1).isNotEqualTo(message2);
223+
}
224+
113225
}

spring-ai-model/src/test/java/org/springframework/ai/chat/messages/UserMessageTests.java

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,144 @@ void userMessageMutate() {
123123
assertThat(userMessage3.getMetadata()).hasSize(2).isNotSameAs(metadata1);
124124
}
125125

126+
@Test
127+
void userMessageWithEmptyText() {
128+
UserMessage message = new UserMessage("");
129+
assertThat(message.getText()).isEmpty();
130+
assertThat(message.getMedia()).isEmpty();
131+
assertThat(message.getMetadata()).hasSize(1).containsEntry(MESSAGE_TYPE, MessageType.USER);
132+
}
133+
134+
@Test
135+
void userMessageWithWhitespaceText() {
136+
String text = " \t\n ";
137+
UserMessage message = new UserMessage(text);
138+
assertThat(message.getText()).isEqualTo(text);
139+
assertThat(message.getMedia()).isEmpty();
140+
assertThat(message.getMetadata()).hasSize(1).containsEntry(MESSAGE_TYPE, MessageType.USER);
141+
}
142+
143+
@Test
144+
void userMessageBuilderWithNullText() {
145+
assertThatThrownBy(() -> UserMessage.builder().text((String) null).build())
146+
.isInstanceOf(IllegalArgumentException.class)
147+
.hasMessageContaining("Content must not be null for SYSTEM or USER messages");
148+
}
149+
150+
@Test
151+
void userMessageBuilderWithEmptyMediaList() {
152+
String text = "No media attached";
153+
UserMessage message = UserMessage.builder().text(text).build();
154+
155+
assertThat(message.getText()).isEqualTo(text);
156+
assertThat(message.getMedia()).isEmpty();
157+
assertThat(message.getMetadata()).hasSize(1).containsEntry(MESSAGE_TYPE, MessageType.USER);
158+
}
159+
160+
@Test
161+
void userMessageBuilderWithEmptyMetadata() {
162+
String text = "Test message";
163+
UserMessage message = UserMessage.builder().text(text).metadata(Map.of()).build();
164+
165+
assertThat(message.getText()).isEqualTo(text);
166+
assertThat(message.getMetadata()).hasSize(1).containsEntry(MESSAGE_TYPE, MessageType.USER);
167+
}
168+
169+
@Test
170+
void userMessageBuilderOverwriteMetadata() {
171+
String text = "Test message";
172+
UserMessage message = UserMessage.builder()
173+
.text(text)
174+
.metadata(Map.of("key1", "value1"))
175+
.metadata(Map.of("key2", "value2"))
176+
.build();
177+
178+
assertThat(message.getMetadata()).hasSize(2)
179+
.containsEntry(MESSAGE_TYPE, MessageType.USER)
180+
.containsEntry("key2", "value2")
181+
.doesNotContainKey("key1");
182+
}
183+
184+
@Test
185+
void userMessageCopyWithNoMedia() {
186+
String text = "Simple message";
187+
Map<String, Object> metadata = Map.of("key", "value");
188+
UserMessage original = UserMessage.builder().text(text).metadata(metadata).build();
189+
190+
UserMessage copy = original.copy();
191+
192+
assertThat(copy).isNotSameAs(original);
193+
assertThat(copy.getText()).isEqualTo(text);
194+
assertThat(copy.getMedia()).isEmpty();
195+
assertThat(copy.getMetadata()).isNotSameAs(original.getMetadata()).isEqualTo(original.getMetadata());
196+
}
197+
198+
@Test
199+
void userMessageMutateAddMedia() {
200+
String text = "Original message";
201+
UserMessage original = UserMessage.builder().text(text).build();
202+
203+
Media newMedia = new Media(MimeTypeUtils.TEXT_PLAIN, new ClassPathResource("prompt-user.txt"));
204+
UserMessage mutated = original.mutate().media(newMedia).build();
205+
206+
assertThat(original.getMedia()).isEmpty();
207+
assertThat(mutated.getMedia()).hasSize(1).contains(newMedia);
208+
assertThat(mutated.getText()).isEqualTo(text);
209+
}
210+
211+
@Test
212+
void userMessageMutateChaining() {
213+
UserMessage original = UserMessage.builder().text("Original").build();
214+
215+
Media media = new Media(MimeTypeUtils.TEXT_PLAIN, new ClassPathResource("prompt-user.txt"));
216+
UserMessage result = original.mutate().text("Updated").media(media).metadata(Map.of("key", "value")).build();
217+
218+
assertThat(result.getText()).isEqualTo("Updated");
219+
assertThat(result.getMedia()).hasSize(1).contains(media);
220+
assertThat(result.getMetadata()).hasSize(2)
221+
.containsEntry(MESSAGE_TYPE, MessageType.USER)
222+
.containsEntry("key", "value");
223+
}
224+
225+
@Test
226+
void userMessageEqualsAndHashCode() {
227+
String text = "Test message";
228+
Media media = new Media(MimeTypeUtils.TEXT_PLAIN, new ClassPathResource("prompt-user.txt"));
229+
Map<String, Object> metadata = Map.of("key", "value");
230+
231+
UserMessage message1 = UserMessage.builder().text(text).media(media).metadata(metadata).build();
232+
233+
UserMessage message2 = UserMessage.builder().text(text).media(media).metadata(metadata).build();
234+
235+
assertThat(message1).isEqualTo(message2);
236+
assertThat(message1.hashCode()).isEqualTo(message2.hashCode());
237+
}
238+
239+
@Test
240+
void userMessageNotEqualsWithDifferentText() {
241+
UserMessage message1 = new UserMessage("Text 1");
242+
UserMessage message2 = new UserMessage("Text 2");
243+
244+
assertThat(message1).isNotEqualTo(message2);
245+
}
246+
247+
@Test
248+
void userMessageToString() {
249+
String text = "Test message";
250+
UserMessage message = new UserMessage(text);
251+
252+
String toString = message.toString();
253+
assertThat(toString).contains("UserMessage").contains(text).contains("USER");
254+
}
255+
256+
@Test
257+
void userMessageToStringWithMedia() {
258+
String text = "Test with media";
259+
Media media = new Media(MimeTypeUtils.TEXT_PLAIN, new ClassPathResource("prompt-user.txt"));
260+
UserMessage message = UserMessage.builder().text(text).media(media).build();
261+
262+
String toString = message.toString();
263+
assertThat(toString).contains("UserMessage").contains(text).contains("media");
264+
}
265+
126266
}

0 commit comments

Comments
 (0)