hermes-agent/tests/gateway/test_interactive_prompt_base.py
Teknium 39975613b1
test: prune wave 2 + speed fixes — 28,106 → 19,757 test functions, suite wall 315s → 294s
Second, deeper pass over tools/gateway/hermes_cli plus first pass over
the trees wave 1 missed (acp, acp_adapter, skills, computer_use, docker,
dashboard, conformance, monitoring, secret_sources, hermes_state,
providers). Same rubric as wave 1 (AGENTS.md test policy); security,
alternation/caching invariants, issue-number regressions, and E2E kept.

Real test-quality fixes found and rooted out along the way:
- tests/tools/test_command_guards.py made real auxiliary-LLM HTTPS calls
  (DEFAULT_CONFIG smart-approval leaked in) — pinned approval
  mode=manual via autouse fixture: 17.4s → 0.4s.
- test_model_switch_custom_providers.py / test_user_providers_model_switch.py
  silently probed live provider catalogs (~2s/test) — stubbed
  cached_provider_model_ids/provider_model_ids/fetch_api_models.
- test_telegram_noise_filter.py: 15-platform copy-paste matrix over
  shared gateway.run logic → 3 representative platforms (55s → 3.9s).
- test_gateway_shutdown.py: stop()'s 5s interrupt-deadline loop spun on
  MagicMock agents — interrupt.side_effect now clears _running_agents
  (22s → 1.0s).
- test_gateway_inactivity_timeout.py poll-harness timings shrunk 3-5x
  (24s → 1.1s); test_mcp_stability.py backoff/SIGTERM-grace sleeps
  patched (15.4s → 2.5s); test_async_delegation.py negative-drain wait
  5s → 0.5s.
- test_telegram_init_deadline.py: loop-block margin restored to 1.0s
  with rationale comment — the watchdog-dump assertion needs the loop
  blocked well past deadline+grace under parallel load (flaked once in
  the 40-worker verification run at a 0.2s margin).

Verification: full hermetic suite via scripts/run_tests.sh —
2,438 files, 21,718 tests passed, 0 failed, 293.9s wall.
Suite totals vs original baseline: 46,820 → 19,757 test functions
(−57.8%), wall 583.5s → 293.9s (−50%), subprocess CPU 13,564s → 11,623s.
2026-07-29 13:39:40 -07:00

108 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Tests for the shared interactive-prompt formatting cores in BasePlatformAdapter.
Covers ``_format_exec_approval`` (template-attr driven exec-approval text),
``_format_choice_page`` (picker pagination core), ``_truncate_preview``, and
byte-parity of the rewired adapters (telegram/feishu/matrix) against their
historical inline formatting.
"""
import html as _html
from gateway.platforms.base import BasePlatformAdapter
def _bare(cls):
"""Bare instance without running __init__ (documented test pattern)."""
return object.__new__(cls)
class _DefaultAdapter(BasePlatformAdapter):
"""Concrete subclass using only base-class template attrs."""
async def connect(self): # pragma: no cover - not used
pass
async def disconnect(self): # pragma: no cover - not used
pass
async def get_chat_info(self, chat_id): # pragma: no cover - not used
return {}
async def send(self, *a, **k): # pragma: no cover - not used
raise NotImplementedError
class TestTruncatePreview:
def test_short_text_unchanged(self):
assert BasePlatformAdapter._truncate_preview("abc", 10) == "abc"
def test_exact_budget_unchanged(self):
assert BasePlatformAdapter._truncate_preview("x" * 10, 10) == "x" * 10
class TestFormatExecApproval:
def test_default_template(self):
ad = _bare(_DefaultAdapter)
text = ad._format_exec_approval("rm -rf /", "scary")
assert text == (
"⚠️ Command Approval Required\n\n"
"```\nrm -rf /\n```\n"
"Reason: scary"
)
def test_escape_hook_applied_to_command_and_reason(self):
class Escaping(_DefaultAdapter):
def _ea_escape(self, text: str) -> str:
return _html.escape(text)
ad = _bare(Escaping)
text = ad._format_exec_approval("echo <hi>", "a & b")
assert "echo &lt;hi&gt;" in text
assert "a &amp; b" in text
class TestFormatChoicePage:
def test_single_page_no_page_info(self):
opts, meta = BasePlatformAdapter._format_choice_page([1, 2, 3], 0, 10)
assert opts == [1, 2, 3]
assert meta["page_info"] == ""
assert meta["total_pages"] == 1
assert meta["page"] == 0
def test_page_clamped_high(self):
opts, meta = BasePlatformAdapter._format_choice_page(list(range(25)), 99, 10)
assert meta["page"] == 2
assert opts == list(range(20, 25))
assert meta["page_info"] == " (2125 of 25)"
class TestAdapterParity:
"""Rewired adapters produce byte-identical text vs their historical inline code."""
def test_telegram_pagination_parity(self):
"""_format_choice_page matches the old _build_*_keyboard arithmetic."""
def old(options, page, page_size):
total = len(options)
total_pages = max(1, (total + page_size - 1) // page_size)
page = max(0, min(page, total_pages - 1))
start = page * page_size
end = min(start + page_size, total)
page_info = f" ({start + 1}{end} of {total})" if total_pages > 1 else ""
return options[start:end], page, total_pages, page_info
for n in (0, 1, 8, 9, 10, 25):
options = list(range(n))
for page in (-3, 0, 1, 2, 99):
for per in (8, 10):
o_opts, o_page, o_tp, o_info = old(options, page, per)
n_opts, meta = BasePlatformAdapter._format_choice_page(
options, page, per
)
assert n_opts == o_opts
assert meta["page"] == o_page
assert meta["total_pages"] == o_tp
assert meta["page_info"] == o_info