mirror of
https://github.com/agentscope-ai/ReMe.git
synced 2026-09-05 08:06:15 +00:00
94 lines
3.9 KiB
Python
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())
|