/ tests / cli / test_cli_user_message_preview.py
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