test_yolo_command.py
1 """Tests for gateway /yolo session scoping.""" 2 3 import os 4 5 import pytest 6 7 import gateway.run as gateway_run 8 from gateway.config import Platform 9 from gateway.platforms.base import MessageEvent 10 from gateway.session import SessionSource 11 from tools.approval import disable_session_yolo, is_session_yolo_enabled 12 13 14 @pytest.fixture(autouse=True) 15 def _clean_yolo_state(monkeypatch): 16 monkeypatch.delenv("HERMES_YOLO_MODE", raising=False) 17 disable_session_yolo("agent:main:telegram:dm:chat-a") 18 disable_session_yolo("agent:main:telegram:dm:chat-b") 19 yield 20 monkeypatch.delenv("HERMES_YOLO_MODE", raising=False) 21 disable_session_yolo("agent:main:telegram:dm:chat-a") 22 disable_session_yolo("agent:main:telegram:dm:chat-b") 23 24 25 def _make_runner(): 26 runner = object.__new__(gateway_run.GatewayRunner) 27 runner.session_store = None 28 runner.config = None 29 return runner 30 31 32 def _make_event(chat_id: str) -> MessageEvent: 33 source = SessionSource( 34 platform=Platform.TELEGRAM, 35 user_id=f"user-{chat_id}", 36 chat_id=chat_id, 37 user_name="tester", 38 chat_type="dm", 39 ) 40 return MessageEvent(text="/yolo", source=source) 41 42 43 @pytest.mark.asyncio 44 async def test_yolo_command_toggles_only_current_session(monkeypatch): 45 runner = _make_runner() 46 47 event_a = _make_event("chat-a") 48 session_a = runner._session_key_for_source(event_a.source) 49 session_b = runner._session_key_for_source(_make_event("chat-b").source) 50 51 result_on = await runner._handle_yolo_command(event_a) 52 53 assert "ON" in result_on 54 assert is_session_yolo_enabled(session_a) is True 55 assert is_session_yolo_enabled(session_b) is False 56 assert os.environ.get("HERMES_YOLO_MODE") is None 57 58 result_off = await runner._handle_yolo_command(event_a) 59 60 assert "OFF" in result_off 61 assert is_session_yolo_enabled(session_a) is False 62 assert os.environ.get("HERMES_YOLO_MODE") is None