"""Bridge 명령 라우팅 테스트.""" from __future__ import annotations import sys import types slack_bolt = types.ModuleType("slack_bolt") slack_bolt.App = object socket_mode = types.ModuleType("slack_bolt.adapter.socket_mode") socket_mode.SocketModeHandler = object slack_sdk = types.ModuleType("slack_sdk") slack_sdk.WebClient = object sys.modules.setdefault("slack_bolt", slack_bolt) sys.modules.setdefault("slack_bolt.adapter.socket_mode", socket_mode) sys.modules.setdefault("slack_sdk", slack_sdk) class FakeSlackHandler: def __init__(self, _config) -> None: self.message_callback = None self.command_callback = None self.sent_messages: list[tuple[str, str]] = [] def on_message(self, callback) -> None: self.message_callback = callback def on_command(self, callback) -> None: self.command_callback = callback def send_message(self, channel: str, text: str) -> None: self.sent_messages.append((channel, text)) def start(self) -> None: return None def stop(self) -> None: return None class FakePtyManager: instances: list[FakePtyManager] = [] def __init__(self, session_name: str, cli_name: str = "claude") -> None: self.session_name = session_name self.cli_name = cli_name self._alive = False FakePtyManager.instances.append(self) @property def is_alive(self) -> bool: return self._alive def start(self) -> None: self._alive = True def stop(self) -> None: self._alive = False def send(self, _text: str) -> None: return None def read_output(self, timeout: int = 5) -> str: return "" def _make_bridge(monkeypatch): from lazy_enter.bridge import Bridge from lazy_enter.config import Config monkeypatch.setattr("lazy_enter.bridge.SlackHandler", FakeSlackHandler) monkeypatch.setattr("lazy_enter.bridge.PtyManager", FakePtyManager) config = Config() config.tmux_session_name = "claude-room" config.codex_tmux_session_name = "codex-room" return Bridge(config) def test_start_claude_routes_to_claude_session(monkeypatch) -> None: FakePtyManager.instances.clear() bridge = _make_bridge(monkeypatch) bridge._handle_command("start", "claude", "C1") assert FakePtyManager.instances[-1].session_name == "claude-room" assert FakePtyManager.instances[-1].cli_name == "claude" assert bridge.slack.sent_messages[-1] == ( "C1", ":link: Claude 세션에 연결되었습니다.", ) def test_start_codex_routes_to_codex_session(monkeypatch) -> None: FakePtyManager.instances.clear() bridge = _make_bridge(monkeypatch) bridge._handle_command("start", "codex", "C1") assert FakePtyManager.instances[-1].session_name == "codex-room" assert FakePtyManager.instances[-1].cli_name == "codex" assert bridge.slack.sent_messages[-1] == ( "C1", ":link: Codex 세션에 연결되었습니다.", ) def test_unknown_target_is_rejected(monkeypatch) -> None: bridge = _make_bridge(monkeypatch) bridge._handle_command("start", "unknown", "C1") assert bridge.slack.sent_messages[-1] == ( "C1", ":warning: 지원하지 않는 대상입니다.", )