|
|
@@ -217,4 +217,142 @@ describe('角色集成测试', () => {
|
|
|
expect(role.permissions).toEqual([]);
|
|
|
});
|
|
|
});
|
|
|
+
|
|
|
+ describe('租户隔离测试', () => {
|
|
|
+ let tenant1Role: RoleMt;
|
|
|
+ let tenant2Role: RoleMt;
|
|
|
+
|
|
|
+ beforeEach(async () => {
|
|
|
+ // 创建租户1的角色
|
|
|
+ tenant1Role = await roleService.create({
|
|
|
+ name: 'tenant1_role',
|
|
|
+ description: 'Role for tenant 1',
|
|
|
+ permissions: ['user:read', 'user:create'],
|
|
|
+ tenantId: 1
|
|
|
+ });
|
|
|
+
|
|
|
+ // 创建租户2的角色
|
|
|
+ tenant2Role = await roleService.create({
|
|
|
+ name: 'tenant2_role',
|
|
|
+ description: 'Role for tenant 2',
|
|
|
+ permissions: ['user:read', 'user:update'],
|
|
|
+ tenantId: 2
|
|
|
+ });
|
|
|
+
|
|
|
+ // 手动设置租户上下文,因为autoExtractFromContext功能尚未实现
|
|
|
+ (roleService as any)._tenantId = undefined;
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该只返回当前租户的角色列表', async () => {
|
|
|
+ // 测试租户1的角色列表
|
|
|
+ const [roles1, total1] = await roleService.getList(1, 10, undefined, undefined, { tenantId: 1 });
|
|
|
+ expect(total1).toBe(1);
|
|
|
+ expect(roles1).toHaveLength(1);
|
|
|
+ expect(roles1[0].tenantId).toBe(1);
|
|
|
+ expect(roles1[0].name).toBe('tenant1_role');
|
|
|
+
|
|
|
+ // 测试租户2的角色列表
|
|
|
+ const [roles2, total2] = await roleService.getList(1, 10, undefined, undefined, { tenantId: 2 });
|
|
|
+ expect(total2).toBe(1);
|
|
|
+ expect(roles2).toHaveLength(1);
|
|
|
+ expect(roles2[0].tenantId).toBe(2);
|
|
|
+ expect(roles2[0].name).toBe('tenant2_role');
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该正确过滤跨租户的角色详情访问', async () => {
|
|
|
+ // 租户1应该能访问自己的角色
|
|
|
+ const role1 = await roleService.getById(tenant1Role.id, [], { tenantId: 1 });
|
|
|
+ expect(role1).toBeDefined();
|
|
|
+ expect(role1?.tenantId).toBe(1);
|
|
|
+
|
|
|
+ // 租户1不应该能访问租户2的角色
|
|
|
+ const role2FromTenant1 = await roleService.getById(tenant2Role.id, [], { tenantId: 1 });
|
|
|
+ expect(role2FromTenant1).toBeNull();
|
|
|
+
|
|
|
+ // 租户2应该能访问自己的角色
|
|
|
+ const role2 = await roleService.getById(tenant2Role.id, [], { tenantId: 2 });
|
|
|
+ expect(role2).toBeDefined();
|
|
|
+ expect(role2?.tenantId).toBe(2);
|
|
|
+
|
|
|
+ // 租户2不应该能访问租户1的角色
|
|
|
+ const role1FromTenant2 = await roleService.getById(tenant1Role.id, [], { tenantId: 2 });
|
|
|
+ expect(role1FromTenant2).toBeNull();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该拒绝跨租户的角色更新', async () => {
|
|
|
+ const updateData = {
|
|
|
+ description: '尝试跨租户更新',
|
|
|
+ permissions: ['user:delete']
|
|
|
+ };
|
|
|
+
|
|
|
+ // 租户1尝试更新租户2的角色 - 应该返回null
|
|
|
+ const updatedRole = await roleService.update(tenant2Role.id, updateData, { tenantId: 1 });
|
|
|
+ expect(updatedRole).toBeNull();
|
|
|
+
|
|
|
+ // 验证租户2的角色没有被修改
|
|
|
+ const originalRole = await roleService.getById(tenant2Role.id, [], { tenantId: 2 });
|
|
|
+ expect(originalRole?.description).toBe('Role for tenant 2');
|
|
|
+ expect(originalRole?.permissions).toEqual(['user:read', 'user:update']);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该拒绝跨租户的角色删除', async () => {
|
|
|
+ // 租户1尝试删除租户2的角色 - 应该返回false
|
|
|
+ const deleteResult = await roleService.delete(tenant2Role.id, { tenantId: 1 });
|
|
|
+ expect(deleteResult).toBe(false);
|
|
|
+
|
|
|
+ // 验证租户2的角色仍然存在
|
|
|
+ const roleStillExists = await roleService.getById(tenant2Role.id, [], { tenantId: 2 });
|
|
|
+ expect(roleStillExists).toBeDefined();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该只在当前租户内搜索角色', async () => {
|
|
|
+ // 在租户1中搜索
|
|
|
+ const [roles1] = await roleService.getList(1, 10, 'role', ['name'], { tenantId: 1 });
|
|
|
+ expect(roles1).toHaveLength(1);
|
|
|
+ expect(roles1[0].name).toBe('tenant1_role');
|
|
|
+
|
|
|
+ // 在租户2中搜索
|
|
|
+ const [roles2] = await roleService.getList(1, 10, 'role', ['name'], { tenantId: 2 });
|
|
|
+ expect(roles2).toHaveLength(1);
|
|
|
+ expect(roles2[0].name).toBe('tenant2_role');
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该根据租户ID正确获取角色名', async () => {
|
|
|
+ // 租户1应该能找到自己的角色
|
|
|
+ const role1 = await roleService.getRoleByName('tenant1_role', 1);
|
|
|
+ expect(role1).toBeDefined();
|
|
|
+ expect(role1?.tenantId).toBe(1);
|
|
|
+
|
|
|
+ // 租户1不应该找到租户2的角色
|
|
|
+ const role2FromTenant1 = await roleService.getRoleByName('tenant2_role', 1);
|
|
|
+ expect(role2FromTenant1).toBeNull();
|
|
|
+
|
|
|
+ // 租户2应该能找到自己的角色
|
|
|
+ const role2 = await roleService.getRoleByName('tenant2_role', 2);
|
|
|
+ expect(role2).toBeDefined();
|
|
|
+ expect(role2?.tenantId).toBe(2);
|
|
|
+
|
|
|
+ // 租户2不应该找到租户1的角色
|
|
|
+ const role1FromTenant2 = await roleService.getRoleByName('tenant1_role', 2);
|
|
|
+ expect(role1FromTenant2).toBeNull();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该正确检查跨租户的权限', async () => {
|
|
|
+ // 租户1应该能检查自己角色的权限
|
|
|
+ const hasPermission1 = await roleService.hasPermission(tenant1Role.id, 'user:read', 1);
|
|
|
+ expect(hasPermission1).toBe(true);
|
|
|
+
|
|
|
+ // 租户1不应该能检查租户2角色的权限
|
|
|
+ const hasPermission2 = await roleService.hasPermission(tenant2Role.id, 'user:read', 1);
|
|
|
+ expect(hasPermission2).toBe(false);
|
|
|
+
|
|
|
+ // 租户2应该能检查自己角色的权限
|
|
|
+ const hasPermission3 = await roleService.hasPermission(tenant2Role.id, 'user:read', 2);
|
|
|
+ expect(hasPermission3).toBe(true);
|
|
|
+
|
|
|
+ // 租户2不应该能检查租户1角色的权限
|
|
|
+ const hasPermission4 = await roleService.hasPermission(tenant1Role.id, 'user:read', 2);
|
|
|
+ expect(hasPermission4).toBe(false);
|
|
|
+ });
|
|
|
+ });
|
|
|
});
|