hermes-agent/tests/hermes_cli/test_ctrlg_editor_submit.py
Teknium 6b81590c55
test: prune low-value tests suite-wide (wave 1) — 46,820 → 28,106 test functions
Systematic prune per AGENTS.md test policy, one pass over every major
test tree (gateway, hermes_cli, tools, agent, run_agent, plugins, cli,
cron, tui_gateway, honcho/openviking, root-level):

- DELETE: source-reading tests (read_text/getsource on prod files),
  change-detector tests (exact catalog counts, model-name snapshots,
  config version literals), mock-echo tests (assert a mock returns what
  it was told), assertion-free/trivial tests, near-duplicate
  parametrizations (boundaries + one representative kept), async/sync
  twin duplicates, cosmetic within-file variations.
- KEEP (mandatory): security/redaction/approval guards, message-role
  alternation invariants, prompt-caching/deterministic-call-id
  invariants, issue-number regression tests (deduped), E2E tests.
- 6 test files deleted outright (script-style/no-assert or fully
  redundant); conftest.py, fakes/, fixtures/ untouched.
- tests/acp/conftest.py added: autouse fixture stubs the live
  models.dev/GitHub/Copilot/Anthropic inventory fetches that ACP server
  tests performed on every session create — test_server.py 147s → 3.4s,
  and the tests are now genuinely hermetic.
- Sleep-based slowness shrunk where safe (codex_ttfb_watchdog,
  compression_concurrent_fork, etc.); no wall-clock assertion tightened.

Verification: full hermetic suite via scripts/run_tests.sh —
2439 files, 31,130 tests passed, 0 failed, 0 flaky retries, 315s wall
(baseline: 583s wall, 13,564s subprocess CPU).
2026-07-29 13:10:23 -07:00

65 lines
1.8 KiB
Python

"""Tests for Ctrl+G external-editor submit in the classic CLI.
Ctrl+G opens the current draft in ``$EDITOR``; on a clean save the draft is
submitted (TUI parity) rather than left in the input area. Submission in the
CLI is driven by the custom Enter keybinding, not the buffer accept_handler,
so ``_open_external_editor`` chains a done-callback that calls
``_submit_editor_buffer``. These exercise that submit helper directly.
"""
import queue
from cli import HermesCLI
class _FakeBuf:
def __init__(self, text: str):
self.text = text
self.reset_called = False
def reset(self, append_to_history: bool = False):
self.reset_called = True
self.text = ""
def _make(agent_running: bool = False, busy: str = "queue") -> HermesCLI:
c = HermesCLI.__new__(HermesCLI)
c._pending_input = queue.Queue()
c._interrupt_queue = queue.Queue()
c._agent_running = agent_running
c.busy_input_mode = busy
c._app = None
c._should_exit = False
return c
def test_idle_prompt_routed_to_pending_input():
c = _make()
buf = _FakeBuf("Explain vector databases.\nKeep it short.")
c._submit_editor_buffer(buf)
assert c._pending_input.get_nowait() == "Explain vector databases.\nKeep it short."
assert buf.reset_called
def test_running_interrupt_mode_uses_interrupt_queue():
c = _make(agent_running=True, busy="interrupt")
buf = _FakeBuf("interrupt this")
c._submit_editor_buffer(buf)
assert c._interrupt_queue.get_nowait() == "interrupt this"
assert c._pending_input.empty()
def test_slash_command_dispatched_not_queued():
c = _make()
seen = {}
c.process_command = lambda command: seen.setdefault("cmd", command) or True
buf = _FakeBuf("/status")
c._submit_editor_buffer(buf)
assert seen.get("cmd") == "/status"
assert c._pending_input.empty()