from __future__ import annotations import json import subprocess import sys from pathlib import Path def test_validate_dotnet_cicd_chain_contract_passes() -> None: root = Path(__file__).resolve().parents[2] proc = subprocess.run( [sys.executable, str(root / "tools" / "validate_dotnet_cicd_chain_contract_v1.py")], cwd=root, capture_output=True, text=True, ) assert proc.returncode == 0, proc.stdout + proc.stderr payload = json.loads(proc.stdout) assert payload["gate"] == "PASS" def test_validate_dotnet_cicd_chain_contract_reports_missing_chain() -> None: root = Path(__file__).resolve().parents[2] temp = root / "Temp" / "test_wbs_10_cicd_chain_contract_bad.yaml" temp.write_text( "formula_id: WBS_10_DOTNET_CICD_CHAIN_CONTRACT_V1\ngoal: CI, prepare-release, deploy-prod 순차 게이트를 고정한다.\nworkflows:\n ci:\n name: Validators (Pushes and Pull Requests)\n prepare_release:\n name: Prepare Release\n deploy_prod:\n name: Deploy to Production\ndependency_chain: []\nrequired_guards: [a,b,c,d]\nhealth_checks: [a,b,c,d]\n", encoding="utf-8", ) proc = subprocess.run( [sys.executable, str(root / "tools" / "validate_dotnet_cicd_chain_contract_v1.py"), "--contract", str(temp)], cwd=root, capture_output=True, text=True, ) assert proc.returncode != 0 payload = json.loads(proc.stdout) assert payload["gate"] == "FAIL" assert "dependency_chain" in payload["missing"]