88 lines
2.5 KiB
Python
88 lines
2.5 KiB
Python
"""Tests for optional-skills/devops/setup-wizard-generator (template integrity)."""
|
|
|
|
import re
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
import yaml
|
|
|
|
SKILL_DIR = (
|
|
Path(__file__).resolve().parents[2]
|
|
/ "optional-skills"
|
|
/ "devops"
|
|
/ "setup-wizard-generator"
|
|
)
|
|
SKILL_MD = SKILL_DIR / "SKILL.md"
|
|
TEMPLATE = SKILL_DIR / "templates" / "template.sh"
|
|
|
|
|
|
class TestFrontmatter:
|
|
def _fm(self):
|
|
text = SKILL_MD.read_text(encoding="utf-8")
|
|
m = re.match(r"^---\n(.*?)\n---\n", text, re.DOTALL)
|
|
assert m, "SKILL.md missing YAML frontmatter"
|
|
return yaml.safe_load(m.group(1))
|
|
|
|
def test_name_matches_directory(self):
|
|
assert self._fm()["name"] == "setup-wizard-generator"
|
|
|
|
def test_description_length(self):
|
|
assert len(self._fm()["description"]) <= 60
|
|
|
|
def test_license_and_platforms(self):
|
|
fm = self._fm()
|
|
assert fm["license"] == "MIT"
|
|
assert "linux" in fm["platforms"]
|
|
|
|
|
|
class TestTemplate:
|
|
def test_template_exists(self):
|
|
assert TEMPLATE.is_file()
|
|
|
|
def test_bash_syntax(self):
|
|
proc = subprocess.run(
|
|
["bash", "-n", str(TEMPLATE)], capture_output=True, text=True
|
|
)
|
|
assert proc.returncode == 0, proc.stderr
|
|
|
|
def test_stages_marker_present(self):
|
|
text = TEMPLATE.read_text(encoding="utf-8")
|
|
assert "STAGES" in text, "authoring marker missing"
|
|
|
|
def test_library_helpers_defined(self):
|
|
text = TEMPLATE.read_text(encoding="utf-8")
|
|
for helper in (
|
|
"stage()",
|
|
"say()",
|
|
"step()",
|
|
"open_url()",
|
|
"write_env()",
|
|
"set_secret()",
|
|
"finish()",
|
|
):
|
|
assert helper in text, f"missing library helper {helper}"
|
|
|
|
def test_ask_secret_defined(self):
|
|
# secret entry must exist (hidden input path)
|
|
assert "ask_secret" in TEMPLATE.read_text(encoding="utf-8")
|
|
|
|
def test_total_stages_variable(self):
|
|
assert re.search(
|
|
r"^TOTAL_STAGES=", TEMPLATE.read_text(encoding="utf-8"), re.MULTILINE
|
|
)
|
|
|
|
|
|
class TestSkillBody:
|
|
def test_references_template_path(self):
|
|
assert "templates/template.sh" in SKILL_MD.read_text(encoding="utf-8")
|
|
|
|
def test_no_upstream_harness_residue(self):
|
|
text = SKILL_MD.read_text(encoding="utf-8").lower()
|
|
for token in ("claude", "/wizard", "slash command"):
|
|
assert token not in text, f"upstream residue: {token}"
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(pytest.main([__file__, "-q"]))
|