109 lines
3.8 KiB
Python
109 lines
3.8 KiB
Python
"""角色权限模块测试 — 模块/动作/权限配置CRUD"""
|
|
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
|
|
|
|
|
|
class TestPermissionModules:
|
|
"""模块和动作定义测试"""
|
|
|
|
BASE = "/api/cma/permissions"
|
|
|
|
def test_list_modules(self, client: TestClient, db: Session):
|
|
"""获取模块和动作定义"""
|
|
create_test_user(db)
|
|
token = get_token_for_user(client)
|
|
|
|
resp = client.get(f"{self.BASE}/modules", headers=auth_header(token))
|
|
assert resp.status_code == 200
|
|
data = resp.json()
|
|
assert "modules" in data
|
|
assert "actions" in data
|
|
assert "roles" in data
|
|
assert len(data["modules"]) > 0
|
|
assert len(data["actions"]) > 0
|
|
# 检查是否包含核心模块
|
|
module_keys = [m["key"] for m in data["modules"]]
|
|
assert "dashboard" in module_keys
|
|
assert "kpis" in module_keys
|
|
assert "budget" in module_keys
|
|
|
|
|
|
class TestPermissionConfig:
|
|
"""权限配置CRUD测试"""
|
|
|
|
BASE = "/api/cma/permissions"
|
|
|
|
def test_get_config_creates_defaults(self, client: TestClient, db: Session):
|
|
"""首次获取自动创建默认配置"""
|
|
create_test_user(db)
|
|
token = get_token_for_user(client)
|
|
|
|
resp = client.get(f"{self.BASE}/config", headers=auth_header(token))
|
|
assert resp.status_code == 200
|
|
data = resp.json()
|
|
assert "route_permissions" in data
|
|
assert "action_permissions" in data
|
|
assert "ceo" in data["route_permissions"]
|
|
assert "finance" in data["route_permissions"]
|
|
|
|
def test_update_route_permissions(self, client: TestClient, db: Session):
|
|
"""更新路由权限"""
|
|
create_test_user(db)
|
|
token = get_token_for_user(client)
|
|
|
|
new_route = {
|
|
"ceo": ["dashboard", "kpis", "maps"],
|
|
"finance": ["dashboard", "kpis"],
|
|
}
|
|
resp = client.put(
|
|
f"{self.BASE}/config",
|
|
headers=auth_header(token),
|
|
json={"route_permissions": new_route},
|
|
)
|
|
assert resp.status_code == 200
|
|
assert resp.json()["message"] == "权限配置已更新"
|
|
|
|
# 验证已更新
|
|
get_resp = client.get(f"{self.BASE}/config", headers=auth_header(token))
|
|
assert get_resp.json()["route_permissions"] == new_route
|
|
|
|
def test_update_action_permissions(self, client: TestClient, db: Session):
|
|
"""更新动作权限"""
|
|
create_test_user(db)
|
|
token = get_token_for_user(client)
|
|
|
|
new_actions = {
|
|
"ceo": ["read", "approve", "delete"],
|
|
"it": ["read", "write", "admin"],
|
|
}
|
|
resp = client.put(
|
|
f"{self.BASE}/config",
|
|
headers=auth_header(token),
|
|
json={"action_permissions": new_actions},
|
|
)
|
|
assert resp.status_code == 200
|
|
|
|
get_resp = client.get(f"{self.BASE}/config", headers=auth_header(token))
|
|
assert get_resp.json()["action_permissions"] == new_actions
|
|
|
|
def test_update_both_simultaneously(self, client: TestClient, db: Session):
|
|
"""同时更新路由和动作权限"""
|
|
create_test_user(db)
|
|
token = get_token_for_user(client)
|
|
|
|
resp = client.put(
|
|
f"{self.BASE}/config",
|
|
headers=auth_header(token),
|
|
json={
|
|
"route_permissions": {"ceo": ["dashboard"]},
|
|
"action_permissions": {"ceo": ["read"]},
|
|
},
|
|
)
|
|
assert resp.status_code == 200
|
|
|
|
data = client.get(f"{self.BASE}/config", headers=auth_header(token)).json()
|
|
assert data["route_permissions"] == {"ceo": ["dashboard"]}
|
|
assert data["action_permissions"] == {"ceo": ["read"]}
|