Add Codex target commands and session routing
This commit is contained in:
115
tests/test_bridge.py
Normal file
115
tests/test_bridge.py
Normal file
@@ -0,0 +1,115 @@
|
||||
"""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: 지원하지 않는 대상입니다.",
|
||||
)
|
||||
Reference in New Issue
Block a user