113 lines
4.6 KiB
Python
113 lines
4.6 KiB
Python
import unittest
|
|
|
|
from tools.review_structured_acceptance_gate import (
|
|
build_field_baseline,
|
|
build_field_baseline_by_contract,
|
|
build_relationship_baseline,
|
|
build_relationship_baseline_by_type,
|
|
load_cases_from_manifest,
|
|
SAMPLE_MANIFEST_PATH,
|
|
)
|
|
|
|
|
|
class ReviewStructuredAcceptanceGateMetricsTestCase(unittest.TestCase):
|
|
def test_build_field_baseline_counts_expected_metrics(self):
|
|
summary = {
|
|
"cases": [
|
|
{
|
|
"case_id": "S-001",
|
|
"status": "PASS",
|
|
"result": {
|
|
"clauses": [{"clause_type": "payment"}, {"clause_type": "confidentiality"}],
|
|
"contract_structure": {
|
|
"detected_contract_type": "service",
|
|
"amount": "人民币500000元",
|
|
"term_details": {"start_date": "2026-05-01", "end_date": "2027-05-01"},
|
|
"payment_milestones": [{}],
|
|
"liability_carve_outs": [],
|
|
"intellectual_property_owner": None,
|
|
},
|
|
},
|
|
}
|
|
]
|
|
}
|
|
|
|
rows = build_field_baseline(summary)
|
|
metrics = {row["metric"]: row for row in rows}
|
|
|
|
self.assertEqual(metrics["contract_type"]["passed"], 1)
|
|
self.assertEqual(metrics["amount"]["passed"], 1)
|
|
self.assertEqual(metrics["term_start"]["passed"], 1)
|
|
self.assertEqual(metrics["payment_milestones"]["passed"], 1)
|
|
|
|
def test_build_relationship_baseline_counts_presence_and_confidence(self):
|
|
summary = {
|
|
"cases": [
|
|
{
|
|
"case_id": "S-007",
|
|
"status": "PASS",
|
|
"result": {
|
|
"contract_structure": {
|
|
"clause_relationships": [
|
|
{"type": "payment_depends_on_acceptance", "confidence_tier": "high"},
|
|
{"type": "liability_cap_conflicts_with_breach", "confidence_tier": "weak"},
|
|
]
|
|
}
|
|
},
|
|
}
|
|
]
|
|
}
|
|
|
|
rows = build_relationship_baseline(summary)
|
|
metrics = {row["metric"]: row for row in rows}
|
|
|
|
self.assertEqual(metrics["relationship_presence"]["passed"], 2)
|
|
self.assertEqual(metrics["relationship_absence"]["passed"], 2)
|
|
self.assertEqual(metrics["relationship_confidence"]["passed"], 1)
|
|
|
|
def test_load_cases_from_manifest_reads_external_sample_files(self):
|
|
cases = load_cases_from_manifest(SAMPLE_MANIFEST_PATH)
|
|
|
|
self.assertGreaterEqual(len(cases), 10)
|
|
self.assertTrue(any(case.case_id == "S-010" for case in cases))
|
|
self.assertTrue(any("甲方" in case.content for case in cases))
|
|
|
|
def test_grouped_baselines_split_by_contract_and_relationship_type(self):
|
|
summary = {
|
|
"cases": [
|
|
{
|
|
"case_id": "S-006",
|
|
"status": "PASS",
|
|
"result": {
|
|
"clauses": [{"clause_type": "payment"}, {"clause_type": "acceptance"}],
|
|
"contract_structure": {
|
|
"detected_contract_type": "service",
|
|
"amount": "人民币1500000元",
|
|
"term_details": {"start_date": "2026-08-01", "end_date": "2027-08-01"},
|
|
"payment_milestones": [{}, {}, {}, {}],
|
|
"liability_carve_outs": [],
|
|
"intellectual_property_owner": "party_a",
|
|
"clause_relationships": [
|
|
{"type": "payment_depends_on_acceptance", "confidence_tier": "high"},
|
|
],
|
|
},
|
|
},
|
|
}
|
|
]
|
|
}
|
|
|
|
field_rows = build_field_baseline_by_contract(summary)
|
|
relationship_rows = build_relationship_baseline_by_type(summary)
|
|
|
|
field_metrics = {row["contract_family"]: row for row in field_rows}
|
|
relationship_metrics = {row["relationship_type"]: row for row in relationship_rows}
|
|
|
|
self.assertEqual(field_metrics["service"]["contract_type_accuracy"], 100.0)
|
|
self.assertEqual(field_metrics["service"]["payment_milestone_accuracy"], 100.0)
|
|
self.assertEqual(relationship_metrics["payment_depends_on_acceptance"]["presence_accuracy"], 100.0)
|
|
self.assertEqual(relationship_metrics["payment_depends_on_acceptance"]["confidence_accuracy"], 100.0)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|