fix(ci): stub resolve_runtime_provider in cron wake-gate tests + shield update-check timeout test from thread race

Two additional CI failures surfaced when the first PR ran through GHA —
both were pre-existing but blocked merge.

1) tests/cron/test_scheduler.py::TestRunJobWakeGate (3 tests)
   run_job calls resolve_runtime_provider BEFORE constructing AIAgent, so
   patching run_agent.AIAgent alone isn't enough — the resolver raises
   'No inference provider configured' in hermetic CI (no API keys) and
   the test never reaches the mocked AIAgent.  Added autouse fixture
   that stubs resolve_runtime_provider with a fake openrouter runtime.

2) tests/hermes_cli/test_update_check.py::test_get_update_result_timeout
   Observed on CI: assert 4950 is None.  A background update-check
   thread (from an earlier test or hermes_cli.main's own
   prefetch_update_check call) raced a real git-fetch result
   (4950 commits behind origin/main) into banner._update_result during
   this test's wait(0.1).  Wrap the test in patch.object(banner,
   'check_for_updates', return_value=None) so any in-flight thread
   writes None rather than a real value.

Validation:
  Under CI-parity env (env -i, no creds): 6/6 pass
  Broader suite (tests/hermes_cli + cron + gateway + run_agent/streaming
  + toolsets + discord_tool): 6033 passed, pre-existing failures in
  telegram_approval_buttons (3) and internal_event_bypass_pairing (1)
  are unrelated.
This commit is contained in:
Teknium
2026-04-19 18:55:20 -07:00
committed by Teknium
parent c9b833feb3
commit ad4680cf74
2 changed files with 44 additions and 10 deletions

View File

@@ -1239,6 +1239,30 @@ class TestParseWakeGate:
class TestRunJobWakeGate:
"""Integration tests for run_job wake-gate short-circuit."""
@pytest.fixture(autouse=True)
def _stub_runtime_provider(self):
"""Stub ``resolve_runtime_provider`` for wake-gate tests.
``run_job`` resolves the runtime provider BEFORE constructing
``AIAgent``, so these tests must mock ``resolve_runtime_provider``
in addition to ``AIAgent`` — otherwise in a hermetic CI env (no
API keys), the resolver raises and the test fails before the
patched AIAgent is ever reached.
"""
fake_runtime = {
"provider": "openrouter",
"api_mode": "chat_completions",
"base_url": "https://openrouter.ai/api/v1",
"api_key": "test-key",
"source": "stub",
"requested_provider": None,
}
with patch(
"hermes_cli.runtime_provider.resolve_runtime_provider",
return_value=fake_runtime,
):
yield
def _make_job(self, name="wake-gate-test", script="check.py"):
"""Minimal valid cron job dict for run_job."""
return {