generated from coulomb/repo-seed
Versioned ShardAdapter ABC (shard_id/profile/keys/read mandatory; optional verbs raise NotSupported by default = honest absence). FolderAdapter reads a dir of Markdown into Pages (relpath=key, mtime=source_rev, provenance envelope), declaring a validated read-only file-store profile. 4 tests green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
"""Tests for the FolderAdapter (SHARD-WP-0007 T3)."""
|
|
|
|
import pytest
|
|
|
|
from shard_wiki.adapters import FolderAdapter
|
|
from shard_wiki.model import Identity, NotSupported, Verb
|
|
|
|
|
|
def _make_shard(tmp_path, files: dict[str, str]) -> FolderAdapter:
|
|
for rel, text in files.items():
|
|
p = tmp_path / rel
|
|
p.parent.mkdir(parents=True, exist_ok=True)
|
|
p.write_text(text, encoding="utf-8")
|
|
return FolderAdapter("shardA", tmp_path)
|
|
|
|
|
|
def test_keys_and_read(tmp_path):
|
|
shard = _make_shard(tmp_path, {"Home.md": "# Home", "sub/Topic.md": "topic body"})
|
|
assert set(shard.keys()) == {"Home", "sub/Topic"}
|
|
page = shard.read("sub/Topic")
|
|
assert page.identity == Identity("shardA", "sub/Topic")
|
|
assert page.body == "topic body"
|
|
assert page.envelope.source_shard == "shardA"
|
|
assert page.envelope.source_rev is not None # mtime stamp
|
|
assert page.placements[0].path == "sub/Topic.md"
|
|
|
|
|
|
def test_read_missing_raises_keyerror(tmp_path):
|
|
shard = _make_shard(tmp_path, {"Home.md": "x"})
|
|
with pytest.raises(KeyError):
|
|
shard.read("Nope")
|
|
|
|
|
|
def test_profile_is_valid_and_read_only(tmp_path):
|
|
shard = _make_shard(tmp_path, {"Home.md": "x"})
|
|
prof = shard.profile() # .validate() already called inside
|
|
assert prof.supports(Verb.READ)
|
|
assert not prof.supports(Verb.WRITE)
|
|
|
|
|
|
def test_unsupported_write_is_honest(tmp_path):
|
|
shard = _make_shard(tmp_path, {"Home.md": "x"})
|
|
with pytest.raises(NotSupported):
|
|
shard.write("Home", "new")
|