From 55624e10b93fc2995be275f8d1919088ede29eab Mon Sep 17 00:00:00 2001 From: ethernet Date: Mon, 13 Jul 2026 16:24:59 -0400 Subject: [PATCH] fix(tests): force manual approval mode in E2E blocking tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit 62a76bd3d (feat: make smart approvals the default, #62661) changed approvals.mode default from "manual" to "smart". The TestBlockingApprovalE2E tests did not patch the approval mode, so check_all_command_guards routed through _smart_approve() first — calling call_llm() which tried all auxiliary providers, failed (no API keys in test env), and returned "escalate" before falling through to the gateway blocking path. The LLM failure cascade took longer than the test's 2.5s wait window (50 × 0.05s), so the notify callback had not fired yet when assert len(notified) == 1 ran. Force {"mode": "manual"} via patch in setup_method/teardown_method, matching the pattern already used by test_blocking_approval_uses_ canonical_timeout in the same class. --- tests/gateway/test_approve_deny_commands.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/gateway/test_approve_deny_commands.py b/tests/gateway/test_approve_deny_commands.py index 7976838ef..18eef7b65 100644 --- a/tests/gateway/test_approve_deny_commands.py +++ b/tests/gateway/test_approve_deny_commands.py @@ -421,6 +421,18 @@ class TestBlockingApprovalE2E: os.environ.pop("HERMES_GATEWAY_SESSION", None) os.environ.pop("HERMES_EXEC_ASK", None) os.environ.pop("HERMES_SESSION_KEY", None) + # Force manual approval mode — these tests exercise the blocking + # gateway flow, not smart approval. The default became "smart" + # (#62661), which routes through _smart_approve() first and + # delays the notify callback past the test's wait window. + self._approval_mode_patch = patch( + "tools.approval._get_approval_config", + return_value={"mode": "manual"}, + ) + self._approval_mode_patch.start() + + def teardown_method(self): + self._approval_mode_patch.stop() def test_blocking_approval_approve_once(self): """check_all_command_guards blocks until resolve_gateway_approval is called."""