deerflow2/backend/tests/test_thread_memory_updater.py
MT-Mint 9f42024682 test(memory): 添加线程记忆更新器 JSON 修复测试
验证 update_memory 在模型返回包含未转义内部引号的 JSON
时能正确解析并保存用户偏好和事实数据。
2026-06-11 17:51:15 +08:00

85 lines
2.5 KiB
Python

from unittest.mock import patch
from deerflow.agents.memory.thread_updater import ThreadMemoryUpdater
def test_scrub_sensitive_tolerates_non_numeric_confidence():
updater = ThreadMemoryUpdater()
cleaned = updater._scrub_sensitive(
{
"user": {},
"history": {},
"facts": [
{"content": "Uses React", "category": "knowledge", "confidence": "high"},
{"content": "Uses TypeScript", "category": "knowledge", "confidence": None},
],
},
"thread-test",
)
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("偏好直接回答")