"""全量穿透扫描引擎集成测试(需 PostgreSQL)。 验证场景检测→线索生成→落库的端到端链路(R5+R7+R8/R9)。 """ from __future__ import annotations from app.clues.models import ClueStatus, ConfidenceTier from app.engines import scan from app.scenarios.churn_fraud import CohortPoint from app.scenarios.split_contract import ContractRecord def test_split_scan_creates_high_confidence_clue(session): contracts = [ContractRecord(f"C{i}", f"CUST{i}", 850000) for i in range(8)] result = scan.run_split_contract_scan( session, contracts, approval_threshold=1_000_000, shared_controller=True ) assert result.scenario_code == "R8" assert result.scanned_count == 8 assert result.clue is not None assert result.clue.confidence == ConfidenceTier.HIGH assert result.clue.status == ClueStatus.NEW assert result.clue.amount_involved > 0 assert result.clue.model_version == scan.MODEL_VERSION def test_split_scan_no_clue_when_clean(session): contracts = [ContractRecord("C1", "A", 100000), ContractRecord("C2", "B", 3_000_000)] result = scan.run_split_contract_scan(session, contracts, approval_threshold=1_000_000) assert result.clue is None def test_churn_scan_creates_clue(session): curve = [CohortPoint(0, 1.0), CohortPoint(1, 0.95), CohortPoint(2, 0.1)] result = scan.run_churn_scan( session, retention_curve=curve, commission_paid=300000, active_ratio=0.05, zero_usage_ratio=0.9, channel_key="CH-001", ) assert result.clue is not None assert result.clue.scenario_code == "R9" assert result.clue.subjects["channel"] == "CH-001"