a17f4cc522
- 新增项目成员候选用户接口,避免 PM 读取全局用户列表 - 按项目角色和权限矩阵控制项目管理、成员、中心与审计入口 - 合并侧边栏管理后台入口,统一从项目管理进入成员等模块 - 加强成员管理安全约束,禁止 PM 修改自己、系统管理员或更高权限角色 - 修复多项目角色缓存串用问题,并补充前后端回归测试
28 lines
1.4 KiB
TypeScript
28 lines
1.4 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { readFileSync } from "node:fs";
|
|
import { resolve } from "node:path";
|
|
|
|
const readRouter = () => readFileSync(resolve(__dirname, "./router/index.ts"), "utf8");
|
|
|
|
describe("admin project route permissions", () => {
|
|
it("allows project admin pages through matrix-authorized PMs instead of all project roles", () => {
|
|
const source = readRouter();
|
|
|
|
expect(source).toContain('adminProjectPermission: { module: "project_members", action: "read" }');
|
|
expect(source).toContain('adminProjectPermission: { module: "project_members", action: "write" }');
|
|
expect(source).toContain('adminProjectPermission: { module: "sites", action: "read" }');
|
|
expect(source).toContain('adminProjectPermission: { module: "audit_export", action: "read" }');
|
|
expect(source).toContain("meta: { title: TEXT.menu.projectManagement }");
|
|
expect(source).toContain('if (role !== "PM") return false;');
|
|
expect(source).toContain("roles?.[role]?.[permission.module]?.[permission.action]");
|
|
});
|
|
|
|
it("keeps login landing independent from PM management backend access", () => {
|
|
const source = readRouter();
|
|
|
|
expect(source).not.toContain("findPmAdminLandingPath");
|
|
expect(source).not.toContain("pmAdminLandingModules");
|
|
expect(source).toContain(' : studyStore.currentStudy\n ? "/project/overview"\n : "/workbench",');
|
|
});
|
|
});
|