""" High-quality tests for api_utils/utils.py - Latest user text extraction (zero mocking). Focus: Test _get_latest_user_text with pure function testing (no mocks). Strategy: Comprehensive edge case coverage for message content extraction. """ from typing import List, cast from models import Message, MessageContentItem def test_get_latest_user_text_empty_messages(): """ Test scenario: Empty message list Expected: Return empty string """ from api_utils.utils import _get_latest_user_text result = _get_latest_user_text([]) assert result == "" def test_get_latest_user_text_no_user_messages(): """ Test scenario: No user messages in message list Expected: Return empty string """ from api_utils.utils import _get_latest_user_text messages = [ Message(role="system", content="System prompt"), Message(role="assistant", content="AI response"), ] result = _get_latest_user_text(messages) assert result == "" def test_get_latest_user_text_single_user_message_string(): """ Test scenario: Single user message, content as string Expected: Return that string """ from api_utils.utils import _get_latest_user_text messages = [Message(role="user", content="Hello, world!")] result = _get_latest_user_text(messages) assert result == "Hello, world!" def test_get_latest_user_text_multiple_user_messages_returns_latest(): """ Test scenario: Multiple user messages Expected: Return content of the last user message """ from api_utils.utils import _get_latest_user_text messages = [ Message(role="user", content="First message"), Message(role="assistant", content="Response"), Message(role="user", content="Second message"), Message(role="assistant", content="Another response"), Message(role="user", content="Latest message"), ] result = _get_latest_user_text(messages) assert result == "Latest message" def test_get_latest_user_text_mixed_roles_returns_latest_user(): """ Test scenario: Mixed role messages (system, user, assistant) Expected: Return the last user message """ from api_utils.utils import _get_latest_user_text messages = [ Message(role="system", content="System"), Message(role="user", content="User 1"), Message(role="assistant", content="AI 1"), Message(role="system", content="More system"), Message(role="user", content="User 2"), Message(role="assistant", content="AI 2"), ] result = _get_latest_user_text(messages) assert result == "User 2" def test_get_latest_user_text_list_content_with_text_items(): """ Test scenario: User message content as list (containing text items) Expected: Concatenate all text items, joined by newline """ from api_utils.utils import _get_latest_user_text messages = [ Message( role="user", content=cast( List[MessageContentItem], [ {"type": "text", "text": "First part"}, {"type": "text", "text": "Second part"}, {"type": "text", "text": "Third part"}, ], ), ) ] result = _get_latest_user_text(messages) assert result == "First part\nSecond part\nThird part" def test_get_latest_user_text_list_content_with_mixed_types(): """ Test scenario: List content contains text and other types (e.g. image_url) Expected: Only extract text type content """ from api_utils.utils import _get_latest_user_text messages = [ Message( role="user", content=cast( List[MessageContentItem], [ {"type": "text", "text": "Text before image"}, { "type": "image_url", "image_url": {"url": "http://example.com/img.jpg"}, }, {"type": "text", "text": "Text after image"}, ], ), ) ] result = _get_latest_user_text(messages) assert result == "Text before image\nText after image" def test_get_latest_user_text_list_content_empty_text(): """ Test scenario: List content has empty text items Expected: Skip empty text items """ from api_utils.utils import _get_latest_user_text messages = [ Message( role="user", content=cast( List[MessageContentItem], [ {"type": "text", "text": ""}, {"type": "text", "text": "Non-empty"}, {"type": "text", "text": ""}, ], ), ) ] result = _get_latest_user_text(messages) assert result == "Non-empty" def test_get_latest_user_text_list_content_no_text_items(): """ Test scenario: List content has no text type items Expected: Return empty string """ from api_utils.utils import _get_latest_user_text messages = [ Message( role="user", content=cast( List[MessageContentItem], [ { "type": "image_url", "image_url": {"url": "http://example.com/img.jpg"}, }, ], ), ) ] result = _get_latest_user_text(messages) assert result == "" def test_get_latest_user_text_list_content_empty_list(): """ Test scenario: Content is an empty list Expected: Return empty string """ from api_utils.utils import _get_latest_user_text messages = [Message(role="user", content=[])] result = _get_latest_user_text(messages) assert result == "" def test_get_latest_user_text_content_is_none(): """ Test scenario: Content is None (though unusual) Expected: Return empty string """ from api_utils.utils import _get_latest_user_text # Directly construct a case where content is None (bypass Pydantic validation) class MockMessage: def __init__(self): self.role = "user" self.content = None messages = [MockMessage()] result = _get_latest_user_text(cast(List[Message], messages)) # Function will enter else branch and return "" assert result == "" def test_get_latest_user_text_unicode_content(): """ Test scenario: Content contains Unicode characters Expected: Correctly handle Unicode characters """ from api_utils.utils import _get_latest_user_text messages = [ Message(role="user", content="hello world"), Message(role="assistant", content="Response"), Message(role="user", content="latest message"), ] result = _get_latest_user_text(messages) assert result == "latest message" def test_get_latest_user_text_multiline_string(): """ Test scenario: Content is multiline string Expected: Return full multiline string """ from api_utils.utils import _get_latest_user_text multiline = """Line 1 Line 2 Line 3""" messages = [Message(role="user", content=multiline)] result = _get_latest_user_text(messages) assert result == multiline def test_get_latest_user_text_reversed_iteration(): """ Test scenario: Verify function iterates messages backwards Expected: Should return the last user message even if there are other user messages before it """ from api_utils.utils import _get_latest_user_text messages = [ Message(role="user", content="Old message 1"), Message(role="user", content="Old message 2"), Message(role="assistant", content="Response"), Message(role="user", content="Latest message"), ] result = _get_latest_user_text(messages) assert result == "Latest message" def test_get_latest_user_text_special_characters(): """ Test scenario: Content contains special characters Expected: Correctly preserve special characters """ from api_utils.utils import _get_latest_user_text messages = [ Message( role="user", content="Text with \"quotes\" and 'apostrophes' and \\backslashes\\", ) ] result = _get_latest_user_text(messages) assert result == "Text with \"quotes\" and 'apostrophes' and \\backslashes\\" def test_get_latest_user_text_very_long_content(): """ Test scenario: Very long content (performance test) Expected: Able to handle large text """ from api_utils.utils import _get_latest_user_text # Create a 10,000 character long text long_text = "A" * 10000 messages = [Message(role="user", content=long_text)] result = _get_latest_user_text(messages) assert result == long_text assert len(result) == 10000