← Files Plugin AutopilotARCHIVED FILE

tests/test_workflows.py

3.36 KB · Oct 2, 2026 · 00:33 UTC

↓ Download file

import re
import unittest
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
CI = ROOT / ".github/workflows/ci.yml"
RELEASE = ROOT / ".github/workflows/release.yml"
ANTI_SLOP = ROOT / ".github/workflows/anti-slop.yml"

class WorkflowTests(unittest.TestCase):
    def test_ci_runs_full_self_hosting_gate_with_pinned_actions(self):
        text = CI.read_text(encoding="utf-8")
        self.assertIn("python3 -m unittest discover -s tests -v", text)
        self.assertIn("python3 scripts/self_check.py", text)
        self.assertIn(
            "python3 skills/chatgpt-codex-plugin-autopilot/scripts/build_directory_pack.py . --listing submission/listing.json --json",
            text,
        )
        self.assertIn("python3 scripts/build_release.py --out-dir dist", text)
        self.assertRegex(text, r"actions/checkout@[0-9a-f]{40}")
        self.assertRegex(text, r"actions/upload-artifact@[0-9a-f]{40}")
        self.assertIn("contents: read", text)
        self.assertIn("cd dist && sha256sum -c SHA256SUMS", text)
        self.assertIn("uses: paladini/harness-score@v1.6.5", text)
        self.assertNotRegex(text, r"(?i)npm\s+publish|twine\s+upload")

    def test_release_is_tag_only_and_attaches_verified_plugin_assets(self):
        text = RELEASE.read_text(encoding="utf-8")
        self.assertIn('tags:', text)
        self.assertIn('- "v*"', text)
        self.assertIn("contents: write", text)
        self.assertIn("python3 -m unittest discover -s tests -v", text)
        self.assertIn("python3 scripts/self_check.py", text)
        self.assertGreaterEqual(text.count("scripts/build_release.py"), 2)
        self.assertIn("cmp", text)
        self.assertIn("gh release create", text)
        self.assertIn("SHA256SUMS", text)
        self.assertIn("submission/reviewer-packet.json", text)
        self.assertIn("(cd dist-a && sha256sum -c SHA256SUMS)", text)
        self.assertRegex(text, r"actions/checkout@[0-9a-f]{40}")
        self.assertNotRegex(text, r"(?i)npm\s+publish|twine\s+upload")

    def test_obsolete_version_specific_release_workflow_retired(self):
        self.assertFalse((ROOT / ".github/workflows/publish-v0.3.0.yml").exists())

    def test_release_enforces_least_privilege_and_provenance(self):
        text = RELEASE.read_text(encoding="utf-8")
        self.assertIn("permissions: {}", text)
        self.assertIn("verify:", text)
        self.assertIn("publish:", text)
        self.assertIn("needs: verify", text)
        self.assertIn("git merge-base --is-ancestor \"$GITHUB_SHA\" origin/main", text)
        self.assertIn(
            "python3 skills/chatgpt-codex-plugin-autopilot/scripts/build_directory_pack.py . --listing submission/listing.json --json",
            text,
        )
        self.assertRegex(text, r"actions/upload-artifact@[0-9a-f]{40}")
        self.assertRegex(text, r"actions/download-artifact@[0-9a-f]{40}")
        self.assertIn("gh release download \"$GITHUB_REF_NAME\" --repo \"$GITHUB_REPOSITORY\" --dir dist-download", text)

    def test_anti_slop_workflow_configured_safely(self):
        self.assertTrue(ANTI_SLOP.exists())
        text = ANTI_SLOP.read_text(encoding="utf-8")
        self.assertIn("pull_request_target:", text)
        self.assertIn("pull-requests: write", text)
        self.assertIn("uses: peakoss/anti-slop@v0.3.0", text)
        self.assertIn("max-failures: 4", text)


if __name__ == "__main__":
    unittest.main()

SHA-256: 31cd3a35b1e639dc152248c3fc230c1d458feb02366d206f02fc1de9955b759d