103 lines
3.3 KiB
Python
103 lines
3.3 KiB
Python
import importlib.util
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[3]
|
|
TOOLS_SCRIPTS_DIR = REPO_ROOT / "tools" / "scripts"
|
|
if str(TOOLS_SCRIPTS_DIR) not in sys.path:
|
|
sys.path.insert(0, str(TOOLS_SCRIPTS_DIR))
|
|
|
|
|
|
def load_module(relative_path: str, module_name: str):
|
|
module_path = REPO_ROOT / relative_path
|
|
spec = importlib.util.spec_from_file_location(module_name, module_path)
|
|
module = importlib.util.module_from_spec(spec)
|
|
assert spec.loader is not None
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
validate_skills = load_module("tools/scripts/validate_skills.py", "validate_skills_source_metadata")
|
|
|
|
|
|
class SkillSourceMetadataTests(unittest.TestCase):
|
|
def _write_skill(self, skills_dir: Path, name: str, frontmatter_lines: list[str]) -> None:
|
|
skill_dir = skills_dir / name
|
|
skill_dir.mkdir(parents=True)
|
|
content = "\n".join(
|
|
[
|
|
"---",
|
|
*frontmatter_lines,
|
|
"---",
|
|
"",
|
|
"# Demo",
|
|
"",
|
|
"## When to Use",
|
|
"- Test scenario",
|
|
]
|
|
)
|
|
(skill_dir / "SKILL.md").write_text(content, encoding="utf-8")
|
|
|
|
def test_valid_source_repo_and_source_type_pass(self):
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
skills_dir = Path(temp_dir) / "skills"
|
|
self._write_skill(
|
|
skills_dir,
|
|
"demo",
|
|
[
|
|
"name: demo",
|
|
"description: ok",
|
|
"risk: safe",
|
|
"source: community",
|
|
"source_repo: openai/skills",
|
|
"source_type: official",
|
|
],
|
|
)
|
|
|
|
results = validate_skills.collect_validation_results(str(skills_dir))
|
|
self.assertEqual(results["errors"], [])
|
|
|
|
def test_invalid_source_repo_fails_validation(self):
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
skills_dir = Path(temp_dir) / "skills"
|
|
self._write_skill(
|
|
skills_dir,
|
|
"demo",
|
|
[
|
|
"name: demo",
|
|
"description: ok",
|
|
"risk: safe",
|
|
"source: community",
|
|
"source_repo: not-a-repo",
|
|
],
|
|
)
|
|
|
|
results = validate_skills.collect_validation_results(str(skills_dir))
|
|
self.assertTrue(any("Invalid 'source_repo' format" in error for error in results["errors"]))
|
|
|
|
def test_invalid_source_type_is_rejected(self):
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
skills_dir = Path(temp_dir) / "skills"
|
|
self._write_skill(
|
|
skills_dir,
|
|
"demo",
|
|
[
|
|
"name: demo",
|
|
"description: ok",
|
|
"risk: safe",
|
|
"source: community",
|
|
"source_repo: openai/skills",
|
|
"source_type: partner",
|
|
],
|
|
)
|
|
|
|
results = validate_skills.collect_validation_results(str(skills_dir))
|
|
self.assertTrue(any("Invalid 'source_type' value" in error for error in results["errors"]))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|