99 lines
3.3 KiB
Python
99 lines
3.3 KiB
Python
"""DM routing + super-agent retirement: a DM goes to the user-designated session (delivered like any
|
|
background turn) or is parked as unrouted; the legacy super-agent surface is gone."""
|
|
|
|
import asyncio
|
|
|
|
import pytest
|
|
from fastapi.testclient import TestClient
|
|
|
|
from coworker.connectors.base import MessageEvent, SessionSource
|
|
from coworker.providers import ModelCapabilities, ProviderClient
|
|
from coworker.server import create_app
|
|
from coworker.server.manager import SessionManager
|
|
|
|
|
|
class ScriptedProvider(ProviderClient):
|
|
def complete(self, *, model, messages, tools=None, **settings):
|
|
raise AssertionError("no turns expected")
|
|
|
|
def capabilities(self, model):
|
|
return ModelCapabilities()
|
|
|
|
|
|
def _dm(text, chat_id="D1", user="bob"):
|
|
return MessageEvent(
|
|
text=text,
|
|
source=SessionSource(
|
|
platform="slack", chat_id=chat_id, user_name=user, chat_type="dm"
|
|
),
|
|
)
|
|
|
|
|
|
def test_dm_with_designated_session_delivers(tmp_path, monkeypatch):
|
|
mgr = SessionManager(workspace=tmp_path, provider=ScriptedProvider())
|
|
delivered: list[tuple[str, str]] = []
|
|
|
|
async def fake_deliver(session_id, message, *, source=None):
|
|
delivered.append((session_id, message))
|
|
|
|
monkeypatch.setattr(mgr, "deliver_to_session", fake_deliver)
|
|
mgr.set_dm_session("sDM")
|
|
|
|
asyncio.run(mgr._dispatch_inbound(_dm("ping")))
|
|
assert delivered[0][0] == "sDM"
|
|
assert (
|
|
"ping" in delivered[0][1]
|
|
) # the tagged text carries the message + a reply handle
|
|
assert mgr.unrouted.list() == []
|
|
|
|
|
|
def test_dm_without_designation_is_parked(tmp_path):
|
|
mgr = SessionManager(workspace=tmp_path, provider=ScriptedProvider())
|
|
assert mgr.dm_session() is None
|
|
|
|
asyncio.run(mgr._dispatch_inbound(_dm("hello there")))
|
|
parked = mgr.unrouted.list()
|
|
assert len(parked) == 1
|
|
assert parked[0]["text"] == "hello there"
|
|
assert parked[0]["reason"] == "no DM session designated"
|
|
|
|
|
|
def test_dm_route_endpoints(tmp_path):
|
|
mgr = SessionManager(workspace=tmp_path, provider=ScriptedProvider())
|
|
client = TestClient(create_app(mgr))
|
|
|
|
assert client.get("/v1/messaging/dm-route").json()["dm_session"] is None
|
|
assert (
|
|
client.post("/v1/messaging/dm-route", json={"session_id": "sX"}).json()[
|
|
"dm_session"
|
|
]
|
|
== "sX"
|
|
)
|
|
assert client.get("/v1/messaging/dm-route").json()["dm_session"] == "sX"
|
|
# a falsy id clears it
|
|
assert (
|
|
client.post("/v1/messaging/dm-route", json={"session_id": ""}).json()[
|
|
"dm_session"
|
|
]
|
|
is None
|
|
)
|
|
|
|
|
|
def test_dm_session_persists_across_manager_reload(tmp_path):
|
|
mgr = SessionManager(workspace=tmp_path, provider=ScriptedProvider())
|
|
mgr.set_dm_session("sKeep")
|
|
# a fresh manager over the same data dir reloads the prefs-backed designation
|
|
reborn = SessionManager(
|
|
workspace=tmp_path, data_dir=mgr._data_base, provider=ScriptedProvider()
|
|
)
|
|
assert reborn.dm_session() == "sKeep"
|
|
|
|
|
|
def test_superagent_surface_is_gone(tmp_path):
|
|
mgr = SessionManager(workspace=tmp_path, provider=ScriptedProvider())
|
|
assert not hasattr(mgr, "superagent")
|
|
assert not hasattr(mgr, "sa_register")
|
|
client = TestClient(create_app(mgr))
|
|
# the retired routes 404
|
|
assert client.get("/v1/superagent").status_code == 404
|