feat: preserve isolated visitor agent runtime
This commit is contained in:
@@ -4,6 +4,7 @@ from unittest.mock import AsyncMock
|
||||
|
||||
import pytest
|
||||
|
||||
from app.core.contracts import AgentResult, CoreResult, RequestContext
|
||||
from app.service.memory_recall_service import MemoryRecallService
|
||||
from app.service.model_gateway import ModelGenerationService
|
||||
from app.worker.runtime import WorkerRuntime
|
||||
@@ -22,6 +23,40 @@ OUTBOX = {
|
||||
}
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_worker_restores_visitor_without_identity_repository_call() -> None:
|
||||
"""访客异步任务只能恢复最小公开上下文,不能查询正式身份库。"""
|
||||
runtime = WorkerRuntime.__new__(WorkerRuntime)
|
||||
runtime.resolve_identity = AsyncMock(side_effect=AssertionError("identity lookup is forbidden"))
|
||||
|
||||
context = await runtime.restore_context(
|
||||
actor_type="visitor", actor_id="visitor:test", trace_id="trace-test"
|
||||
)
|
||||
|
||||
assert context.roles == ("visitor",)
|
||||
assert context.permissions == ("agent:run",)
|
||||
assert context.data_scope == "public"
|
||||
runtime.resolve_identity.assert_not_awaited()
|
||||
|
||||
|
||||
def test_visitor_does_not_request_memory_extraction() -> None:
|
||||
"""访客消息即使包含偏好信号,也不能进入客户记忆抽取队列。"""
|
||||
context = RequestContext(
|
||||
user_id="visitor:test", trace_id="visitor-trace", roles=("visitor",),
|
||||
permissions=("agent:run",), data_scope="public",
|
||||
)
|
||||
result = AgentResult(run_id="visitor-run", result=CoreResult(text="公开答复"))
|
||||
|
||||
requested = WorkerRuntime.should_request_memory_extraction(
|
||||
context=context,
|
||||
message="我的风险偏好是稳健型",
|
||||
result=result,
|
||||
business_events=(),
|
||||
)
|
||||
|
||||
assert requested is False
|
||||
|
||||
|
||||
class FakeSession(AbstractAsyncContextManager["FakeSession"]):
|
||||
def __init__(self) -> None:
|
||||
self.scalar = AsyncMock(return_value="event-1")
|
||||
|
||||
Reference in New Issue
Block a user