import sys import unittest from pathlib import Path sys.path.insert(0, str(Path(__file__).parent)) from verify_release_gate import validate_release_report def valid_report(): return { "release_id": "release-2026-09-01-001", "from_stage": "development", "to_stage": "internal", "slo_passed": True, "security_passed": True, "cost_passed": True, "rollback_rehearsed": True, "playtests": {"eu_passed": True, "na_passed": True}, "legacy": {"phase6_passed": True, "enet_passed": True}, } class ReleaseGateTest(unittest.TestCase): def test_accepts_one_complete_promotion(self): self.assertEqual(validate_release_report(valid_report()), ("development", "internal")) def test_rejects_skipped_stage(self): report = valid_report() report["to_stage"] = "casual" with self.assertRaises(ValueError): validate_release_report(report) def test_rejects_missing_or_false_gate(self): report = valid_report() del report["playtests"]["na_passed"] with self.assertRaises(ValueError): validate_release_report(report) report = valid_report() report["cost_passed"] = 1 with self.assertRaises(ValueError): validate_release_report(report) def test_rejects_unknown_stage_and_blank_release(self): report = valid_report() report["release_id"] = " " with self.assertRaises(ValueError): validate_release_report(report) report = valid_report() report["from_stage"] = "experimental" with self.assertRaises(ValueError): validate_release_report(report) if __name__ == "__main__": unittest.main()