from __future__ import annotations import json import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[2] if str(ROOT) not in sys.path: sys.path.insert(0, str(ROOT)) import tools.validate_platform_transition_wbs_v1 as validator def test_validate_platform_transition_wbs_reports_failure_notes(monkeypatch): spec = { "phase_5_platform_transition": { "P1_kis_core_api_collector": { "success_criteria": { "expected_success_value": {}, "evidence_artifacts": [], "verification_commands": [], } }, "P2_sqlite_canonical_store": { "success_criteria": { "expected_success_value": {}, "evidence_artifacts": [], "verification_commands": [], } }, "P3_ci_scheduler_cutover": { "success_criteria": { "expected_success_value": {}, "evidence_artifacts": [], "verification_commands": [], } }, "P4_gas_thin_adapter_minimize": { "success_criteria": { "expected_success_value": {}, "evidence_artifacts": [], "verification_commands": [], } }, "P5_postgresql_upgrade_path": { "success_criteria": { "expected_success_value": {}, "evidence_artifacts": [], "verification_commands": [], } }, } } monkeypatch.setattr( validator, "_load_spec", lambda: spec, ) monkeypatch.setattr( validator, "_read_text", lambda path: "Phase 5 데이터 플랫폼 전환 WBS 성공값 P1 KIS core collector P2 SQLite canonical store P3 CI scheduler cutover P4 GAS thin adapter minimize P5 PostgreSQL upgrade path", ) monkeypatch.setattr( validator, "_check_p1", lambda: { "gate": "FAIL", "expected_success_value": {}, "evidence": {"summary_path": "Temp/test_kis_data_collection.json", "db_path": "Temp/test_kis_data_collection.db"}, "errors": ["summary_status=None"], }, ) monkeypatch.setattr( validator, "_check_p2", lambda: { "gate": "FAIL", "expected_success_value": {}, "evidence": {"db_path": "Temp/test_kis_data_collection.db"}, "errors": ["sqlite_round_trip_missing"], }, ) monkeypatch.setattr( validator, "_check_p3", lambda: { "gate": "PASS", "expected_success_value": {}, "evidence": {"workflow_path": ".gitea/workflows/kis_data_collection.yml"}, "errors": [], }, ) monkeypatch.setattr( validator, "_check_p4", lambda: { "gate": "FAIL", "expected_success_value": {}, "evidence": {"validation_path": "Temp/gas_thin_adapter_validation_v1.json"}, "errors": ["gate=None", "function_inventory_coverage_pct<100"], }, ) monkeypatch.setattr( validator, "_check_p5", lambda: { "gate": "PASS", "expected_success_value": {}, "evidence": {}, "errors": [], }, ) rc = validator.main() payload = json.loads((ROOT / "Temp" / "platform_transition_wbs_v1.json").read_text(encoding="utf-8")) assert rc == 1 assert payload["gate"] == "FAIL" assert payload["message"].startswith("Platform transition WBS check failed") assert len(payload["failure_notes"]) == 3 assert "P1 failed" in payload["failure_notes"][0] assert "P2 failed" in payload["failure_notes"][1] assert "P4 failed" in payload["failure_notes"][2]