Files
hermes-agent/tests/hermes_cli/test_sessions_export_md_cli.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

131 lines
3.5 KiB
Python

import sys
def test_sessions_export_md_writes_single_session(monkeypatch, tmp_path, capsys):
import hermes_cli.main as main_mod
import hermes_state
captured = {}
class FakeDB:
def resolve_session_id(self, session_id):
captured["resolved_from"] = session_id
return "20260706_123456_abcd1234"
def export_session(self, session_id):
captured["exported"] = session_id
return {
"id": session_id,
"title": "Export CLI Test",
"source": "cli",
"message_count": 1,
"messages": [{"role": "user", "content": "hello"}],
}
def delete_session(self, *args, **kwargs):
raise AssertionError("markdown export must not delete sessions")
def prune_sessions(self, *args, **kwargs):
raise AssertionError("markdown export must not prune sessions")
def close(self):
captured["closed"] = True
monkeypatch.setattr(hermes_state, "SessionDB", lambda: FakeDB())
monkeypatch.setattr(
sys,
"argv",
[
"hermes",
"sessions",
"export",
"--format",
"md",
"--session-id",
"20260706_123456",
str(tmp_path),
],
)
main_mod.main()
output = capsys.readouterr().out
files = list(tmp_path.glob("*.md"))
assert len(files) == 1
text = files[0].read_text(encoding="utf-8")
assert "# Export CLI Test" in text
assert "hello" in text
assert captured == {
"resolved_from": "20260706_123456",
"exported": "20260706_123456_abcd1234",
"closed": True,
}
assert "Exported 1 session" in output
assert "1 message" in output
assert str(files[0]) in output
def test_sessions_export_redact_scrubs_secrets(monkeypatch, tmp_path):
"""--redact runs exported content through force-mode secret redaction."""
import hermes_cli.main as main_mod
import hermes_state
secret = "sk-proj-Zz12345678901234567890123456789012345678"
class FakeDB:
def resolve_session_id(self, session_id):
return "s1"
def export_session(self, session_id):
return {
"id": "s1",
"title": "Redact",
"messages": [
{"role": "tool", "name": "terminal", "content": f"api key: {secret}"}
],
}
def close(self):
pass
monkeypatch.setattr(hermes_state, "SessionDB", lambda: FakeDB())
monkeypatch.setattr(
sys,
"argv",
[
"hermes", "sessions", "export", "--format", "md",
"--session-id", "s1", "--redact", str(tmp_path),
],
)
main_mod.main()
text = next(tmp_path.glob("*.md")).read_text(encoding="utf-8")
assert secret not in text
assert "api key:" in text
def _trace_fake_db(captured):
class FakeDB:
def resolve_session_id(self, session_id):
return "s1"
def get_session(self, session_id):
return {"id": session_id, "model": "test-model"}
def get_messages_as_conversation(self, session_id):
captured["conv"] = session_id
return [
{"role": "user", "content": "hello trace"},
{"role": "assistant", "content": "hi"},
]
def close(self):
captured["closed"] = True
return FakeDB()