From 222a3a9c1934e1d10dba2be0ade2917cd5f80a65 Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Mon, 25 May 2026 00:52:23 -0700 Subject: [PATCH] test(cli): cover exit resume hint -p flag across profiles 5 tests: default/custom profiles emit no -p; named profile emits -p on both --resume and -c hints; lookup failure falls back gracefully. --- tests/cli/test_exit_summary_resume_hint.py | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 tests/cli/test_exit_summary_resume_hint.py diff --git a/tests/cli/test_exit_summary_resume_hint.py b/tests/cli/test_exit_summary_resume_hint.py new file mode 100644 index 00000000000..997d39bf899 --- /dev/null +++ b/tests/cli/test_exit_summary_resume_hint.py @@ -0,0 +1,83 @@ +"""Tests for the CLI exit summary's resume hint, including profile-flag support.""" + +from datetime import datetime +from unittest.mock import MagicMock, patch + +from cli import HermesCLI + + +def _make_cli(session_id="20260524_000001_abc123"): + cli_obj = HermesCLI.__new__(HermesCLI) + cli_obj.session_id = session_id + # _print_exit_summary requires a populated conversation history (msg_count > 0) + # to print the resume hint at all. One synthetic user turn is enough. + cli_obj.conversation_history = [{"role": "user", "content": "hi"}] + cli_obj.agent = None + cli_obj._session_db = None + cli_obj.session_start = datetime.now() + return cli_obj + + +class TestExitSummaryResumeHint: + """The exit-line ``Resume this session with:`` hint must include the + active profile (`-p `) so session IDs round-trip across + profile boundaries — sessions live under `~/.hermes-profiles//`, + so a hint copied without `-p` from a non-default profile won't find + the session. + """ + + def test_resume_hint_no_profile_flag_on_default(self, capsys): + cli_obj = _make_cli() + with patch("hermes_cli.profiles.get_active_profile_name", return_value="default"): + cli_obj._print_exit_summary() + out = capsys.readouterr().out + # No `-p` for the default profile. + assert "hermes --resume 20260524_000001_abc123" in out + assert " -p " not in out + + def test_resume_hint_no_profile_flag_on_custom(self, capsys): + cli_obj = _make_cli() + with patch("hermes_cli.profiles.get_active_profile_name", return_value="custom"): + cli_obj._print_exit_summary() + out = capsys.readouterr().out + # "custom" is the standard HERMES_HOME indicator — no -p needed. + assert "hermes --resume 20260524_000001_abc123" in out + assert " -p " not in out + + def test_resume_hint_includes_profile_flag_for_named_profile(self, capsys): + cli_obj = _make_cli() + with patch("hermes_cli.profiles.get_active_profile_name", return_value="dev"): + cli_obj._print_exit_summary() + out = capsys.readouterr().out + assert "hermes --resume 20260524_000001_abc123 -p dev" in out + + def test_resume_hint_includes_profile_flag_on_title_hint_too(self, capsys, tmp_path): + """When a session title is available, the `hermes -c "title"` hint + must also include the `-p` flag for non-default profiles. + """ + cli_obj = _make_cli() + fake_db = MagicMock() + fake_db.get_session_title.return_value = "My Cool Session" + cli_obj._session_db = fake_db + + with patch("hermes_cli.profiles.get_active_profile_name", return_value="dev"): + cli_obj._print_exit_summary() + out = capsys.readouterr().out + assert 'hermes -c "My Cool Session" -p dev' in out + assert "hermes --resume 20260524_000001_abc123 -p dev" in out + + def test_resume_hint_falls_back_when_profile_lookup_fails(self, capsys): + """If `get_active_profile_name` raises (e.g. profiles module + missing during ``hermes update`` mid-flight), fall back to no + flag rather than crashing the exit summary. + """ + cli_obj = _make_cli() + with patch( + "hermes_cli.profiles.get_active_profile_name", + side_effect=RuntimeError("profiles unavailable"), + ): + cli_obj._print_exit_summary() + out = capsys.readouterr().out + # Resume hint still printed without -p. + assert "hermes --resume 20260524_000001_abc123" in out + assert " -p " not in out