hermes-agent/tests/agent/test_turn_retry_state.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

58 lines
1.8 KiB
Python

"""Unit tests for TurnRetryState (god-file Phase 1b).
The dataclass holds the inner-retry-loop's one-shot recovery guards + restart
signals. These tests pin its shape and default semantics — the behavioral
guarantee for the loop itself is the existing recovery-branch tests in
tests/run_agent/ which now exercise these fields via `_retry.<flag>`.
"""
from __future__ import annotations
from dataclasses import fields
from agent.turn_retry_state import TurnRetryState
EXPECTED_FIELDS = {
"codex_auth_retry_attempted",
"anthropic_auth_retry_attempted",
"nous_auth_retry_attempted",
"nous_paid_entitlement_refresh_attempted",
"copilot_auth_retry_attempted",
"vertex_auth_retry_attempted",
"thinking_sig_retry_attempted",
"invalid_encrypted_content_retry_attempted",
"image_shrink_retry_attempted",
"multimodal_tool_content_retry_attempted",
"oauth_1m_beta_retry_attempted",
"llama_cpp_grammar_retry_attempted",
"primary_recovery_attempted",
"has_retried_429",
"auth_failover_attempted",
"restart_with_compressed_messages",
"restart_with_length_continuation",
"restart_with_rebuilt_messages",
"restart_with_redirected_messages",
}
def test_field_set_matches_contract():
names = {f.name for f in fields(TurnRetryState)}
assert names == EXPECTED_FIELDS, (
f"unexpected drift: missing={EXPECTED_FIELDS - names} extra={names - EXPECTED_FIELDS}"
)
def test_guards_are_independently_mutable():
s = TurnRetryState()
s.codex_auth_retry_attempted = True
s.restart_with_compressed_messages = True
assert s.codex_auth_retry_attempted is True
assert s.restart_with_compressed_messages is True
# untouched guards stay False
assert s.has_retried_429 is False
assert s.anthropic_auth_retry_attempted is False