@@ -149,3 +149,155 @@ def test_to_dict_with_none_model():
149149 assert evaluator_dict ["rubric" ] == "test rubric"
150150 assert "model" not in evaluator_dict
151151 assert evaluator_dict ["model_id" ] == DEFAULT_BEDROCK_MODEL_ID
152+
153+
154+
155+ # Tests for _has_text_content and _extract_text_content helper methods
156+
157+
158+ def test_has_text_content_with_single_text_at_start ():
159+ """Test _has_text_content with TextContent at index 0"""
160+ from strands_evals .types .trace import AssistantMessage , TextContent
161+
162+ evaluator = SimpleEvaluator ()
163+ msg = AssistantMessage (content = [TextContent (text = "Hello" )])
164+
165+ assert evaluator ._has_text_content (msg ) is True
166+
167+
168+ def test_has_text_content_with_text_after_tool_call ():
169+ """Test _has_text_content with TextContent not at index 0"""
170+ from strands_evals .types .trace import AssistantMessage , TextContent , ToolCallContent
171+
172+ evaluator = SimpleEvaluator ()
173+ msg = AssistantMessage (
174+ content = [
175+ ToolCallContent (name = "calculator" , arguments = {"x" : 1 }, tool_call_id = "t1" ),
176+ TextContent (text = "Let me calculate that" ),
177+ ]
178+ )
179+
180+ assert evaluator ._has_text_content (msg ) is True
181+
182+
183+ def test_has_text_content_with_no_text ():
184+ """Test _has_text_content with no TextContent blocks"""
185+ from strands_evals .types .trace import AssistantMessage , ToolCallContent
186+
187+ evaluator = SimpleEvaluator ()
188+ msg = AssistantMessage (content = [ToolCallContent (name = "calculator" , arguments = {"x" : 1 }, tool_call_id = "t1" )])
189+
190+ assert evaluator ._has_text_content (msg ) is False
191+
192+
193+ def test_has_text_content_with_multiple_text_blocks ():
194+ """Test _has_text_content with multiple TextContent blocks"""
195+ from strands_evals .types .trace import AssistantMessage , TextContent
196+
197+ evaluator = SimpleEvaluator ()
198+ msg = AssistantMessage (content = [TextContent (text = "Hello" ), TextContent (text = "World" )])
199+
200+ assert evaluator ._has_text_content (msg ) is True
201+
202+
203+ def test_has_text_content_with_empty_content ():
204+ """Test _has_text_content with empty content list"""
205+ from strands_evals .types .trace import AssistantMessage
206+
207+ evaluator = SimpleEvaluator ()
208+ msg = AssistantMessage (content = [])
209+
210+ assert evaluator ._has_text_content (msg ) is False
211+
212+
213+ def test_extract_text_content_single_block ():
214+ """Test _extract_text_content with single TextContent block"""
215+ from strands_evals .types .trace import UserMessage , TextContent
216+
217+ evaluator = SimpleEvaluator ()
218+ msg = UserMessage (content = [TextContent (text = "Hello world" )])
219+
220+ result = evaluator ._extract_text_content (msg )
221+ assert result == "Hello world"
222+
223+
224+ def test_extract_text_content_multiple_blocks ():
225+ """Test _extract_text_content with multiple TextContent blocks"""
226+ from strands_evals .types .trace import AssistantMessage , TextContent
227+
228+ evaluator = SimpleEvaluator ()
229+ msg = AssistantMessage (content = [TextContent (text = "Hello" ), TextContent (text = "world" )])
230+
231+ result = evaluator ._extract_text_content (msg )
232+ assert result == "Hello world"
233+
234+
235+ def test_extract_text_content_text_not_at_start ():
236+ """Test _extract_text_content with TextContent not at index 0"""
237+ from strands_evals .types .trace import AssistantMessage , TextContent , ToolCallContent
238+
239+ evaluator = SimpleEvaluator ()
240+ msg = AssistantMessage (
241+ content = [
242+ ToolCallContent (name = "calculator" , arguments = {"x" : 1 }, tool_call_id = "t1" ),
243+ TextContent (text = "Let me calculate" ),
244+ ]
245+ )
246+
247+ result = evaluator ._extract_text_content (msg )
248+ assert result == "Let me calculate"
249+
250+
251+ def test_extract_text_content_mixed_content ():
252+ """Test _extract_text_content with mixed content types"""
253+ from strands_evals .types .trace import AssistantMessage , TextContent , ToolCallContent
254+
255+ evaluator = SimpleEvaluator ()
256+ msg = AssistantMessage (
257+ content = [
258+ TextContent (text = "First text" ),
259+ ToolCallContent (name = "calculator" , arguments = {"x" : 1 }, tool_call_id = "t1" ),
260+ TextContent (text = "Second text" ),
261+ ]
262+ )
263+
264+ result = evaluator ._extract_text_content (msg )
265+ assert result == "First text Second text"
266+
267+
268+ def test_extract_text_content_no_text ():
269+ """Test _extract_text_content with no TextContent blocks"""
270+ from strands_evals .types .trace import AssistantMessage , ToolCallContent
271+
272+ evaluator = SimpleEvaluator ()
273+ msg = AssistantMessage (content = [ToolCallContent (name = "calculator" , arguments = {"x" : 1 }, tool_call_id = "t1" )])
274+
275+ result = evaluator ._extract_text_content (msg )
276+ assert result == ""
277+
278+
279+ def test_extract_text_content_empty_content ():
280+ """Test _extract_text_content with empty content list"""
281+ from strands_evals .types .trace import UserMessage
282+
283+ evaluator = SimpleEvaluator ()
284+ msg = UserMessage (content = [])
285+
286+ result = evaluator ._extract_text_content (msg )
287+ assert result == ""
288+
289+
290+ def test_extract_text_content_user_message_with_tool_result ():
291+ """Test _extract_text_content with UserMessage containing tool results and text"""
292+ from strands_evals .types .trace import UserMessage , TextContent , ToolResultContent
293+
294+ evaluator = SimpleEvaluator ()
295+ msg = UserMessage (
296+ content = [
297+ ToolResultContent (content = "Result: 42" , tool_call_id = "t1" ),
298+ TextContent (text = "Here's the result" ),
299+ ]
300+ )
301+
302+ result = evaluator ._extract_text_content (msg )
303+ assert result == "Here's the result"
0 commit comments