- --check now detects orphaned/stale build artifacts in build-owned dirs (client canon/ + topics/ fully owned; client npcs/ shared with legacy hand-authored files, only npc.* ids are treated as build-owned) - resolve() enforces the schema rule that canon entities must be secrecy 0 - resolve() and ladder_rungs() guard against malformed value TYPES (non-int secrecy, non-list related/rungs) raising BuildError instead of crashing Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HuHRPE7VfppUJEaoGBEUqZ
74 lines
2.6 KiB
Python
74 lines
2.6 KiB
Python
import shutil
|
|
from pathlib import Path
|
|
|
|
from content_build.__main__ import main
|
|
|
|
FIXTURE_DIR = Path(__file__).parent / "fixtures" / "valid"
|
|
|
|
|
|
def _lore(tmp_path):
|
|
lore = tmp_path / "lore"
|
|
lore.mkdir()
|
|
shutil.copy(FIXTURE_DIR / "world.md", lore / "world.md")
|
|
return lore
|
|
|
|
|
|
def test_build_then_check_is_clean(tmp_path):
|
|
lore = _lore(tmp_path)
|
|
world, server = tmp_path / "world", tmp_path / "server"
|
|
argv = ["--lore", str(lore), "--world", str(world), "--server", str(server)]
|
|
assert main(argv) == 0
|
|
assert (world / "npcs" / "tess.json").exists()
|
|
assert (server / "topics" / "big-twist.json").exists()
|
|
# a fresh --check against just-written output is clean
|
|
assert main(argv + ["--check"]) == 0
|
|
|
|
|
|
def test_check_detects_stale(tmp_path):
|
|
lore = _lore(tmp_path)
|
|
world, server = tmp_path / "world", tmp_path / "server"
|
|
argv = ["--lore", str(lore), "--world", str(world), "--server", str(server)]
|
|
assert main(argv) == 0
|
|
# mutate a committed artifact -> --check must fail
|
|
(world / "canon" / "testburg.json").write_text('{"id": "town.testburg"}\n')
|
|
assert main(argv + ["--check"]) == 1
|
|
|
|
|
|
def test_check_detects_missing(tmp_path):
|
|
lore = _lore(tmp_path)
|
|
world, server = tmp_path / "world", tmp_path / "server"
|
|
argv = ["--lore", str(lore), "--world", str(world), "--server", str(server)]
|
|
assert main(argv) == 0
|
|
(world / "npcs" / "tess.json").unlink()
|
|
assert main(argv + ["--check"]) == 1
|
|
|
|
|
|
def test_invalid_bible_fails_build(tmp_path):
|
|
lore = tmp_path / "lore"
|
|
lore.mkdir()
|
|
(lore / "bad.md").write_text(
|
|
"```yaml\nid: town.a\ntype: town\nstatus: canon\nsecrecy: 0\n"
|
|
"related: [does.not-exist]\nbody: x\n```\n")
|
|
argv = ["--lore", str(lore), "--world", str(tmp_path / "w"),
|
|
"--server", str(tmp_path / "s")]
|
|
assert main(argv) == 1
|
|
|
|
|
|
def test_check_detects_orphan_file(tmp_path):
|
|
lore = _lore(tmp_path)
|
|
world, server = tmp_path / "world", tmp_path / "server"
|
|
argv = ["--lore", str(lore), "--world", str(world), "--server", str(server)]
|
|
assert main(argv) == 0
|
|
(world / "canon" / "ghost.json").write_text('{"id": "town.ghost"}\n')
|
|
assert main(argv + ["--check"]) == 1
|
|
|
|
|
|
def test_check_ignores_legacy_npc_files(tmp_path):
|
|
lore = _lore(tmp_path)
|
|
world, server = tmp_path / "world", tmp_path / "server"
|
|
argv = ["--lore", str(lore), "--world", str(world), "--server", str(server)]
|
|
assert main(argv) == 0
|
|
(world / "npcs").mkdir(parents=True, exist_ok=True)
|
|
(world / "npcs" / "legacy.json").write_text('{"id": "legacy"}\n') # bare id
|
|
assert main(argv + ["--check"]) == 0 # legacy file is not a build orphan
|