test(memory): 添加线程记忆更新器 JSON 修复测试

验证 update_memory 在模型返回包含未转义内部引号的 JSON
时能正确解析并保存用户偏好和事实数据。
This commit is contained in:
肖应宇 2026-06-11 17:47:15 +08:00
parent 252cd71fe0
commit a1eff2fa12

View File

@ -1,3 +1,5 @@
from unittest.mock import patch
from deerflow.agents.memory.thread_updater import ThreadMemoryUpdater
@ -18,3 +20,65 @@ def test_scrub_sensitive_tolerates_non_numeric_confidence():
assert len(cleaned["facts"]) == 2
assert cleaned["facts"][0]["confidence"] == 0.5
assert cleaned["facts"][1]["confidence"] == 0.5
def test_update_memory_repairs_model_json_with_unescaped_inner_quotes():
class _Storage:
def __init__(self):
self.saved = None
def load(self, _thread_id):
return None
def save(self, _thread_id, data, expected_version=None):
self.saved = {
"thread_id": _thread_id,
"data": data,
"expected_version": expected_version,
}
return True
fake_storage = _Storage()
fake_model = type(
"M",
(),
{
"invoke": lambda self, prompt: type(
"R",
(),
{
"content": """
{
"user": {
"topOfMind": {
"summary": "反感“作为 AI"这种句式认为回答不用寒暄直接说重点",
"updatedAt": "2026-06-11T07:13:11Z"
}
},
"history": {},
"facts": [
{
"content": "偏好直接回答,不喜欢“作为 AI"式开场",
"category": "preference",
"confidence": 0.92
}
]
}
""".strip()
},
)()
},
)()
messages = [type("Msg", (), {"type": "human", "content": "请直接回答重点,不要寒暄。"})()]
with (
patch("deerflow.agents.memory.thread_updater.get_thread_memory_storage", return_value=fake_storage),
patch.object(ThreadMemoryUpdater, "_get_model", return_value=fake_model),
):
result = ThreadMemoryUpdater().update_memory(messages, "thread-test")
assert result is True
assert fake_storage.saved is not None
assert fake_storage.saved["expected_version"] == 0
assert fake_storage.saved["data"]["user"]["topOfMind"]["summary"].startswith("反感“作为 AI")
assert fake_storage.saved["data"]["facts"][0]["content"].startswith("偏好直接回答")