Files
OpenOPC/tests/test_canonical_memory.py
T
2026-07-01 17:56:31 +08:00

89 lines
4.3 KiB
Python

from __future__ import annotations
import tempfile
import unittest
from pathlib import Path
from opc.layer5_memory.markdown_memory import MarkdownMemoryStore
from opc.layer5_memory.memory_manager import MemoryManager
class CanonicalMemoryTests(unittest.TestCase):
def test_save_and_append_use_canonical_markdown_paths(self) -> None:
with tempfile.TemporaryDirectory() as tmpdir:
root = Path(tmpdir)
memory = MemoryManager(root, "proj1")
memory.save_memory("# Global\n- global preference", project=False)
memory.save_memory("# Project\n- project preference", project=True)
memory.append_memory("- appended project fact", project=True)
global_path = root / "memory" / "global.md"
project_path = root / "memory" / "projects" / "proj1.md"
legacy_project_path = root / "projects" / "proj1" / "MEMORY.md"
self.assertTrue(global_path.exists())
self.assertTrue(project_path.exists())
self.assertFalse(legacy_project_path.exists())
self.assertIn("global preference", global_path.read_text(encoding="utf-8"))
project_text = project_path.read_text(encoding="utf-8")
self.assertIn("project preference", project_text)
self.assertIn("appended project fact", project_text)
self.assertNotIn("OPC_STRUCTURED_MEMORY", project_text)
def test_legacy_visible_markdown_migrates_and_hidden_files_are_deleted(self) -> None:
with tempfile.TemporaryDirectory() as tmpdir:
root = Path(tmpdir)
global_legacy = root / "memory" / "MEMORY.md"
project_root = root / "projects" / "proj1"
project_legacy = project_root / "MEMORY.md"
global_legacy.parent.mkdir(parents=True, exist_ok=True)
project_root.mkdir(parents=True, exist_ok=True)
hidden = (
"<!-- OPC_STRUCTURED_MEMORY:BEGIN -->\n"
"```yaml\npreferred_language: Chinese\n```\n"
"<!-- OPC_STRUCTURED_MEMORY:END -->\n"
)
global_legacy.write_text("# Old Global\n- visible global\n\n" + hidden, encoding="utf-8")
project_legacy.write_text("# Old Project\n- visible project\n\n" + hidden, encoding="utf-8")
(root / "memory" / "HISTORY.md").write_text("old history", encoding="utf-8")
(project_root / "HISTORY.md").write_text("old project history", encoding="utf-8")
(project_root / "project_profile.yaml").write_text("legacy: true\n", encoding="utf-8")
(project_root / "secretary_profile.yaml").write_text("legacy: true\n", encoding="utf-8")
profiles_dir = root / "profiles"
profiles_dir.mkdir()
(profiles_dir / "profile.yaml").write_text("legacy: true\n", encoding="utf-8")
store = MarkdownMemoryStore(root)
global_text = store.load_visible_text()
project_text = store.load_visible_text("proj1")
self.assertIn("visible global", global_text)
self.assertIn("visible project", project_text)
self.assertNotIn("OPC_STRUCTURED_MEMORY", global_text)
self.assertNotIn("preferred_language", project_text)
self.assertFalse(global_legacy.exists())
self.assertFalse(project_legacy.exists())
self.assertFalse((root / "memory" / "HISTORY.md").exists())
self.assertFalse((project_root / "HISTORY.md").exists())
self.assertFalse((project_root / "project_profile.yaml").exists())
self.assertFalse((project_root / "secretary_profile.yaml").exists())
self.assertFalse(profiles_dir.exists())
def test_project_memory_is_namespaced_by_project_id(self) -> None:
with tempfile.TemporaryDirectory() as tmpdir:
root = Path(tmpdir)
one = MemoryManager(root, "proj1")
two = MemoryManager(root, "proj2")
one.save_memory("- proj1 only", project=True)
two.save_memory("- proj2 only", project=True)
self.assertIn("proj1 only", one.load_project_memory_markdown("proj1"))
self.assertNotIn("proj2 only", one.load_project_memory_markdown("proj1"))
self.assertIn("proj2 only", two.load_project_memory_markdown("proj2"))
if __name__ == "__main__":
unittest.main()