Files
group_xinghuo_jinrong/tests/test_guardrail.py
T
zyi b19a2415f9 feat: 数据分析 Agent 实现(API/服务/表结构元数据/文档/测试)
- 新增 app/api、app/service 数据分析 Agent 全套服务与接口
- schemas.py 重构为 schemas 包(analyst schema)
- 新增 SQL 防注入、guardrail、缓存、字典、LLM 等服务
- 新增 tests 测试套件与 scripts/dev、scripts/setup 脚本
- 补充需求规格、架构说明书、开发清单、表设计等文档
2026-09-09 18:04:45 +08:00

52 lines
1.8 KiB
Python

"""guardrail 数字护栏单元测试。"""
import unittest
from app.model.schemas.analyst import TableData
from app.service.guardrail import check_numbers, extract_numbers, result_numbers, verify
class TestGuardrail(unittest.TestCase):
def _table(self):
return TableData(
columns=["risk_code", "cnt"],
rows=[["C1", 4], ["C2", 6]],
)
def test_extract_numbers(self):
self.assertEqual(extract_numbers("共 2 个,高风险 6 人,占比 5%"), [2.0, 6.0, 5.0])
def test_extract_comma_numbers(self):
self.assertEqual(extract_numbers("2,625,000.00 元 和 1,229,150 元"), [2625000.0, 1229150.0])
def test_correct_answer_no_issues(self):
self.assertEqual(check_numbers("共 2 个风险等级,高风险 6 人", self._table()), [])
def test_wrong_number_flagged(self):
# 表格只有 4/6/合计10/行数2,答案说 123 应被拦截
issues = check_numbers("金额加起来是 123 万元", self._table())
self.assertIn(123.0, issues)
def test_result_numbers(self):
nums = result_numbers(self._table())
self.assertIn(2.0, nums) # 行数
self.assertIn(4.0, nums)
self.assertIn(6.0, nums)
self.assertIn(10.0, nums) # 数值列求和
def test_verify_wrong_fails(self):
r = verify("共 999 个", self._table(), data_as_of="2026-09-04")
self.assertFalse(r.passed)
self.assertIn(999.0, r.issues)
def test_zero_valid(self):
t = TableData(columns=["c"], rows=[])
self.assertEqual(check_numbers("结果为 0", t), [])
def test_wan_scale_valid(self):
t = TableData(columns=["v"], rows=[[1234567]])
self.assertEqual(check_numbers("约 123 万元", t), [])
if __name__ == "__main__":
unittest.main()