Преглед на файлове

完善 SysPermissionServiceImpl 数据权限相关的单元测试

YunaiV преди 3 години
родител
ревизия
fba230c2b2

+ 1 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java

@@ -48,7 +48,7 @@ public class SysPermissionServiceImpl implements SysPermissionService {
     /**
      * LoginUser 的 Context 缓存 Key
      */
-    private static final String CONTEXT_KEY = SysPermissionServiceImpl.class.getSimpleName();
+    public static final String CONTEXT_KEY = SysPermissionServiceImpl.class.getSimpleName();
 
     /**
      * 定时执行 {@link #schedulePeriodicRefresh()} 的周期

+ 121 - 1
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java

@@ -1,12 +1,19 @@
 package cn.iocoder.yudao.adminserver.modules.system.service.permission;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
+import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
+import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysUserRoleDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMenuMapper;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysUserRoleMapper;
 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysPermissionProducer;
+import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.impl.SysPermissionServiceImpl;
+import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO;
+import cn.iocoder.yudao.framework.security.core.LoginUser;
+import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.Import;
@@ -17,8 +24,12 @@ import java.util.List;
 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static java.util.Collections.singletonList;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.same;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 @Import(SysPermissionServiceImpl.class)
 public class SysPermissionServiceTest extends BaseDbUnitTest {
@@ -35,6 +46,8 @@ public class SysPermissionServiceTest extends BaseDbUnitTest {
     private SysRoleService roleService;
     @MockBean
     private SysMenuService menuService;
+    @MockBean
+    private SysDeptService deptService;
 
     @MockBean
     private SysPermissionProducer permissionProducer;
@@ -106,4 +119,111 @@ public class SysPermissionServiceTest extends BaseDbUnitTest {
         assertPojoEquals(dbUserRoles.get(0), userRoleDO02);
     }
 
+    @Test // 测试从 context 获取的场景
+    public void testGetDeptDataPermission_fromContext() {
+        // 准备参数
+        LoginUser loginUser = randomPojo(LoginUser.class);
+        // mock 方法
+        DeptDataPermissionRespDTO respDTO = new DeptDataPermissionRespDTO();
+        loginUser.setContext(SysPermissionServiceImpl.CONTEXT_KEY, respDTO);
+
+        // 调用
+        DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(loginUser);
+        // 断言
+        assertSame(respDTO, result);
+    }
+
+    @Test
+    public void testGetDeptDataPermission_All() {
+        // 准备参数
+        LoginUser loginUser = randomPojo(LoginUser.class);
+        // mock 方法
+        SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.ALL.getScope()));
+        when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO));
+
+        // 调用
+        DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(loginUser);
+        // 断言
+        assertTrue(result.getAll());
+        assertFalse(result.getSelf());
+        assertTrue(CollUtil.isEmpty(result.getDeptIds()));
+        assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
+    }
+
+    @Test
+    public void testGetDeptDataPermission_DeptCustom() {
+        // 准备参数
+        LoginUser loginUser = randomPojo(LoginUser.class);
+        // mock 方法
+        SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_CUSTOM.getScope()));
+        when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO));
+
+        // 调用
+        DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(loginUser);
+        // 断言
+        assertFalse(result.getAll());
+        assertFalse(result.getSelf());
+        assertEquals(roleDO.getDataScopeDeptIds().size() + 1, result.getDeptIds().size());
+        assertTrue(CollUtil.containsAll(result.getDeptIds(), roleDO.getDataScopeDeptIds()));
+        assertTrue(CollUtil.contains(result.getDeptIds(), loginUser.getDeptId()));
+        assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
+    }
+
+    @Test
+    public void testGetDeptDataPermission_DeptOnly() {
+        // 准备参数
+        LoginUser loginUser = randomPojo(LoginUser.class);
+        // mock 方法
+        SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_ONLY.getScope()));
+        when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO));
+
+        // 调用
+        DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(loginUser);
+        // 断言
+        assertFalse(result.getAll());
+        assertFalse(result.getSelf());
+        assertEquals(1, result.getDeptIds().size());
+        assertTrue(CollUtil.contains(result.getDeptIds(), loginUser.getDeptId()));
+        assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
+    }
+
+    @Test
+    public void testGetDeptDataPermission_DeptAndChild() {
+        // 准备参数
+        LoginUser loginUser = randomPojo(LoginUser.class);
+        // mock 方法(角色)
+        SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_AND_CHILD.getScope()));
+        when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO));
+        // mock 方法(部门)
+        SysDeptDO deptDO = randomPojo(SysDeptDO.class);
+        when(deptService.getDeptsByParentIdFromCache(eq(loginUser.getDeptId()), eq(true)))
+                .thenReturn(singletonList(deptDO));
+
+        // 调用
+        DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(loginUser);
+        // 断言
+        assertFalse(result.getAll());
+        assertFalse(result.getSelf());
+        assertEquals(1, result.getDeptIds().size());
+        assertTrue(CollUtil.contains(result.getDeptIds(), deptDO.getId()));
+        assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
+    }
+
+    @Test
+    public void testGetDeptDataPermission_Self() {
+        // 准备参数
+        LoginUser loginUser = randomPojo(LoginUser.class);
+        // mock 方法
+        SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.SELF.getScope()));
+        when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO));
+
+        // 调用
+        DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(loginUser);
+        // 断言
+        assertFalse(result.getAll());
+        assertTrue(result.getSelf());
+        assertTrue(CollUtil.isEmpty(result.getDeptIds()));
+        assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
+    }
+
 }