diff --git a/tests/tools/test_approval.py b/tests/tools/test_approval.py index 675fcf1e01..b57dddcf1f 100644 --- a/tests/tools/test_approval.py +++ b/tests/tools/test_approval.py @@ -155,6 +155,50 @@ class TestSessionKeyContext: assert "set_current_session_key" in called_names assert "reset_current_session_key" in called_names + def test_context_keeps_pending_approval_attached_to_originating_session(self): + import os + import threading + + clear_session("alice") + clear_session("bob") + pop_pending("alice") + pop_pending("bob") + approval_module._permanent_approved.clear() + + alice_ready = threading.Event() + bob_ready = threading.Event() + + def worker_alice(): + token = approval_module.set_current_session_key("alice") + try: + os.environ["HERMES_EXEC_ASK"] = "1" + os.environ["HERMES_SESSION_KEY"] = "alice" + alice_ready.set() + bob_ready.wait() + approval_module.check_all_command_guards("rm -rf /tmp/alice-secret", "local") + finally: + approval_module.reset_current_session_key(token) + + def worker_bob(): + alice_ready.wait() + token = approval_module.set_current_session_key("bob") + try: + os.environ["HERMES_SESSION_KEY"] = "bob" + bob_ready.set() + finally: + approval_module.reset_current_session_key(token) + + t1 = threading.Thread(target=worker_alice) + t2 = threading.Thread(target=worker_bob) + with mock_patch.dict("os.environ", {"HERMES_GATEWAY_SESSION": "1"}, clear=False): + t1.start() + t2.start() + t1.join() + t2.join() + + assert pop_pending("alice") is not None + assert pop_pending("bob") is None + class TestRmFalsePositiveFix: """Regression tests: filenames starting with 'r' must NOT trigger recursive delete.""" diff --git a/tests/tools/test_managed_media_gateways.py b/tests/tools/test_managed_media_gateways.py index 9a2d8391c7..ecbf71c2a0 100644 --- a/tests/tools/test_managed_media_gateways.py +++ b/tests/tools/test_managed_media_gateways.py @@ -215,6 +215,7 @@ def test_openai_tts_uses_managed_audio_gateway_when_direct_key_absent(monkeypatc _install_fake_tools_package() _install_fake_openai_module(captured) monkeypatch.delenv("VOICE_TOOLS_OPENAI_KEY", raising=False) + monkeypatch.delenv("OPENAI_API_KEY", raising=False) monkeypatch.setenv("TOOL_GATEWAY_DOMAIN", "nousresearch.com") monkeypatch.setenv("TOOL_GATEWAY_USER_TOKEN", "nous-token") @@ -256,6 +257,7 @@ def test_transcription_uses_model_specific_response_formats(monkeypatch, tmp_pat monkeypatch.setenv("HERMES_HOME", str(tmp_path)) (tmp_path / "config.yaml").write_text("stt:\n provider: openai\n") monkeypatch.delenv("VOICE_TOOLS_OPENAI_KEY", raising=False) + monkeypatch.delenv("OPENAI_API_KEY", raising=False) monkeypatch.setenv("TOOL_GATEWAY_DOMAIN", "nousresearch.com") monkeypatch.setenv("TOOL_GATEWAY_USER_TOKEN", "nous-token")