Files
hermes-agent/tests/hermes_cli/test_subcommands_final_batch.py
Teknium b81ab901f3 refactor(cli): extract the last 16 inline parser groups from main() into hermes_cli/subcommands/
moa, fallback, worktree, browser, secrets, egress, migrate, whatsapp-cloud,
checkpoints, bundles, curator, pets, journey, computer-use, sessions and
completion each become a build_<group>_parser() builder. Closure handlers
that only closed over their own parser moved verbatim; sessions/completion
take the handler by injection. --help/usage/defaults byte-identical for all
399 parsers in the tree (in-process dump before/after).
2026-09-02 13:29:44 -07:00

110 lines
4.4 KiB
Python

"""Smoke tests for the final batch of subcommand builders extracted from main().
These groups either imported their handler from a sibling module inside the
parser block (moa, fallback, migrate, bundles, checkpoints, curator, pets,
journey, secrets, egress) or carried a closure handler that only closed over
its own parser (worktree, browser, computer-use, sessions, completion). The
closures moved verbatim into the builder; sessions/completion take the handler
by injection.
"""
from __future__ import annotations
import argparse
import pytest
from hermes_cli.subcommands.browser import build_browser_parser
from hermes_cli.subcommands.bundles import build_bundles_parser
from hermes_cli.subcommands.checkpoints import build_checkpoints_parser
from hermes_cli.subcommands.completion import build_completion_parser
from hermes_cli.subcommands.computer_use import build_computer_use_parser
from hermes_cli.subcommands.curator import build_curator_parser
from hermes_cli.subcommands.egress import build_egress_parser
from hermes_cli.subcommands.fallback import build_fallback_parser
from hermes_cli.subcommands.journey import build_journey_parser
from hermes_cli.subcommands.migrate import build_migrate_parser
from hermes_cli.subcommands.moa import build_moa_parser
from hermes_cli.subcommands.pets import build_pets_parser
from hermes_cli.subcommands.secrets import build_secrets_parser
from hermes_cli.subcommands.sessions import build_sessions_parser
from hermes_cli.subcommands.whatsapp import build_whatsapp_cloud_parser
from hermes_cli.subcommands.worktree import build_worktree_parser
def _tree():
parser = argparse.ArgumentParser(prog="hermes")
return parser, parser.add_subparsers(dest="command")
SELF_CONTAINED = [
("moa", build_moa_parser, ["moa", "list"]),
("fallback", build_fallback_parser, ["fallback", "add"]),
("worktree", build_worktree_parser, ["worktree", "prune", "--dry-run"]),
("browser", build_browser_parser, ["browser", "close-profile"]),
("secrets", build_secrets_parser, ["secrets"]),
("egress", build_egress_parser, ["egress"]),
("migrate", build_migrate_parser, ["migrate", "xai", "--apply"]),
("checkpoints", build_checkpoints_parser, ["checkpoints"]),
("bundles", build_bundles_parser, ["bundles"]),
("curator", build_curator_parser, ["curator"]),
("pets", build_pets_parser, ["pets"]),
("journey", build_journey_parser, ["journey"]),
("computer-use", build_computer_use_parser, ["computer-use", "status"]),
]
@pytest.mark.parametrize("name,builder,argv", SELF_CONTAINED, ids=[c[0] for c in SELF_CONTAINED])
def test_self_contained_builders_attach(name, builder, argv):
parser, sub = _tree()
builder(sub)
ns = parser.parse_args(argv)
assert ns.command == name
assert callable(getattr(ns, "func", None)) or name in ("checkpoints", "curator", "pets", "journey")
def test_worktree_aliases_normalize_to_list(monkeypatch):
parser, sub = _tree()
build_worktree_parser(sub)
seen = {}
monkeypatch.setattr("hermes_cli.worktree_cmd.cmd_worktree", lambda a: seen.setdefault("action", a.worktree_action))
ns = parser.parse_args(["worktree", "audit"])
ns.func(ns)
assert seen["action"] == "list"
def test_sessions_injects_handler_and_threads_parser():
parser, sub = _tree()
calls = []
build_sessions_parser(sub, cmd_sessions=lambda a, **kw: calls.append((a, kw)) or 0)
ns = parser.parse_args(["sessions", "prune", "--older-than", "2d", "--dry-run"])
assert ns.sessions_action == "prune" and ns.older_than == "2d" and ns.dry_run is True
assert ns.func(ns) == 0
(a, kw), = calls
assert a is ns
assert kw["sessions_parser"].prog.endswith("sessions")
def test_completion_passes_top_level_parser():
parser, sub = _tree()
got = {}
build_completion_parser(sub, cmd_completion=lambda a, p: got.update(a=a, p=p), parser=parser)
ns = parser.parse_args(["completion", "zsh"])
ns.func(ns)
assert got["p"] is parser and got["a"].shell == "zsh"
def test_whatsapp_cloud_dispatch():
parser, sub = _tree()
h = lambda a: "wa" # noqa: E731
build_whatsapp_cloud_parser(sub, cmd_whatsapp_cloud=h)
assert parser.parse_args(["whatsapp-cloud"]).func is h
def test_computer_use_no_action_prints_help(capsys):
parser, sub = _tree()
build_computer_use_parser(sub)
ns = parser.parse_args(["computer-use"])
ns.func(ns)
assert "install" in capsys.readouterr().out