From 55e7ecd260268e6447c718dd0669502d3c65fa46 Mon Sep 17 00:00:00 2001 From: embwl0x Date: Sat, 8 Aug 2026 13:06:37 -0700 Subject: [PATCH] test(cli): cover config guard edge cases --- hermes_cli/main.py | 2 +- .../test_noninteractive_config_guard.py | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/hermes_cli/main.py b/hermes_cli/main.py index 877122834d..930114cdc4 100644 --- a/hermes_cli/main.py +++ b/hermes_cli/main.py @@ -12743,7 +12743,7 @@ def _guard_noninteractive_user_config(args) -> None: is_noninteractive = ( bool(getattr(args, "oneshot", None)) - or getattr(args, "query", None) is not None + or bool(getattr(args, "query", None)) or bool(getattr(args, "quiet", False)) ) if not is_noninteractive: diff --git a/tests/hermes_cli/test_noninteractive_config_guard.py b/tests/hermes_cli/test_noninteractive_config_guard.py index adb8671ffc..a1968e3275 100644 --- a/tests/hermes_cli/test_noninteractive_config_guard.py +++ b/tests/hermes_cli/test_noninteractive_config_guard.py @@ -146,6 +146,47 @@ def test_interactive_chat_keeps_existing_repair_behavior(tmp_path): assert list(tmp_path.glob("config.yaml.corrupt.*.bak")) == [] +def test_empty_query_keeps_interactive_repair_behavior(tmp_path): + from hermes_cli import main as main_mod + + (tmp_path / "config.yaml").write_text("model: [unterminated\n") + args = _args(query="") + + main_mod._guard_noninteractive_user_config(args) + + assert not hasattr(args, "_noninteractive_config_validated") + assert list(tmp_path.glob("config.yaml.corrupt.*.bak")) == [] + + +def test_env_only_config_bypass_allows_noninteractive_recovery(monkeypatch, tmp_path): + from hermes_cli import main as main_mod + + (tmp_path / "config.yaml").write_text("model: [unterminated\n") + monkeypatch.setenv("HERMES_IGNORE_USER_CONFIG", "1") + args = _args() + + main_mod._guard_noninteractive_user_config(args) + + assert args._noninteractive_config_validated is True + assert list(tmp_path.glob("config.yaml.corrupt.*.bak")) == [] + + +def test_reused_args_can_retry_after_config_repair(tmp_path): + from hermes_cli import main as main_mod + + config_path = tmp_path / "config.yaml" + config_path.write_text("model: [unterminated\n") + args = _args() + + with pytest.raises(SystemExit): + main_mod._guard_noninteractive_user_config(args) + + config_path.write_text("model:\n default: local/test\n") + main_mod._guard_noninteractive_user_config(args) + + assert args._noninteractive_config_validated is True + + def test_ignore_user_config_is_applied_before_oneshot_startup(monkeypatch): from hermes_cli import main as main_mod