from __future__ import annotations import json import os import subprocess import tempfile import unittest from pathlib import Path class PrepareFinalReleaseTests(unittest.TestCase): def test_prepare_final_release_blocks_when_smoke_is_false_even_if_verify_passes(self) -> None: repo_root = Path(__file__).resolve().parents[2] source_script = repo_root / "prepare_final_release.sh" with tempfile.TemporaryDirectory() as temp_dir: root = Path(temp_dir) release_root = root / "release" release_root.mkdir(parents=True, exist_ok=True) (root / "prepare_final_release.sh").write_text(source_script.read_text(encoding="utf-8"), encoding="utf-8") (root / "package_domain_release.sh").write_text( "#!/usr/bin/env bash\n" "set -euo pipefail\n" "mkdir -p \"$PWD/release\"\n" "cat > \"$PWD/release/latest_release.json\" <<'EOF'\n" "{\n" " \"package_name\": \"domaincheck_release_test\",\n" " \"archive_path\": \"/tmp/domaincheck_release_test.tar.gz\",\n" " \"sha256_path\": \"/tmp/domaincheck_release_test.sha256.txt\",\n" " \"sha256\": \"abc\",\n" " \"smoke_test_ok\": false,\n" " \"smoke_test_message\": \"skipped by env\"\n" "}\n" "EOF\n", encoding="utf-8", ) (root / "verify_domain_release.sh").write_text( "#!/usr/bin/env bash\n" "set -euo pipefail\n" "printf '%s\\n' '{\"ok\": true, \"archive\": \"/tmp/domaincheck_release_test.tar.gz\"}'\n", encoding="utf-8", ) os.chmod(root / "prepare_final_release.sh", 0o755) os.chmod(root / "package_domain_release.sh", 0o755) os.chmod(root / "verify_domain_release.sh", 0o755) result = subprocess.run( ["bash", str(root / "prepare_final_release.sh")], cwd=root, check=True, capture_output=True, text=True, ) payload = json.loads((release_root / "final_release_report.json").read_text(encoding="utf-8")) self.assertFalse(payload["ok"]) self.assertEqual("blocked", payload["release_gate"]["decision"]) self.assertTrue(payload["release_gate"]["verify_ok"]) self.assertFalse(payload["release_gate"]["smoke_test_ok"]) self.assertIn("smoke_test_failed_or_skipped", payload["release_gate"]["blocked_reasons"]) self.assertIn('"ok": false', result.stdout) def test_prepare_final_release_ready_when_verify_and_smoke_both_pass(self) -> None: repo_root = Path(__file__).resolve().parents[2] source_script = repo_root / "prepare_final_release.sh" with tempfile.TemporaryDirectory() as temp_dir: root = Path(temp_dir) release_root = root / "release" release_root.mkdir(parents=True, exist_ok=True) (root / "prepare_final_release.sh").write_text(source_script.read_text(encoding="utf-8"), encoding="utf-8") (root / "package_domain_release.sh").write_text( "#!/usr/bin/env bash\n" "set -euo pipefail\n" "mkdir -p \"$PWD/release\"\n" "cat > \"$PWD/release/latest_release.json\" <<'EOF'\n" "{\n" " \"package_name\": \"domaincheck_release_test\",\n" " \"archive_path\": \"/tmp/domaincheck_release_test.tar.gz\",\n" " \"sha256_path\": \"/tmp/domaincheck_release_test.sha256.txt\",\n" " \"sha256\": \"abc\",\n" " \"smoke_test_ok\": true,\n" " \"smoke_test_message\": \"all checks passed (1/1)\"\n" "}\n" "EOF\n", encoding="utf-8", ) (root / "verify_domain_release.sh").write_text( "#!/usr/bin/env bash\n" "set -euo pipefail\n" "printf '%s\\n' '{\"ok\": true, \"archive\": \"/tmp/domaincheck_release_test.tar.gz\"}'\n", encoding="utf-8", ) os.chmod(root / "prepare_final_release.sh", 0o755) os.chmod(root / "package_domain_release.sh", 0o755) os.chmod(root / "verify_domain_release.sh", 0o755) subprocess.run( ["bash", str(root / "prepare_final_release.sh")], cwd=root, check=True, capture_output=True, text=True, ) payload = json.loads((release_root / "final_release_report.json").read_text(encoding="utf-8")) self.assertTrue(payload["ok"]) self.assertEqual("ready", payload["release_gate"]["decision"]) self.assertEqual([], payload["release_gate"]["blocked_reasons"]) self.assertTrue(payload["release_gate"]["verify_ok"]) self.assertTrue(payload["release_gate"]["smoke_test_ok"]) if __name__ == "__main__": unittest.main()