""" conftest.py — Shared fixtures for MemPalace tests. Provides isolated palace and knowledge graph instances so tests never touch the user's real data or leak temp files on failure. """ import os import shutil import tempfile import chromadb import pytest from mempalace.config import MempalaceConfig from mempalace.knowledge_graph import KnowledgeGraph @pytest.fixture def tmp_dir(): """Create and auto-cleanup a temporary directory.""" d = tempfile.mkdtemp(prefix="mempalace_test_") yield d shutil.rmtree(d, ignore_errors=True) @pytest.fixture def palace_path(tmp_dir): """Path to an empty palace directory inside tmp_dir.""" p = os.path.join(tmp_dir, "palace") os.makedirs(p) return p @pytest.fixture def config(tmp_dir, palace_path): """A MempalaceConfig pointing at the temp palace.""" cfg_dir = os.path.join(tmp_dir, "config") os.makedirs(cfg_dir) import json with open(os.path.join(cfg_dir, "config.json"), "w") as f: json.dump({"palace_path": palace_path}, f) return MempalaceConfig(config_dir=cfg_dir) @pytest.fixture def collection(palace_path): """A ChromaDB collection pre-seeded in the temp palace.""" client = chromadb.PersistentClient(path=palace_path) col = client.get_or_create_collection("mempalace_drawers") return col @pytest.fixture def seeded_collection(collection): """Collection with a handful of representative drawers.""" collection.add( ids=[ "drawer_proj_backend_aaa", "drawer_proj_backend_bbb", "drawer_proj_frontend_ccc", "drawer_notes_planning_ddd", ], documents=[ "The authentication module uses JWT tokens for session management. " "Tokens expire after 24 hours. Refresh tokens are stored in HttpOnly cookies.", "Database migrations are handled by Alembic. We use PostgreSQL 15 " "with connection pooling via pgbouncer.", "The React frontend uses TanStack Query for server state management. " "All API calls go through a centralized fetch wrapper.", "Sprint planning: migrate auth to passkeys by Q3. " "Evaluate ChromaDB alternatives for vector search.", ], metadatas=[ {"wing": "project", "room": "backend", "source_file": "auth.py", "chunk_index": 0, "added_by": "miner", "filed_at": "2026-01-01T00:00:00"}, {"wing": "project", "room": "backend", "source_file": "db.py", "chunk_index": 0, "added_by": "miner", "filed_at": "2026-01-02T00:00:00"}, {"wing": "project", "room": "frontend", "source_file": "App.tsx", "chunk_index": 0, "added_by": "miner", "filed_at": "2026-01-03T00:00:00"}, {"wing": "notes", "room": "planning", "source_file": "sprint.md", "chunk_index": 0, "added_by": "miner", "filed_at": "2026-01-04T00:00:00"}, ], ) return collection @pytest.fixture def kg(tmp_dir): """An isolated KnowledgeGraph using a temp SQLite file.""" db_path = os.path.join(tmp_dir, "test_kg.sqlite3") return KnowledgeGraph(db_path=db_path) @pytest.fixture def seeded_kg(kg): """KnowledgeGraph pre-loaded with sample triples.""" kg.add_entity("Alice", entity_type="person") kg.add_entity("Max", entity_type="person") kg.add_entity("swimming", entity_type="activity") kg.add_entity("chess", entity_type="activity") kg.add_triple("Alice", "parent_of", "Max", valid_from="2015-04-01") kg.add_triple("Max", "does", "swimming", valid_from="2025-01-01") kg.add_triple("Max", "does", "chess", valid_from="2024-06-01") kg.add_triple("Alice", "works_at", "Acme Corp", valid_from="2020-01-01", valid_to="2024-12-31") kg.add_triple("Alice", "works_at", "NewCo", valid_from="2025-01-01") return kg