from argparse import Namespace import sys import types import pytest def _args(**overrides): base = { "continue_last": None, "resume": None, "tui": True, } base.update(overrides) return Namespace(**base) @pytest.fixture def main_mod(monkeypatch): import hermes_cli.main as mod monkeypatch.setattr(mod, "_has_any_provider_configured", lambda: True) return mod def test_cmd_chat_tui_continue_uses_latest_tui_session(monkeypatch, main_mod): calls = [] captured = {} def fake_resolve_last(source="cli"): calls.append(source) return "20260408_235959_a1b2c3" if source == "tui" else None def fake_launch(resume_session_id=None, tui_dev=False): captured["resume"] = resume_session_id raise SystemExit(0) monkeypatch.setattr(main_mod, "_resolve_last_session", fake_resolve_last) monkeypatch.setattr(main_mod, "_resolve_session_by_name_or_id", lambda val: val) monkeypatch.setattr(main_mod, "_launch_tui", fake_launch) with pytest.raises(SystemExit): main_mod.cmd_chat(_args(continue_last=True)) assert calls == ["tui"] assert captured["resume"] == "20260408_235959_a1b2c3" def test_cmd_chat_tui_continue_falls_back_to_latest_cli_session(monkeypatch, main_mod): calls = [] captured = {} def fake_resolve_last(source="cli"): calls.append(source) if source == "tui": return None if source == "cli": return "20260408_235959_d4e5f6" return None def fake_launch(resume_session_id=None, tui_dev=False): captured["resume"] = resume_session_id raise SystemExit(0) monkeypatch.setattr(main_mod, "_resolve_last_session", fake_resolve_last) monkeypatch.setattr(main_mod, "_resolve_session_by_name_or_id", lambda val: val) monkeypatch.setattr(main_mod, "_launch_tui", fake_launch) with pytest.raises(SystemExit): main_mod.cmd_chat(_args(continue_last=True)) assert calls == ["tui", "cli"] assert captured["resume"] == "20260408_235959_d4e5f6" def test_cmd_chat_tui_resume_resolves_title_before_launch(monkeypatch, main_mod): captured = {} def fake_launch(resume_session_id=None, tui_dev=False): captured["resume"] = resume_session_id raise SystemExit(0) monkeypatch.setattr(main_mod, "_resolve_session_by_name_or_id", lambda val: "20260409_000000_aa11bb") monkeypatch.setattr(main_mod, "_launch_tui", fake_launch) with pytest.raises(SystemExit): main_mod.cmd_chat(_args(resume="my t0p session")) assert captured["resume"] == "20260409_000000_aa11bb" def test_print_tui_exit_summary_includes_resume_and_token_totals(monkeypatch, capsys): import hermes_cli.main as main_mod class _FakeDB: def get_session(self, session_id): assert session_id == "20260409_000001_abc123" return { "message_count": 2, "input_tokens": 10, "output_tokens": 6, "cache_read_tokens": 2, "cache_write_tokens": 2, "reasoning_tokens": 1, } def get_session_title(self, _session_id): return "demo title" def close(self): return None monkeypatch.setitem(sys.modules, "hermes_state", types.SimpleNamespace(SessionDB=lambda: _FakeDB())) main_mod._print_tui_exit_summary("20260409_000001_abc123") out = capsys.readouterr().out assert "Resume this session with:" in out assert "hermes --tui --resume 20260409_000001_abc123" in out assert 'hermes --tui -c "demo title"' in out assert "Tokens: 21 (in 10, out 6, cache 4, reasoning 1)" in out