← Files Marketing CouncilARCHIVED FILE
tests/test_submission_pack.py
3.95 KB · Oct 2, 2026 · 00:31 UTC
import json
import subprocess
import sys
import unittest
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
PACK = ROOT / "submission" / "submission-pack.json"
VALIDATOR = ROOT / "scripts" / "validate_submission_pack.py"
class SubmissionPackTests(unittest.TestCase):
def load(self):
self.assertTrue(PACK.is_file(), "submission/submission-pack.json must exist")
return json.loads(PACK.read_text(encoding="utf-8"))
def test_pack_is_skills_only_v1_5_and_truthful_about_portal_state(self):
pack = self.load()
self.assertEqual(pack["schema_version"], 1)
self.assertEqual(pack["artifact_use"], "SUBMISSION_DRAFT")
self.assertEqual(pack["pack_status"], "PARTIAL_MISSING_INPUT")
self.assertEqual(pack["submission_type"], "skills-only")
self.assertEqual(pack["plugin"]["version"], "1.5.0")
self.assertEqual(pack["plugin"]["skill_count"], 29)
self.assertEqual(pack["plugin"]["focused_skill_count"], 28)
self.assertFalse(pack["portal_state"]["submitted"])
self.assertFalse(pack["portal_state"]["reviewed"])
self.assertFalse(pack["portal_state"]["approved"])
self.assertFalse(pack["portal_state"]["published"])
def test_pack_has_exactly_five_positive_and_three_negative_evidence_cases(self):
pack = self.load()
cases = pack["review_cases"]
positive = [case for case in cases if case["kind"] == "positive"]
negative = [case for case in cases if case["kind"] == "negative"]
self.assertEqual(len(positive), 5)
self.assertEqual(len(negative), 3)
self.assertEqual(len(cases), 8)
for case in cases:
self.assertEqual(case["evidence_kind"], "PASSED_TEST_EVIDENCE")
self.assertTrue(case["prompt"])
self.assertTrue(case["expected_behavior"])
self.assertTrue(case["expected_result_shape"])
self.assertTrue(case["actual_result_summary"])
self.assertRegex(case["evidence_reference"], r"^tests/test_(skill|dynamic)_router\.py::test_")
def test_pack_does_not_hide_required_external_submission_gaps(self):
pack = self.load()
missing = set(pack["missing_required_inputs"])
self.assertEqual(
missing,
{
"verified_developer_identity",
"privacy_policy_url",
"terms_of_service_url",
"support_url",
"country_or_region_availability",
},
)
self.assertIn("public ChatGPT/Codex publication", pack["release_boundary"])
self.assertIn("not performed", pack["release_boundary"])
def test_repo_validator_accepts_current_submission_draft(self):
self.assertTrue(VALIDATOR.is_file(), "scripts/validate_submission_pack.py must exist")
result = subprocess.run(
[sys.executable, str(VALIDATOR), str(PACK), "--json"],
cwd=ROOT,
text=True,
capture_output=True,
)
self.assertEqual(result.returncode, 0, result.stdout + result.stderr)
payload = json.loads(result.stdout)
self.assertTrue(payload["ok"], payload)
self.assertEqual(payload["positive_cases"], 5)
self.assertEqual(payload["negative_cases"], 3)
self.assertEqual(payload["pack_status"], "PARTIAL_MISSING_INPUT")
def test_plugin_ci_has_named_submission_draft_gate(self):
workflow = (ROOT / ".github" / "workflows" / "plugin-ci.yml").read_text(encoding="utf-8")
self.assertIn("Validate submission draft", workflow)
self.assertIn("python scripts/validate_submission_pack.py submission/submission-pack.json --json", workflow)
def test_release_notes_include_late_router_and_symlink_hardening(self):
pack = self.load()
notes = pack["release_notes"]
self.assertIn("declared handoff", notes)
self.assertIn("symlink", notes)
self.assertIn("29", notes)
if __name__ == "__main__":
unittest.main()
SHA-256: 86a87db7c0176b1d7748e146ddcd53a2d1da0cb9c2400e6a4a95c18150d1a434