82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
from __future__ import annotations
|
|
|
|
import importlib.util
|
|
from pathlib import Path
|
|
|
|
|
|
def _load_module():
|
|
script_path = Path(__file__).resolve().parents[1] / "scripts" / "validate_ouroboros_docs.py"
|
|
spec = importlib.util.spec_from_file_location("validate_ouroboros_docs", script_path)
|
|
assert spec is not None
|
|
assert spec.loader is not None
|
|
module = importlib.util.module_from_spec(spec)
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
def test_validate_plan_source_link_accepts_canonical_source_path() -> None:
|
|
module = _load_module()
|
|
errors: list[str] = []
|
|
path = Path("docs/ouroboros/README.md").resolve()
|
|
|
|
assert module.validate_plan_source_link(path, "./source/ouroboros_plan_v2.txt", errors) is False
|
|
assert module.validate_plan_source_link(path, "./source/ouroboros_plan_v3.txt", errors) is False
|
|
|
|
assert errors == []
|
|
|
|
|
|
def test_validate_plan_source_link_rejects_root_relative_path() -> None:
|
|
module = _load_module()
|
|
errors: list[str] = []
|
|
path = Path("docs/ouroboros/README.md").resolve()
|
|
|
|
handled = module.validate_plan_source_link(
|
|
path,
|
|
"/home/agentson/repos/The-Ouroboros/ouroboros_plan_v2.txt",
|
|
errors,
|
|
)
|
|
|
|
assert handled is True
|
|
assert errors
|
|
assert "invalid plan link path" in errors[0]
|
|
assert "use ./source/ouroboros_plan_v2.txt" in errors[0]
|
|
|
|
|
|
def test_validate_plan_source_link_rejects_repo_root_relative_path() -> None:
|
|
module = _load_module()
|
|
errors: list[str] = []
|
|
path = Path("docs/ouroboros/README.md").resolve()
|
|
|
|
handled = module.validate_plan_source_link(path, "../../ouroboros_plan_v2.txt", errors)
|
|
|
|
assert handled is True
|
|
assert errors
|
|
assert "invalid plan link path" in errors[0]
|
|
assert "must resolve to docs/ouroboros/source/ouroboros_plan_v2.txt" in errors[0]
|
|
|
|
|
|
def test_validate_plan_source_link_accepts_fragment_suffix() -> None:
|
|
module = _load_module()
|
|
errors: list[str] = []
|
|
path = Path("docs/ouroboros/README.md").resolve()
|
|
|
|
handled = module.validate_plan_source_link(path, "./source/ouroboros_plan_v2.txt#sec", errors)
|
|
|
|
assert handled is False
|
|
assert errors == []
|
|
|
|
|
|
def test_validate_links_avoids_duplicate_error_for_invalid_plan_link(tmp_path) -> None:
|
|
module = _load_module()
|
|
errors: list[str] = []
|
|
doc = tmp_path / "doc.md"
|
|
doc.write_text(
|
|
"[v2](/home/agentson/repos/The-Ouroboros/ouroboros_plan_v2.txt)\n",
|
|
encoding="utf-8",
|
|
)
|
|
|
|
module.validate_links(doc, doc.read_text(encoding="utf-8"), errors)
|
|
|
|
assert len(errors) == 1
|
|
assert "invalid plan link path" in errors[0]
|