Ctrl K
ComunidadGuías…

scripts/test-ci-qa-secrets.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/usr/bin/env python3
"""Check Secrets QA reporting and build gates without launching services."""

import importlib.util
import json
from pathlib import Path
import tempfile
import unittest
from unittest.mock import patch

spec = importlib.util.spec_from_file_location("qa_secrets", Path(__file__).with_name("ci-qa-secrets.py"))
qa = importlib.util.module_from_spec(spec)
spec.loader.exec_module(qa)


class SecretsQaTests(unittest.TestCase):
    def run_qa(self, failed_stage=None, missing_case=None):
        with tempfile.TemporaryDirectory() as directory:
            root = Path(directory)
            results = root / "report"
            calls = []

            def run(name, command, output, env):
                calls.append(name)
                if name in ("secrets-ui", "secrets-live"):
                    numbers = range(1, 9) if name == "secrets-ui" else range(9, 15)
                    specs = [{"title": f"SEC{number}: fixture", "tests": [{"results": [{"status": "passed"}]}]} for number in numbers if number != missing_case]
                    report = root / f"firecrab-e2e/test-results/{name}/results.json"
                    report.parent.mkdir(parents=True, exist_ok=True)
                    report.write_text(json.dumps({"suites": [{"suites": [{"specs": specs}]}]}))
                return {"name": name, "status": "FAILED" if name == failed_stage else "PASS", "exitCode": int(name == failed_stage)}

            with patch.object(qa, "ROOT", root), patch.object(qa, "git", return_value="fixture-revision"), patch.object(qa, "run_stage", side_effect=run), patch.object(qa.sys, "platform", "linux"), patch.object(qa.sys, "argv", ["ci-qa-secrets.py", "--results-dir", str(results)]):
                code = qa.main()
            return code, json.loads((results / "summary.json").read_text()), calls

    def test_manual_account_warnings_do_not_fail_automated_coverage(self):
        code, report, _ = self.run_qa()
        self.assertEqual(code, 0)
        self.assertEqual([report["cases"][f"SEC{number}"]["status"] for number in range(1, 15)], ["PASS"] * 14)
        self.assertNotIn("SEC15", report["cases"])
        self.assertEqual(report["cases"]["SEC16"]["status"], "WARNING")

    def test_failure_still_runs_later_checks_and_returns_nonzero(self):
        code, report, calls = self.run_qa(failed_stage="secrets-ui")
        self.assertEqual(code, 1)
        self.assertIn("secrets-live", calls)
        self.assertEqual(report["exitCode"], 1)

    def test_missing_browser_case_is_not_a_pass(self):
        code, report, _ = self.run_qa(missing_case=12)
        self.assertEqual(code, 1)
        self.assertEqual(report["cases"]["SEC12"]["status"], "WARNING")

    def test_failed_build_blocks_live_checks_against_stale_binaries(self):
        code, report, calls = self.run_qa(failed_stage="api-build")
        self.assertEqual(code, 1)
        self.assertNotIn("secrets-live", calls)
        self.assertEqual(report["cases"]["SEC9"]["status"], "WARNING")


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