Files
cma-management/backend/tests/test_kpis.py
T
Hermes CI Fix 0d90a8e8f3 test: pytest测试框架 + API测试
- 测试框架:SQLite内存数据库,每个测试自动建表/清理
- auth测试:登录/注册/token验证(6个用例)
- kpis测试:增删改查+重复编码检查(6个用例)
- maps测试:创建/编辑/发布/连线/同维度限制(6个用例)
- 后端修复:KPI创建时检查编码唯一性(原为数据库抛500)
2026-05-28 17:42:15 +08:00

119 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
KPI字典模块测试
"""
import pytest
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session
from tests.conftest import create_test_user, get_token_for_user, auth_header, create_test_kpi
class TestKPIs:
"""KPI字典CRUD测试"""
def test_list_kpis_empty(self, client: TestClient, db: Session):
"""空列表"""
create_test_user(db)
token = get_token_for_user(client)
resp = client.get("/api/cma/kpis", headers=auth_header(token))
assert resp.status_code == 200
assert resp.json()["data"] == []
def test_create_kpi(self, client: TestClient, db: Session):
"""创建KPI"""
create_test_user(db)
token = get_token_for_user(client)
resp = client.post(
"/api/cma/kpis",
headers=auth_header(token),
json={
"kpi_code": "F_REVENUE_002",
"kpi_name": "测试收入指标",
"dimension": "finance",
"target_value": 1000000,
"unit": "元",
},
)
assert resp.status_code == 200
assert resp.json()["kpi_code"] == "F_REVENUE_002"
def test_create_kpi_duplicate_code(self, client: TestClient, db: Session):
"""重复KPI编码被拒绝"""
create_test_user(db)
token = get_token_for_user(client)
# 先创建一个
client.post(
"/api/cma/kpis",
headers=auth_header(token),
json={
"kpi_code": "F_REVENUE_003",
"kpi_name": "收入指标",
"dimension": "finance",
},
)
# 重复创建
resp = client.post(
"/api/cma/kpis",
headers=auth_header(token),
json={
"kpi_code": "F_REVENUE_003",
"kpi_name": "重复编码",
"dimension": "finance",
},
)
assert resp.status_code == 400
def test_update_kpi(self, client: TestClient, db: Session):
"""编辑KPI"""
create_test_user(db)
token = get_token_for_user(client)
kpi = create_test_kpi(db, kpi_code="F_TEST_001")
resp = client.put(
f"/api/cma/kpis/{kpi.id}",
headers=auth_header(token),
json={"kpi_name": "已编辑指标", "target_value": 200},
)
assert resp.status_code == 200
assert resp.json()["kpi_name"] == "已编辑指标"
assert resp.json()["target_value"] == 200
def test_delete_kpi(self, client: TestClient, db: Session):
"""删除KPI(软删除)"""
create_test_user(db)
token = get_token_for_user(client)
kpi = create_test_kpi(db, kpi_code="F_DEL_001")
resp = client.delete(
f"/api/cma/kpis/{kpi.id}",
headers=auth_header(token),
)
assert resp.status_code == 200
# 验证已被软删除(status变为非active
get_resp = client.get(
f"/api/cma/kpis/{kpi.id}",
headers=auth_header(token),
)
assert get_resp.status_code == 200
assert get_resp.json()["status"] != "active"
def test_get_kpi_by_code(self, client: TestClient, db: Session):
"""按编码查询KPI(通过列表过滤)"""
create_test_user(db)
token = get_token_for_user(client)
create_test_kpi(db, kpi_code="F_CODE_001", kpi_name="编码查询测试")
# 通过列表+参数过滤
resp = client.get(
"/api/cma/kpis?code=F_CODE_001",
headers=auth_header(token),
)
assert resp.status_code == 200
data = resp.json()["data"]
assert len(data) >= 1
assert data[0]["kpi_name"] == "编码查询测试"