Files
hermes-agent/tests/hermes_cli/test_cron_parser_builder.py
alt-glitch e1067dbbe5 tests: pin ink engine in _make_tui_argv npm-bootstrap tests (post-merge semantic fix)
Main's rewritten test_tui_npm_install.py tests call _make_tui_argv expecting
the Ink/npm flow unconditionally; with the dual-engine dispatch merged in,
_resolve_tui_engine() auto-selects opentui whenever ui-opentui/dist is built
in the repo, routing the call away from the path under test (first subprocess
became 'node --version' instead of 'npm run build'). Pin the engine to ink
via an autouse fixture, mirroring the existing pinning precedent in
test_tui_resume_flow.py.
2026-06-12 10:32:40 +05:30

86 lines
2.9 KiB
Python

"""Unit tests for the extracted ``hermes cron`` parser builder.
Confirms ``build_cron_parser`` wires up the same subactions, aliases, options,
and ``func=cmd_cron`` dispatch that lived inline in ``main()`` before the
god-file Phase 2 extraction.
"""
from __future__ import annotations
import argparse
from hermes_cli.subcommands.cron import build_cron_parser
def _sentinel_handler(args): # pragma: no cover - only identity is asserted
return "cron-handler"
def _build():
parser = argparse.ArgumentParser(prog="hermes")
subparsers = parser.add_subparsers(dest="command")
build_cron_parser(subparsers, cmd_cron=_sentinel_handler)
return parser
def test_cron_subactions_present():
parser = _build()
for action in ("list", "create", "edit", "pause", "resume", "run", "remove", "status", "tick"):
ns = parser.parse_args(["cron", action] if action in ("list", "status", "tick")
else ["cron", action, "jobid"] if action in ("pause", "resume", "run", "remove", "edit")
else ["cron", "create", "30m"])
assert ns.command == "cron"
assert ns.cron_command == action
def test_cron_aliases():
parser = _build()
# create has alias "add"
ns = parser.parse_args(["cron", "add", "30m"])
assert ns.cron_command == "add"
# remove has aliases rm / delete
for alias in ("rm", "delete"):
ns = parser.parse_args(["cron", alias, "jid"])
assert ns.cron_command == alias
def test_cron_create_options():
parser = _build()
ns = parser.parse_args([
"cron", "create", "0 9 * * *", "daily task prompt",
"--name", "daily", "--deliver", "origin", "--repeat", "3",
"--skill", "a", "--skill", "b", "--no-agent",
"--workdir", "/tmp/x",
])
assert ns.schedule == "0 9 * * *"
assert ns.prompt == "daily task prompt"
assert ns.name == "daily"
assert ns.deliver == "origin"
assert ns.repeat == 3
assert ns.skills == ["a", "b"]
assert ns.no_agent is True
assert ns.workdir == "/tmp/x"
def test_cron_edit_no_agent_tristate():
parser = _build()
# --no-agent -> True, --agent -> False, neither -> None
assert parser.parse_args(["cron", "edit", "j", "--no-agent"]).no_agent is True
assert parser.parse_args(["cron", "edit", "j", "--agent"]).no_agent is False
assert parser.parse_args(["cron", "edit", "j"]).no_agent is None
def test_cron_dispatch_func_is_injected_handler():
parser = _build()
ns = parser.parse_args(["cron", "list"])
assert ns.func is _sentinel_handler
def test_cron_accept_hooks_flag_on_run_and_tick():
parser = _build()
# --accept-hooks is suppressed-default; present only when passed.
ns = parser.parse_args(["cron", "run", "jid", "--accept-hooks"])
assert ns.accept_hooks is True
ns2 = parser.parse_args(["cron", "tick", "--accept-hooks"])
assert ns2.accept_hooks is True