72 lines
2.5 KiB
Python
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"
|