import json from pathlib import Path from sqlalchemy import create_engine from app.db import Base, create_session_factory from app.models.memory import MemoryEdge, MemoryGraph, MemoryNode from app.services.memory_tools import LocalMemoryTools FIXTURE = json.loads( Path(__file__).with_name("fixtures").joinpath("memory_parity", "entity_reader_fixture.json").read_text() ) def test_local_memory_tools_quick_search_matches_golden_shape(): engine = create_engine("sqlite+pysqlite:///:memory:") Base.metadata.create_all(engine) try: with create_session_factory(engine)() as session: session.add(MemoryGraph(id="graph-fixture", organization_id="org-a", project_id="project-a")) session.add_all([MemoryNode(graph_id="graph-fixture", **node) for node in FIXTURE["nodes"]]) session.add_all([MemoryEdge(graph_id="graph-fixture", **edge) for edge in FIXTURE["edges"]]) session.commit() tools = LocalMemoryTools(session, organization_id="org-a", graph_id="graph-fixture") result = tools.quick_search("Alice", limit=10) assert result.query == "Alice" assert result.total_count == 1 assert result.facts == ["Alice works for Acme."] assert result.edges[0]["name"] == "WORKS_FOR" assert result.nodes == [] both = tools.search_graph("Acme", limit=10, scope="both") assert both.total_count == 2 assert any(node["name"] == "Acme" for node in both.nodes) assert any(edge["fact"] == "Alice works for Acme." for edge in both.edges) finally: engine.dispose()