Refactor MemorySystem to enhance Chroma vector store initialization with conflict handling and backup creation. Added methods for conflict detection and store repair, improving robustness against schema conflicts.
This commit is contained in:
78
tests/test_memory_chroma_recovery.py
Normal file
78
tests/test_memory_chroma_recovery.py
Normal file
@@ -0,0 +1,78 @@
|
||||
from pathlib import Path
|
||||
|
||||
import src.ai.memory as memory_module
|
||||
|
||||
|
||||
class _FakeJSONStore:
|
||||
def __init__(self, storage_path: Path):
|
||||
self.storage_path = storage_path
|
||||
|
||||
|
||||
def test_memory_retries_once_on_chroma_conflict(monkeypatch, tmp_path: Path):
|
||||
class _FlakyChroma:
|
||||
calls = 0
|
||||
|
||||
def __init__(self, persist_directory: Path):
|
||||
type(self).calls += 1
|
||||
self.persist_directory = persist_directory
|
||||
if type(self).calls == 1:
|
||||
raise RuntimeError("table embeddings already exists")
|
||||
|
||||
monkeypatch.setattr(memory_module, "ChromaVectorStore", _FlakyChroma)
|
||||
monkeypatch.setattr(memory_module, "JSONVectorStore", _FakeJSONStore)
|
||||
|
||||
memory = memory_module.MemorySystem(
|
||||
storage_path=tmp_path / "long_term_memory.json",
|
||||
use_vector_db=True,
|
||||
)
|
||||
|
||||
assert isinstance(memory.vector_store, _FlakyChroma)
|
||||
assert _FlakyChroma.calls == 2
|
||||
|
||||
|
||||
def test_memory_rebuilds_chroma_directory_when_conflict_persists(monkeypatch, tmp_path: Path):
|
||||
class _RecoverOnThirdTryChroma:
|
||||
calls = 0
|
||||
|
||||
def __init__(self, persist_directory: Path):
|
||||
type(self).calls += 1
|
||||
self.persist_directory = persist_directory
|
||||
if type(self).calls <= 2:
|
||||
raise RuntimeError("table embeddings already exists")
|
||||
|
||||
monkeypatch.setattr(memory_module, "ChromaVectorStore", _RecoverOnThirdTryChroma)
|
||||
monkeypatch.setattr(memory_module, "JSONVectorStore", _FakeJSONStore)
|
||||
|
||||
storage_root = tmp_path / "ai"
|
||||
chroma_dir = storage_root / "chroma_db"
|
||||
chroma_dir.mkdir(parents=True, exist_ok=True)
|
||||
(chroma_dir / "marker.txt").write_text("legacy-data", encoding="utf-8")
|
||||
|
||||
memory = memory_module.MemorySystem(
|
||||
storage_path=storage_root / "long_term_memory.json",
|
||||
use_vector_db=True,
|
||||
)
|
||||
|
||||
assert isinstance(memory.vector_store, _RecoverOnThirdTryChroma)
|
||||
assert _RecoverOnThirdTryChroma.calls == 3
|
||||
|
||||
backups = sorted(storage_root.glob("chroma_db_backup_conflict_*"))
|
||||
assert backups, "expected backup directory after repair"
|
||||
assert (backups[-1] / "marker.txt").exists()
|
||||
assert chroma_dir.exists()
|
||||
|
||||
|
||||
def test_memory_falls_back_to_json_if_chroma_repair_fails(monkeypatch, tmp_path: Path):
|
||||
class _AlwaysFailChroma:
|
||||
def __init__(self, persist_directory: Path):
|
||||
raise RuntimeError("table embeddings already exists")
|
||||
|
||||
monkeypatch.setattr(memory_module, "ChromaVectorStore", _AlwaysFailChroma)
|
||||
monkeypatch.setattr(memory_module, "JSONVectorStore", _FakeJSONStore)
|
||||
|
||||
memory = memory_module.MemorySystem(
|
||||
storage_path=tmp_path / "long_term_memory.json",
|
||||
use_vector_db=True,
|
||||
)
|
||||
|
||||
assert isinstance(memory.vector_store, _FakeJSONStore)
|
||||
Reference in New Issue
Block a user