generated from coulomb/repo-seed
engine/ package: EngineKernel (in-process page store with per-page version history; create/edit-as-version, recoverable delete-tombstone, keys, current_rev) + wikilink extraction + in-shard link resolution / red-link detection (EC-1..EC-4). Reuses model/provenance; git-IS-store backing slots in later. 6 tests green, pyflakes clean, full suite green. Marks T1 done. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
"""Tests for the engine kernel (SHARD-WP-0014 T1)."""
|
|
|
|
import pytest
|
|
|
|
from shard_wiki.engine import EngineKernel, extract_wikilinks
|
|
from shard_wiki.model import Identity
|
|
|
|
|
|
def test_write_creates_then_edits_as_history():
|
|
k = EngineKernel("eng")
|
|
p1 = k.write("Home", "first")
|
|
assert p1.identity == Identity("eng", "Home")
|
|
assert p1.envelope.source_rev == "1"
|
|
p2 = k.write("Home", "second")
|
|
assert p2.envelope.source_rev == "2"
|
|
assert k.read("Home").body == "second" # latest
|
|
assert [v.body for v in k.history("Home")] == ["first", "second"] # recoverable history
|
|
|
|
|
|
def test_read_missing_raises():
|
|
k = EngineKernel("eng")
|
|
with pytest.raises(KeyError):
|
|
k.read("Nope")
|
|
|
|
|
|
def test_delete_is_recoverable():
|
|
k = EngineKernel("eng")
|
|
k.write("Doc", "v1")
|
|
k.delete("Doc")
|
|
assert not k.exists("Doc")
|
|
with pytest.raises(KeyError):
|
|
k.read("Doc")
|
|
assert [v.body for v in k.history("Doc")] == ["v1"] # history retained
|
|
k.write("Doc", "v2") # restore by writing
|
|
assert k.exists("Doc") and k.read("Doc").body == "v2"
|
|
|
|
|
|
def test_keys_and_current_rev():
|
|
k = EngineKernel("eng")
|
|
k.write("A", "a")
|
|
k.write("B", "b")
|
|
k.write("A", "a2")
|
|
assert set(k.keys()) == {"A", "B"}
|
|
assert k.current_rev("A") == "2"
|
|
assert k.current_rev("Missing") is None
|
|
|
|
|
|
def test_links_and_red_link_resolution():
|
|
k = EngineKernel("eng")
|
|
k.write("Home", "see [[Target]] and [[Other|labelled]] and [[Target]] again")
|
|
k.write("Target", "exists")
|
|
assert k.links("Home") == ["Target", "Other"] # ordered, de-duped, label dropped
|
|
assert k.resolve_link("Target") == Identity("eng", "Target")
|
|
assert k.resolve_link("Other") is None # red-link (not yet created)
|
|
|
|
|
|
def test_extract_wikilinks_helper():
|
|
assert extract_wikilinks("none here") == []
|
|
assert extract_wikilinks("[[A]] [[B|x]] [[A]]") == ["A", "B"]
|