@@ -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