Files
cma-management/backend/tests/test_kpi_422_baseline.py
T

41 lines
1.7 KiB
Python

"""
基线测试:KPI创建接口缺少必填元数据字段时返回 HTTP 422。
场景:POST /api/cma/kpis 请求体不传 formula 字段(数据治理规则2: 元数据必填),
期望返回 HTTP 422,且 errors 中包含 formula 相关提示。
"""
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session
from tests.conftest import create_test_user, get_token_for_user, auth_header
class TestKpi422Baseline:
"""KPI创建缺少必填元数据字段 → 422 基线测试"""
def test_create_kpi_missing_formula_returns_422(self, client: TestClient, db: Session):
"""不传 formula 字段时,创建KPI返回 422"""
create_test_user(db)
token = get_token_for_user(client)
# 构造请求体:其余必填字段齐全,唯独不传 formula
payload = {
"kpi_code": "F_BASELINE_001",
"kpi_name": "基线测试收入指标",
"dimension": "finance",
"target_value": 1000000,
"unit": "元",
# 注意:故意不传 formula(必填元数据字段)
"data_source": "测试系统",
"data_owner": "测试管理员",
}
resp = client.post("/api/cma/kpis", headers=auth_header(token), json=payload)
assert resp.status_code == 422, f"期望422,实际 {resp.status_code}: {resp.text}"
# 校验错误信息中包含 formula 字段
# 注意:FastAPI HTTPException(detail=dict) 时响应体为 {"detail": {...}}
body = resp.json()
detail = body.get("detail", {})
errors = detail.get("errors", []) if isinstance(detail, dict) else []
assert any("formula" in e for e in errors), f"errors 应提及 formula: {body}"