refactor: use thin upstream transport adapter

This commit is contained in:
Mikhail Putilovskij 2026-04-22 01:25:11 +03:00
parent 569824ead1
commit 0c2884c2b1
8 changed files with 420 additions and 255 deletions

View file

@ -4,32 +4,55 @@ Smoke test: полный цикл через dispatcher + реальные manag
Имитирует что делает адаптер (Telegram или Matrix) при получении события.
"""
import pytest
from sdk.mock import MockPlatformClient
from sdk.interface import MessageChunk, MessageResponse
from sdk.prototype_state import PrototypeStateStore
from sdk.real import RealPlatformClient
from core.store import InMemoryStore
from core.chat import ChatManager
from lambda_agent_api.server import MsgEventTextChunk
from core.auth import AuthManager
from core.settings import SettingsManager
from core.chat import ChatManager
from core.handler import EventDispatcher
from core.handlers import register_all
from core.protocol import (
IncomingCommand, IncomingMessage, IncomingCallback,
OutgoingMessage, OutgoingUI,
Attachment, SettingsAction,
Attachment,
IncomingCallback,
IncomingCommand,
IncomingMessage,
OutgoingMessage,
OutgoingUI,
)
from core.settings import SettingsManager
from core.store import InMemoryStore
from sdk.mock import MockPlatformClient
from sdk.prototype_state import PrototypeStateStore
from sdk.real import RealPlatformClient
class FakeAgentApi:
def __init__(self) -> None:
def __init__(self, chat_id: str) -> None:
self.chat_id = chat_id
self.calls: list[tuple[str, list[str]]] = []
self.last_tokens_used = 0
self.connect_calls = 0
self.close_calls = 0
async def connect(self) -> None:
self.connect_calls += 1
async def close(self) -> None:
self.close_calls += 1
async def send_message(self, text: str, attachments: list[str] | None = None):
self.calls.append((text, attachments or []))
yield type("Chunk", (), {"text": f"[REAL] {text}"})()
self.last_tokens_used = 5
yield MsgEventTextChunk(text=f"[REAL] {text}")
class FakeAgentApiFactory:
def __init__(self) -> None:
self.created_chat_ids: list[str] = []
self.instances: dict[str, FakeAgentApi] = {}
def for_chat(self, chat_id: str) -> FakeAgentApi:
chat_api = FakeAgentApi(chat_id)
self.created_chat_ids.append(chat_id)
self.instances[chat_id] = chat_api
return chat_api
@pytest.fixture
@ -48,7 +71,7 @@ def dispatcher():
@pytest.fixture
def real_dispatcher():
agent_api = FakeAgentApi()
agent_api = FakeAgentApiFactory()
platform = RealPlatformClient(
agent_api=agent_api,
prototype_state=PrototypeStateStore(),
@ -80,7 +103,13 @@ async def test_new_chat_command(dispatcher):
start = IncomingCommand(user_id="u1", platform="matrix", chat_id="C1", command="start")
await dispatcher.dispatch(start)
new = IncomingCommand(user_id="u1", platform="matrix", chat_id="C2", command="new", args=["Анализ"])
new = IncomingCommand(
user_id="u1",
platform="matrix",
chat_id="C2",
command="new",
args=["Анализ"],
)
result = await dispatcher.dispatch(new)
assert any("Анализ" in r.text for r in result if isinstance(r, OutgoingMessage))
@ -130,7 +159,8 @@ async def test_full_flow_with_real_platform_uses_shared_agent_api(real_dispatche
texts = [r.text for r in result if isinstance(r, OutgoingMessage)]
assert texts == ["[REAL] Привет!"]
assert agent_api.calls == [("Привет!", [])]
assert agent_api.created_chat_ids == ["C1"]
assert agent_api.instances["C1"].calls == [("Привет!", [])]
async def test_full_flow_with_real_platform_forwards_workspace_attachment(real_dispatcher):
@ -155,6 +185,6 @@ async def test_full_flow_with_real_platform_forwards_workspace_attachment(real_d
)
await dispatcher.dispatch(msg)
assert agent_api.calls == [
assert agent_api.instances["C1"].calls == [
("Посмотри файл", ["surfaces/matrix/u1/room/inbox/report.pdf"])
]