"""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)