Files
selfrelease 7ec4fb0747 feat(backend): AI 服务层 — 千问流式 LLM + 月报解析 + 健康度计算 + 风险检测 + Copilot
- LLM 客户端:全部 SSE 流式输出,兼容 OpenAI 接口
- AI 月报解析:SSE 流式端点 POST /reports/{id}/parse
- 健康度计算引擎:四维评分(财务/经营/AI商业化/AI成本)
- 风险自动检测引擎:6 条规则自动检测指标越界
- AI Copilot:SSE 流式对话 POST /copilot/chat
- 权限中间件:角色级 + 字段级权限控制
- 测试:21 个新测试(健康度 8 + 风险检测 8 + 权限 5),总计 64 passed
2026-07-18 22:16:40 +08:00

62 lines
2.4 KiB
Python

"""风险检测引擎测试。"""
from app.services.risk_engine import detect_risks
class TestDetectRisks:
"""风险自动检测。"""
def test_empty_data(self):
"""空数据不应检测到风险。"""
risks = detect_risks({}, "company-1")
assert len(risks) == 0
def test_low_runway_critical(self):
"""跑道 < 3 月应触发 critical 风险。"""
data = {"cash_balance": {"runway_months": 2}}
risks = detect_risks(data, "company-1")
assert any(r["severity"] == "critical" for r in risks)
assert any("3 个月" in r["title"] for r in risks)
def test_low_runway_warning(self):
"""跑道 3-6 月应触发 high 风险。"""
data = {"cash_balance": {"runway_months": 4}}
risks = detect_risks(data, "company-1")
assert any(r["severity"] == "high" and "6 个月" in r["title"] for r in risks)
def test_burn_rate_up(self):
"""烧钱率上升应触发 medium 风险。"""
data = {"burn_rate": {"trend": "up"}}
risks = detect_risks(data, "company-1")
assert any(r["severity"] == "medium" and "烧钱率" in r["title"] for r in risks)
def test_revenue_decline(self):
"""营收下滑应触发 high 风险。"""
data = {"revenue": {"yoy_change": "-15"}}
risks = detect_risks(data, "company-1")
assert any(r["severity"] == "high" and "营收" in r["title"] for r in risks)
def test_high_departures(self):
"""高离职率应触发 medium 风险。"""
data = {"headcount": {"new_hires": 2, "departures": 8}}
risks = detect_risks(data, "company-1")
assert any(r["severity"] == "medium" and "流失" in r["title"] for r in risks)
def test_healthy_company_no_risks(self):
"""健康企业不应检测到风险。"""
data = {
"revenue": {"yoy_change": "20"},
"cash_balance": {"runway_months": 18},
"burn_rate": {"trend": "down"},
"headcount": {"new_hires": 5, "departures": 1},
}
risks = detect_risks(data, "company-1")
assert len(risks) == 0
def test_company_id_in_risks(self):
"""风险事件应包含 company_id。"""
data = {"cash_balance": {"runway_months": 2}}
risks = detect_risks(data, "test-company-id")
for r in risks:
assert r["company_id"] == "test-company-id"