ReMe/tests/unit/test_graph_snapshot_step.py

94 lines
3.9 KiB
Python

"""Tests for the frontend-ready category-rooted digest graph snapshot."""
import asyncio
from reme.components.file_store import LocalFileStore
from reme.schema import FileFrontMatter, FileLink, FileNode, GraphSnapshot
from reme.steps.index.graph_snapshot import GraphSnapshotStep
def _node(
path: str,
links: list[tuple[str, str | None]] | None = None,
*,
name: str = "",
description: str = "",
) -> FileNode:
return FileNode(
path=path,
st_mtime=1.0,
links=[
FileLink(source_path=path, target_path=target, target_anchor=anchor) for target, anchor in (links or [])
],
front_matter=FileFrontMatter(name=name, description=description),
)
def test_graph_snapshot_returns_category_roots_digest_links_and_daily_leaves(tmp_path, monkeypatch):
"""The snapshot is rooted at digest categories and stops at indexed daily notes."""
monkeypatch.chdir(tmp_path)
async def run():
store = LocalFileStore(name="snapshot", embedding_store="")
await store.start()
try:
await store.file_graph.upsert_nodes(
[
_node(
"digest/wiki/alpha.md",
[
("digest/personal/beta.md", "intro"),
("daily/2026-08-05/event.md", None),
("daily/2026-08-05/missing.md", None),
("resource/ignored.md", None),
],
name="Alpha",
description="Root note",
),
_node("digest/personal/beta.md", [("digest/wiki/alpha.md", None)], name="Beta"),
_node("digest/procedure/how-to.md", name="How to"),
_node(
"daily/2026-08-05/event.md",
[("digest/procedure/how-to.md", None), ("daily/2026-08-05/hidden.md", None)],
name="Event",
),
_node("daily/2026-08-05/isolated.md", name="Isolated daily"),
_node("resource/ignored.md", name="Ignored resource"),
],
)
response = await GraphSnapshotStep(file_store=store)()
graph = GraphSnapshot.model_validate(response.answer)
assert response.success is True
assert response.metadata == {}
assert [node.id for node in graph.nodes[:3]] == [
"virtual:wiki",
"virtual:personal",
"virtual:procedure",
]
assert [node.path for node in graph.nodes[3:]] == [
"daily/2026-08-05/event.md",
"digest/personal/beta.md",
"digest/procedure/how-to.md",
"digest/wiki/alpha.md",
]
nodes = {node.id: node for node in graph.nodes}
assert nodes["virtual:wiki"].path == "digest/wiki"
assert nodes["virtual:procedure"].path == "digest/procedure"
assert nodes["virtual:wiki"].virtual is True
assert nodes["digest/wiki/alpha.md"].name == "Alpha"
assert nodes["digest/wiki/alpha.md"].description == "Root note"
assert nodes["digest/wiki/alpha.md"].virtual is False
assert {(edge.source, edge.target, edge.target_anchor) for edge in graph.edges} == {
("virtual:wiki", "digest/wiki/alpha.md", None),
("virtual:personal", "digest/personal/beta.md", None),
("virtual:procedure", "digest/procedure/how-to.md", None),
("digest/wiki/alpha.md", "digest/personal/beta.md", "intro"),
("digest/wiki/alpha.md", "daily/2026-08-05/event.md", None),
("digest/personal/beta.md", "digest/wiki/alpha.md", None),
}
finally:
await store.close()
asyncio.run(run())