# tests/core/test_integration.py """ Smoke test: полный цикл через dispatcher + реальные managers + MockPlatformClient. Имитирует что делает адаптер (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 core.auth import AuthManager from core.settings import SettingsManager from core.handler import EventDispatcher from core.handlers import register_all from core.protocol import ( IncomingCommand, IncomingMessage, IncomingCallback, OutgoingMessage, OutgoingUI, Attachment, SettingsAction, ) class FakeAgentApi: def __init__(self) -> None: self.calls: list[str] = [] self.last_tokens_used = 0 async def send_message(self, text: str): self.calls.append(text) yield type("Chunk", (), {"text": f"[REAL] {text}"})() self.last_tokens_used = 5 @pytest.fixture def dispatcher(): platform = MockPlatformClient() store = InMemoryStore() d = EventDispatcher( platform=platform, chat_mgr=ChatManager(platform, store), auth_mgr=AuthManager(platform, store), settings_mgr=SettingsManager(platform, store), ) register_all(d) return d @pytest.fixture def real_dispatcher(): agent_api = FakeAgentApi() platform = RealPlatformClient( agent_api=agent_api, prototype_state=PrototypeStateStore(), platform="matrix", ) store = InMemoryStore() d = EventDispatcher( platform=platform, chat_mgr=ChatManager(platform, store), auth_mgr=AuthManager(platform, store), settings_mgr=SettingsManager(platform, store), ) register_all(d) return d, agent_api async def test_full_flow_start_then_message(dispatcher): start = IncomingCommand(user_id="tg_123", platform="telegram", chat_id="C1", command="start") result = await dispatcher.dispatch(start) assert any(isinstance(r, OutgoingMessage) for r in result) msg = IncomingMessage(user_id="tg_123", platform="telegram", chat_id="C1", text="Привет!") result = await dispatcher.dispatch(msg) texts = [r.text for r in result if isinstance(r, OutgoingMessage)] assert any("[MOCK]" in t for t in texts) 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=["Анализ"]) result = await dispatcher.dispatch(new) assert any("Анализ" in r.text for r in result if isinstance(r, OutgoingMessage)) async def test_settings_menu(dispatcher): start = IncomingCommand(user_id="u1", platform="telegram", chat_id="C1", command="start") await dispatcher.dispatch(start) s = IncomingCommand(user_id="u1", platform="telegram", chat_id="C1", command="settings") result = await dispatcher.dispatch(s) assert any(isinstance(r, OutgoingUI) for r in result) async def test_voice_message_fallback(dispatcher): start = IncomingCommand(user_id="u1", platform="telegram", chat_id="C1", command="start") await dispatcher.dispatch(start) voice = IncomingMessage( user_id="u1", platform="telegram", chat_id="C1", text="", attachments=[Attachment(type="audio")], ) result = await dispatcher.dispatch(voice) assert any("голосов" in r.text.lower() for r in result if isinstance(r, OutgoingMessage)) async def test_toggle_skill_callback(dispatcher): start = IncomingCommand(user_id="u1", platform="telegram", chat_id="C1", command="start") await dispatcher.dispatch(start) cb = IncomingCallback( user_id="u1", platform="telegram", chat_id="C1", action="toggle_skill", payload={"skill": "browser", "enabled": True}, ) result = await dispatcher.dispatch(cb) assert any("browser" in r.text for r in result if isinstance(r, OutgoingMessage)) async def test_full_flow_with_real_platform_uses_shared_agent_api(real_dispatcher): dispatcher, agent_api = real_dispatcher start = IncomingCommand(user_id="u1", platform="matrix", chat_id="C1", command="start") result = await dispatcher.dispatch(start) assert any(isinstance(r, OutgoingMessage) for r in result) msg = IncomingMessage(user_id="u1", platform="matrix", chat_id="C1", text="Привет!") result = await dispatcher.dispatch(msg) texts = [r.text for r in result if isinstance(r, OutgoingMessage)] assert texts == ["[REAL] Привет!"] assert agent_api.calls == ["Привет!"]