deerflow2/backend/tests/test_thread_memory_storage.py
2026-05-18 16:03:53 +08:00

72 lines
2.5 KiB
Python

from deerflow.agents.memory.thread_storage import SqliteThreadMemoryStorage
def _payload():
return {
"ownerId": None,
"profile": {"name": "A", "role": None, "expertise": [], "language": None, "context": None},
"preferences": {"tone": None, "verbosity": None, "codeStyle": None, "other": None},
"facts": [],
}
def test_sqlite_thread_memory_compare_and_swap(tmp_path):
storage = SqliteThreadMemoryStorage(str(tmp_path / "thread-memory.db"))
thread_id = "thread-1"
assert storage.save(thread_id, _payload(), expected_version=0) is True
loaded = storage.load(thread_id)
assert loaded is not None
assert loaded["memoryVersion"] == 0
# wrong expected version should fail
assert storage.save(thread_id, _payload(), expected_version=9) is False
# correct version should pass and increment
assert storage.save(thread_id, _payload(), expected_version=0) is True
loaded2 = storage.load(thread_id)
assert loaded2 is not None
assert loaded2["memoryVersion"] == 1
def test_sqlite_thread_memory_saves_markdown_payload(tmp_path):
db_path = tmp_path / "thread-memory.db"
storage = SqliteThreadMemoryStorage(str(db_path))
thread_id = "thread-md"
assert storage.save(thread_id, _payload(), expected_version=0) is True
with storage._lock:
row = storage._conn.execute("SELECT memory_md FROM thread_memory WHERE thread_id = ?", (thread_id,)).fetchone()
assert row is not None
assert isinstance(row[0], str)
assert "## Profile" in row[0]
assert "## Preferences" in row[0]
assert "## Facts" in row[0]
def test_sqlite_thread_memory_loads_legacy_json_row(tmp_path):
db_path = tmp_path / "legacy-thread-memory.db"
storage = SqliteThreadMemoryStorage(str(db_path))
thread_id = "thread-legacy"
with storage._lock:
storage._conn.execute(
"""
INSERT INTO thread_memory (thread_id, owner_id, memory_md, profile, preferences, facts, memory_version, last_updated)
VALUES (?, ?, '', ?, ?, ?, 0, datetime('now'))
""",
(
thread_id,
"owner-1",
'{"name":"Alice","role":null,"expertise":[],"language":null,"context":null}',
'{"tone":null,"verbosity":null,"codeStyle":null,"other":null}',
"[]",
),
)
storage._conn.commit()
loaded = storage.load(thread_id)
assert loaded is not None
assert loaded["ownerId"] == "owner-1"
assert loaded["profile"]["name"] == "Alice"