import pytest from backend.app.services.adaptive_rag_service import AdaptiveRAGService class _FakeContextCache: async def get_session_messages(self, *, tenant_id: int, session_id: int): if tenant_id == 1 and session_id == 1500000001: return [ {"role": "user", "content": "上一轮问题"}, {"role": "assistant", "content": "上一轮回答"}, ] return [] @staticmethod def messages_to_turns(messages): turns = [] q = None for row in messages: role = row.get("role") content = row.get("content") if role == "user": q = content continue if role == "assistant" and q: turns.append({"question": q, "answer": content}) q = None return turns def test_external_session_id_stable(): sid1 = AdaptiveRAGService._external_session_id_from_key("feishu:oc_xxx:ou_yyy") sid2 = AdaptiveRAGService._external_session_id_from_key("feishu:oc_xxx:ou_yyy") assert sid1 == sid2 assert sid1 is not None assert 1500000000 <= int(sid1) < 2000000000 @pytest.mark.asyncio async def test_load_recent_conversation_for_external_actor(): service = AdaptiveRAGService(db=None, tenant_id=1) # type: ignore[arg-type] service.context_cache = _FakeContextCache() # type: ignore[assignment] rows = await service._load_recent_conversation( asked_by=None, asked_via="feishu", project_id=None, session_id=None, external_session_id=1500000001, limit=10, ) assert rows == [{"question": "上一轮问题", "answer": "上一轮回答"}]