96 lines
3.1 KiB
TypeScript
96 lines
3.1 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import type { RoleItem } from './members';
|
|
import { ALL_PERMISSIONS, DEFAULT_ROLE_PERMISSIONS } from './permissions';
|
|
import { mergePresetRolePermissions } from './role-permission-migration';
|
|
|
|
test('default group leader role has business permissions without admin modules', () => {
|
|
const permissions = DEFAULT_ROLE_PERMISSIONS['role-lead'];
|
|
|
|
assert.ok(permissions);
|
|
assert.ok(permissions.includes('overtime:view'));
|
|
assert.ok(!permissions.includes('*'));
|
|
assert.equal(permissions.some((p) => p.startsWith('member:')), false);
|
|
assert.equal(permissions.some((p) => p.startsWith('role:')), false);
|
|
});
|
|
|
|
test('ops view permission is grantable but not part of non-admin preset roles', () => {
|
|
assert.ok(ALL_PERMISSIONS.includes('ops:view'));
|
|
assert.ok(DEFAULT_ROLE_PERMISSIONS['role-admin'].includes('*'));
|
|
assert.equal(DEFAULT_ROLE_PERMISSIONS['role-pm'].includes('ops:view'), false);
|
|
assert.equal(DEFAULT_ROLE_PERMISSIONS['role-lead'].includes('ops:view'), false);
|
|
});
|
|
|
|
test('mergePresetRolePermissions adds the built-in group leader role to old role data', () => {
|
|
const roles: RoleItem[] = [
|
|
{
|
|
id: 'role-pm',
|
|
name: 'Product Manager',
|
|
createdAt: '2024-01-01',
|
|
permissions: ['product:view'],
|
|
},
|
|
];
|
|
|
|
const result = mergePresetRolePermissions(roles);
|
|
const lead = result.roles.find((role) => role.id === 'role-lead');
|
|
|
|
assert.equal(result.changed, true);
|
|
assert.ok(lead);
|
|
assert.equal(lead.name, '组长');
|
|
assert.deepEqual(lead.permissions, DEFAULT_ROLE_PERMISSIONS['role-lead']);
|
|
});
|
|
|
|
test('mergePresetRolePermissions adds new preset permissions to existing product manager role', () => {
|
|
const roles: RoleItem[] = [
|
|
{
|
|
id: 'role-pm',
|
|
name: '产品经理',
|
|
createdAt: '2024-01-01',
|
|
permissions: ['product:view'],
|
|
},
|
|
];
|
|
|
|
const result = mergePresetRolePermissions(roles);
|
|
|
|
assert.equal(result.changed, true);
|
|
assert.ok(result.roles[0].permissions.includes('product:view'));
|
|
assert.ok(result.roles[0].permissions.includes('xiaobao.warning:view'));
|
|
assert.ok(result.roles[0].permissions.includes('xiaobao.warning:manage'));
|
|
});
|
|
|
|
test('mergePresetRolePermissions keeps custom role permissions unchanged', () => {
|
|
const roles: RoleItem[] = [
|
|
{
|
|
id: 'role-custom',
|
|
name: '自定义角色',
|
|
createdAt: '2024-01-01',
|
|
permissions: ['version:view'],
|
|
},
|
|
];
|
|
|
|
const result = mergePresetRolePermissions(roles);
|
|
|
|
assert.equal(result.changed, false);
|
|
assert.deepEqual(result.roles[0].permissions, ['version:view']);
|
|
});
|
|
|
|
test('mergePresetRolePermissions does not restore unrelated default permissions removed from preset roles', () => {
|
|
const roles: RoleItem[] = [
|
|
{
|
|
id: 'role-pm',
|
|
name: '产品经理',
|
|
createdAt: '2024-01-01',
|
|
permissions: ['product:view'],
|
|
},
|
|
];
|
|
|
|
const result = mergePresetRolePermissions(roles);
|
|
|
|
assert.equal(result.changed, true);
|
|
assert.deepEqual(result.roles[0].permissions, [
|
|
'product:view',
|
|
'xiaobao.warning:view',
|
|
'xiaobao.warning:manage',
|
|
]);
|
|
});
|