generated from coulomb/repo-seed
AllPages enumerates the union's distinct pages, collapsing chorus (same key across shards) and equivalence-bound identities into one entry via union-find, noting divergence when members' bodies differ (collapse acknowledged, not silent). SiteMap builds the namespace tree from page placements, spanning shards. Both derived/recomputable and presentation-free. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
77 lines
2.8 KiB
Python
77 lines
2.8 KiB
Python
"""Tests for the AllPages + SiteMap enumeration views (SHARD-WP-0010 T4)."""
|
|
|
|
from shard_wiki.adapters import FolderAdapter
|
|
from shard_wiki.coordination import DecisionLog, EventType
|
|
from shard_wiki.model import Identity
|
|
from shard_wiki.union import UnionGraph
|
|
from shard_wiki.views import all_pages, site_map
|
|
|
|
|
|
def _shard(tmp_path, name, files):
|
|
root = tmp_path / name
|
|
for rel, text in files.items():
|
|
p = root / rel
|
|
p.parent.mkdir(parents=True, exist_ok=True)
|
|
p.write_text(text, encoding="utf-8")
|
|
return FolderAdapter(name, root)
|
|
|
|
|
|
def test_all_pages_spans_shards(tmp_path):
|
|
u = UnionGraph("space")
|
|
u.attach(_shard(tmp_path, "shardA", {"A.md": "a"}))
|
|
u.attach(_shard(tmp_path, "shardB", {"B.md": "b"}))
|
|
names = {e.name for e in all_pages(u)}
|
|
assert names == {"A", "B"}
|
|
|
|
|
|
def test_chorus_collapses_to_one_entry_with_divergence(tmp_path):
|
|
u = UnionGraph("space")
|
|
u.attach(_shard(tmp_path, "shardA", {"Home.md": "A home"}))
|
|
u.attach(_shard(tmp_path, "shardB", {"Home.md": "B home"}))
|
|
entries = all_pages(u)
|
|
home = [e for e in entries if e.name == "Home"]
|
|
assert len(home) == 1 # chorus → single entry
|
|
assert set(home[0].members) == {Identity("shardA", "Home"), Identity("shardB", "Home")}
|
|
assert home[0].diverges is True # bodies differ — collapse acknowledged, not silent
|
|
|
|
|
|
def test_chorus_same_body_does_not_diverge(tmp_path):
|
|
u = UnionGraph("space")
|
|
u.attach(_shard(tmp_path, "shardA", {"Home.md": "same"}))
|
|
u.attach(_shard(tmp_path, "shardB", {"Home.md": "same"}))
|
|
(home,) = [e for e in all_pages(u) if e.name == "Home"]
|
|
assert home.diverges is False
|
|
|
|
|
|
def test_equivalence_binding_collapses_distinct_keys(tmp_path):
|
|
log = DecisionLog()
|
|
log.append(
|
|
"space", EventType.BINDING_MADE, {"members": ["shardA:Foo", "shardB:Bar"]}
|
|
)
|
|
u = UnionGraph("space", log=log)
|
|
u.attach(_shard(tmp_path, "shardA", {"Foo.md": "x"}))
|
|
u.attach(_shard(tmp_path, "shardB", {"Bar.md": "x"}))
|
|
pair = {Identity("shardA", "Foo"), Identity("shardB", "Bar")}
|
|
# The two bound identities fold into one entry (named by the min key, "Bar").
|
|
bound = [e for e in all_pages(u) if {*e.members} == pair]
|
|
assert len(bound) == 1
|
|
assert bound[0].name == "Bar"
|
|
|
|
|
|
def test_sitemap_reflects_namespace_paths(tmp_path):
|
|
u = UnionGraph("space")
|
|
u.attach(
|
|
_shard(
|
|
tmp_path,
|
|
"shardA",
|
|
{"Home.md": "h", "docs/Guide.md": "g", "docs/api/Ref.md": "r"},
|
|
)
|
|
)
|
|
root = site_map(u)
|
|
# Top level: "Home" page directly, and a "docs" namespace.
|
|
assert any(p.key == "Home" for p in root.pages)
|
|
docs = next(c for c in root.children if c.name == "docs")
|
|
assert any(p.key == "docs/Guide" for p in docs.pages)
|
|
api = next(c for c in docs.children if c.name == "api")
|
|
assert any(p.key == "docs/api/Ref" for p in api.pages)
|