test_cli_user_message_preview.py
1 import importlib 2 import os 3 import sys 4 from unittest.mock import MagicMock, patch 5 6 sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) 7 8 9 _cli_mod = None 10 11 12 def _make_cli(user_message_preview=None): 13 global _cli_mod 14 clean_config = { 15 "model": { 16 "default": "anthropic/claude-opus-4.6", 17 "base_url": "https://openrouter.ai/api/v1", 18 "provider": "auto", 19 }, 20 "display": { 21 "compact": False, 22 "tool_progress": "all", 23 "user_message_preview": user_message_preview or {"first_lines": 2, "last_lines": 2}, 24 }, 25 "agent": {}, 26 "terminal": {"env_type": "local"}, 27 } 28 clean_env = {"LLM_MODEL": "", "HERMES_MAX_ITERATIONS": ""} 29 prompt_toolkit_stubs = { 30 "prompt_toolkit": MagicMock(), 31 "prompt_toolkit.history": MagicMock(), 32 "prompt_toolkit.styles": MagicMock(), 33 "prompt_toolkit.patch_stdout": MagicMock(), 34 "prompt_toolkit.application": MagicMock(), 35 "prompt_toolkit.layout": MagicMock(), 36 "prompt_toolkit.layout.processors": MagicMock(), 37 "prompt_toolkit.filters": MagicMock(), 38 "prompt_toolkit.layout.dimension": MagicMock(), 39 "prompt_toolkit.layout.menus": MagicMock(), 40 "prompt_toolkit.widgets": MagicMock(), 41 "prompt_toolkit.key_binding": MagicMock(), 42 "prompt_toolkit.completion": MagicMock(), 43 "prompt_toolkit.formatted_text": MagicMock(), 44 "prompt_toolkit.auto_suggest": MagicMock(), 45 } 46 with patch.dict(sys.modules, prompt_toolkit_stubs), patch.dict("os.environ", clean_env, clear=False): 47 import cli as mod 48 49 mod = importlib.reload(mod) 50 _cli_mod = mod 51 with patch.object(mod, "get_tool_definitions", return_value=[]), patch.dict(mod.__dict__, {"CLI_CONFIG": clean_config}): 52 return mod.HermesCLI() 53 54 55 class TestSubmittedUserMessagePreview: 56 def test_default_preview_shows_first_two_lines_and_last_two_lines(self): 57 cli = _make_cli() 58 59 rendered = cli._format_submitted_user_message_preview( 60 "line1\nline2\nline3\nline4\nline5\nline6" 61 ) 62 63 assert "line1" in rendered 64 assert "line2" in rendered 65 assert "line5" in rendered 66 assert "line6" in rendered 67 assert "line3" not in rendered 68 assert "line4" not in rendered 69 assert "(+2 more lines)" in rendered 70 71 def test_preview_can_hide_last_lines(self): 72 cli = _make_cli({"first_lines": 2, "last_lines": 0}) 73 74 rendered = cli._format_submitted_user_message_preview( 75 "line1\nline2\nline3\nline4\nline5\nline6" 76 ) 77 78 assert "line1" in rendered 79 assert "line2" in rendered 80 assert "line5" not in rendered 81 assert "line6" not in rendered 82 assert "(+4 more lines)" in rendered 83 84 def test_invalid_first_lines_value_falls_back_to_one(self): 85 cli = _make_cli({"first_lines": 0, "last_lines": 2}) 86 87 rendered = cli._format_submitted_user_message_preview("line1\nline2\nline3\nline4") 88 89 assert "line1" in rendered 90 assert "line3" in rendered 91 assert "line4" in rendered 92 assert "(+1 more line)" in rendered