"""作业 2 验收测试:LangGraph 后端适配器。 通过标准(对应迁移计划作业 2): - ``complete()`` 返回带 ``1002`` 前缀的 ``ChatResult``, API 层据此解析阶段码; - ``stream()`` 先产出含完整 state 前缀的 ``TextDelta``,再产出正文, 保证 ``stage_code`` 事件先于正文; - 会话通过 ``thread_id = session_id`` 绑定(图 checkpoint 语义)。 注意:``src/backends/langgraph.py`` 中的 TODO 完成前, 本文件的测试会失败,属于预期状态。 """ import pytest from src.backends.chat import ChatInput, TextDelta from src.backends.langgraph import LangGraphBackend def make_input() -> ChatInput: return ChatInput( session_id="session-001", text="发生了交通事故", client_mode="direct", ) @pytest.mark.asyncio async def test_complete_returns_state_prefixed_result() -> None: backend = LangGraphBackend() result = await backend.complete(make_input()) assert result.content.startswith("1002") assert "发生了交通事故" in result.content @pytest.mark.asyncio async def test_stream_emits_prefix_before_body() -> None: backend = LangGraphBackend() events = [event async for event in backend.stream(make_input())] assert events, "stream 至少应产生一个 TextDelta" assert all(isinstance(event, TextDelta) for event in events) joined = "".join(event.text for event in events) assert joined.startswith("1002") assert "发生了交通事故" in joined @pytest.mark.asyncio async def test_sessions_are_isolated_by_thread_id() -> None: backend = LangGraphBackend() first = await backend.complete(make_input()) second = await backend.complete(make_input()) other = await backend.complete( ChatInput(session_id="session-002", text="你好", client_mode="direct") ) assert first.content != "" and second.content != "" assert "你好" in other.content