Commit fba230c2b2012ef74800614400f8699793b9ba3d

Authored by YunaiV
1 parent 619a7b73

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

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 {
48 48 /**
49 49 * LoginUser 的 Context 缓存 Key
50 50 */
51   - private static final String CONTEXT_KEY = SysPermissionServiceImpl.class.getSimpleName();
  51 + public static final String CONTEXT_KEY = SysPermissionServiceImpl.class.getSimpleName();
52 52  
53 53 /**
54 54 * 定时执行 {@link #schedulePeriodicRefresh()} 的周期
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.permission;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
  6 +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
4 7 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO;
5 8 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysUserRoleDO;
6 9 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMenuMapper;
7 10 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysUserRoleMapper;
8 11 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysPermissionProducer;
  12 +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
9 13 import cn.iocoder.yudao.adminserver.modules.system.service.permission.impl.SysPermissionServiceImpl;
  14 +import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO;
  15 +import cn.iocoder.yudao.framework.security.core.LoginUser;
  16 +import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum;
10 17 import org.junit.jupiter.api.Test;
11 18 import org.springframework.boot.test.mock.mockito.MockBean;
12 19 import org.springframework.context.annotation.Import;
... ... @@ -17,8 +24,12 @@ import java.util.List;
17 24 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
18 25 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
19 26 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
20   -import static org.junit.jupiter.api.Assertions.assertEquals;
  27 +import static java.util.Collections.singletonList;
  28 +import static org.junit.jupiter.api.Assertions.*;
  29 +import static org.mockito.ArgumentMatchers.eq;
  30 +import static org.mockito.ArgumentMatchers.same;
21 31 import static org.mockito.Mockito.verify;
  32 +import static org.mockito.Mockito.when;
22 33  
23 34 @Import(SysPermissionServiceImpl.class)
24 35 public class SysPermissionServiceTest extends BaseDbUnitTest {
... ... @@ -35,6 +46,8 @@ public class SysPermissionServiceTest extends BaseDbUnitTest {
35 46 private SysRoleService roleService;
36 47 @MockBean
37 48 private SysMenuService menuService;
  49 + @MockBean
  50 + private SysDeptService deptService;
38 51  
39 52 @MockBean
40 53 private SysPermissionProducer permissionProducer;
... ... @@ -106,4 +119,111 @@ public class SysPermissionServiceTest extends BaseDbUnitTest {
106 119 assertPojoEquals(dbUserRoles.get(0), userRoleDO02);
107 120 }
108 121  
  122 + @Test // 测试从 context 获取的场景
  123 + public void testGetDeptDataPermission_fromContext() {
  124 + // 准备参数
  125 + LoginUser loginUser = randomPojo(LoginUser.class);
  126 + // mock 方法
  127 + DeptDataPermissionRespDTO respDTO = new DeptDataPermissionRespDTO();
  128 + loginUser.setContext(SysPermissionServiceImpl.CONTEXT_KEY, respDTO);
  129 +
  130 + // 调用
  131 + DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(loginUser);
  132 + // 断言
  133 + assertSame(respDTO, result);
  134 + }
  135 +
  136 + @Test
  137 + public void testGetDeptDataPermission_All() {
  138 + // 准备参数
  139 + LoginUser loginUser = randomPojo(LoginUser.class);
  140 + // mock 方法
  141 + SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.ALL.getScope()));
  142 + when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO));
  143 +
  144 + // 调用
  145 + DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(loginUser);
  146 + // 断言
  147 + assertTrue(result.getAll());
  148 + assertFalse(result.getSelf());
  149 + assertTrue(CollUtil.isEmpty(result.getDeptIds()));
  150 + assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
  151 + }
  152 +
  153 + @Test
  154 + public void testGetDeptDataPermission_DeptCustom() {
  155 + // 准备参数
  156 + LoginUser loginUser = randomPojo(LoginUser.class);
  157 + // mock 方法
  158 + SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_CUSTOM.getScope()));
  159 + when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO));
  160 +
  161 + // 调用
  162 + DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(loginUser);
  163 + // 断言
  164 + assertFalse(result.getAll());
  165 + assertFalse(result.getSelf());
  166 + assertEquals(roleDO.getDataScopeDeptIds().size() + 1, result.getDeptIds().size());
  167 + assertTrue(CollUtil.containsAll(result.getDeptIds(), roleDO.getDataScopeDeptIds()));
  168 + assertTrue(CollUtil.contains(result.getDeptIds(), loginUser.getDeptId()));
  169 + assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
  170 + }
  171 +
  172 + @Test
  173 + public void testGetDeptDataPermission_DeptOnly() {
  174 + // 准备参数
  175 + LoginUser loginUser = randomPojo(LoginUser.class);
  176 + // mock 方法
  177 + SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_ONLY.getScope()));
  178 + when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO));
  179 +
  180 + // 调用
  181 + DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(loginUser);
  182 + // 断言
  183 + assertFalse(result.getAll());
  184 + assertFalse(result.getSelf());
  185 + assertEquals(1, result.getDeptIds().size());
  186 + assertTrue(CollUtil.contains(result.getDeptIds(), loginUser.getDeptId()));
  187 + assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
  188 + }
  189 +
  190 + @Test
  191 + public void testGetDeptDataPermission_DeptAndChild() {
  192 + // 准备参数
  193 + LoginUser loginUser = randomPojo(LoginUser.class);
  194 + // mock 方法(角色)
  195 + SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_AND_CHILD.getScope()));
  196 + when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO));
  197 + // mock 方法(部门)
  198 + SysDeptDO deptDO = randomPojo(SysDeptDO.class);
  199 + when(deptService.getDeptsByParentIdFromCache(eq(loginUser.getDeptId()), eq(true)))
  200 + .thenReturn(singletonList(deptDO));
  201 +
  202 + // 调用
  203 + DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(loginUser);
  204 + // 断言
  205 + assertFalse(result.getAll());
  206 + assertFalse(result.getSelf());
  207 + assertEquals(1, result.getDeptIds().size());
  208 + assertTrue(CollUtil.contains(result.getDeptIds(), deptDO.getId()));
  209 + assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
  210 + }
  211 +
  212 + @Test
  213 + public void testGetDeptDataPermission_Self() {
  214 + // 准备参数
  215 + LoginUser loginUser = randomPojo(LoginUser.class);
  216 + // mock 方法
  217 + SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> o.setDataScope(DataScopeEnum.SELF.getScope()));
  218 + when(roleService.getRolesFromCache(same(loginUser.getRoleIds()))).thenReturn(singletonList(roleDO));
  219 +
  220 + // 调用
  221 + DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(loginUser);
  222 + // 断言
  223 + assertFalse(result.getAll());
  224 + assertTrue(result.getSelf());
  225 + assertTrue(CollUtil.isEmpty(result.getDeptIds()));
  226 + assertSame(result, loginUser.getContext(SysPermissionServiceImpl.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
  227 + }
  228 +
109 229 }
... ...