refactor: 문서 개선 중
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
이 검사기의 값은 「통과시키는 것」이 아니라 「안 지킨 것을 잡는 것」이라, 시험도 전부
|
||||
위반을 넣어 걸리는지 보는 모양이다.
|
||||
"""
|
||||
import importlib.util
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
@@ -13,6 +14,9 @@ import unittest
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
SCRIPT = os.path.join(ROOT, "scripts", "verify-pipeline-run.py")
|
||||
LEDGER = os.path.join(ROOT, "runs", "keycloak", "2026-09-07-2215", "run.json")
|
||||
_spec = importlib.util.spec_from_file_location("verify_pipeline_run", SCRIPT)
|
||||
vpr = importlib.util.module_from_spec(_spec)
|
||||
_spec.loader.exec_module(vpr)
|
||||
|
||||
|
||||
def run(path, *args):
|
||||
@@ -125,6 +129,75 @@ class LedgerRules(unittest.TestCase):
|
||||
self.assertIn("곁증명의 스킬 영수증이 그 스킬의 문장이 아니다", out)
|
||||
|
||||
|
||||
class EvidenceGateV5(unittest.TestCase):
|
||||
def check(self, gate):
|
||||
rep = vpr.Report("fixture")
|
||||
run_ = {"schemaVersion": vpr.EVIDENCE_RECONCILIATION_SCHEMA, "project": "demo"}
|
||||
found = vpr._evidence_gate_v5(rep, run_, "S3", [gate], "S3 fixture")
|
||||
return rep, found
|
||||
|
||||
def test_repo_flag_is_required(self):
|
||||
rep, _ = self.check({
|
||||
"semanticId": "evidence-repo",
|
||||
"cmd": "node check_evidence.mjs demo",
|
||||
"exit": 0,
|
||||
"status": "PASS",
|
||||
})
|
||||
self.assertTrue(rep.error_count)
|
||||
self.assertIn("live source evidence gate에서 --repo가 빠졌다", rep.errors)
|
||||
|
||||
def test_unverifiable_preserves_exit_three_and_reason(self):
|
||||
rep, gate = self.check({
|
||||
"semanticId": "evidence-repo",
|
||||
"cmd": "node check_evidence.mjs demo --repo",
|
||||
"exit": 3,
|
||||
"status": "UNVERIFIABLE",
|
||||
"reason": "source repository unavailable on current machine",
|
||||
"acceptedByProjectReview": True,
|
||||
})
|
||||
self.assertEqual(0, rep.error_count, rep.errors)
|
||||
self.assertIsNotNone(gate)
|
||||
self.assertEqual(["S3"], rep.facts["live source UNVERIFIABLE"])
|
||||
|
||||
def test_unverifiable_cannot_hide_an_arbitrary_exit(self):
|
||||
rep, _ = self.check({
|
||||
"semanticId": "evidence-repo",
|
||||
"cmd": "node check_evidence.mjs demo --repo",
|
||||
"exit": 1,
|
||||
"status": "UNVERIFIABLE",
|
||||
"reason": "something failed",
|
||||
"acceptedByProjectReview": True,
|
||||
})
|
||||
self.assertIn("UNVERIFIABLE evidence gate는 실제 대조 불가 exit 3이어야 한다", rep.errors)
|
||||
|
||||
def test_unverifiable_needs_project_review_acceptance(self):
|
||||
rep, _ = self.check({
|
||||
"semanticId": "evidence-repo",
|
||||
"cmd": "node check_evidence.mjs demo --repo",
|
||||
"exit": 3,
|
||||
"status": "UNVERIFIABLE",
|
||||
"reason": "source repository unavailable on current machine",
|
||||
})
|
||||
self.assertIn("UNVERIFIABLE evidence gate가 프로젝트 리뷰에서 수용되지 않았다", rep.errors)
|
||||
|
||||
def test_pass_requires_real_repo_gate_and_zero_exit(self):
|
||||
rep, _ = self.check({
|
||||
"semanticId": "evidence-repo",
|
||||
"cmd": "node check_evidence.mjs demo --repo",
|
||||
"exit": 0,
|
||||
"status": "PASS",
|
||||
})
|
||||
self.assertEqual(0, rep.error_count, rep.errors)
|
||||
|
||||
def test_semantic_gate_id_is_required(self):
|
||||
rep = vpr.Report("fixture")
|
||||
run_ = {"schemaVersion": vpr.EVIDENCE_RECONCILIATION_SCHEMA, "project": "demo"}
|
||||
vpr._evidence_gate_v5(rep, run_, "S3", [{
|
||||
"cmd": "node check_evidence.mjs demo --repo", "exit": 0, "status": "PASS"
|
||||
}], "S3 fixture")
|
||||
self.assertIn("필수 evidence semantic gate가 정확히 하나가 아니다", rep.errors)
|
||||
|
||||
|
||||
class Init(unittest.TestCase):
|
||||
def test_틀에서_런을_연다(self):
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
|
||||
Reference in New Issue
Block a user