Files
tw/tests/test_evolution_mvp.py

55 lines
1.8 KiB
Python

import unittest
from unittest.mock import patch
from evolution.mvp import Finding, Sample, can_publish_candidate, evaluate_samples
class EvolutionMvpTest(unittest.TestCase):
def test_evaluate_detects_risk_without_transfer(self):
samples = [
Sample(
customer_id="c1",
acc_id="shop",
in_ts="2026-02-28 10:00:00",
in_text="我要投诉并退款,你们骗人",
out_ts="2026-02-28 10:00:10",
out_text="这个我不清楚,稍后再说",
latency_sec=10,
)
]
findings = evaluate_samples(samples)
kinds = {f.kind for f in findings}
self.assertIn("risk_not_transferred", kinds)
self.assertIn("weak_reply", kinds)
def test_publish_gate(self):
samples = [
Sample(
customer_id=f"c{i}",
acc_id="shop",
in_ts="2026-02-28 10:00:00",
in_text="你好",
out_ts="2026-02-28 10:00:05",
out_text="您好",
latency_sec=5,
)
for i in range(35)
]
findings: list[Finding] = []
policy = {
"publish_gate": {
"min_sample_count": 30,
"max_high_findings_rate": 0.1,
"max_ai_fail_rate": 5.0,
"max_transfer_rate": 45.0,
}
}
with patch("utils.metrics_tracker.get_runtime_summary", return_value={"rates": {"ai_fail_rate": 1.0, "transfer_rate": 10.0}}):
ok, report = can_publish_candidate(samples, findings, runtime_hours=24, policy=policy)
self.assertTrue(ok)
self.assertEqual(report["sample_count"], 35)
if __name__ == "__main__":
unittest.main(verbosity=2)