Commit fba230c2b2012ef74800614400f8699793b9ba3d
1 parent
619a7b73
完善 SysPermissionServiceImpl 数据权限相关的单元测试
Showing
2 changed files
with
122 additions
and
2 deletions
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,7 +48,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { | ||
| 48 | /** | 48 | /** |
| 49 | * LoginUser 的 Context 缓存 Key | 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 | * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 | 54 | * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 |
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java
| 1 | package cn.iocoder.yudao.adminserver.modules.system.service.permission; | 1 | package cn.iocoder.yudao.adminserver.modules.system.service.permission; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.collection.CollUtil; | ||
| 3 | import cn.iocoder.yudao.adminserver.BaseDbUnitTest; | 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 | import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO; | 7 | import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO; |
| 5 | import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysUserRoleDO; | 8 | import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysUserRoleDO; |
| 6 | import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMenuMapper; | 9 | import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMenuMapper; |
| 7 | import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysUserRoleMapper; | 10 | import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysUserRoleMapper; |
| 8 | import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysPermissionProducer; | 11 | import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysPermissionProducer; |
| 12 | +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; | ||
| 9 | import cn.iocoder.yudao.adminserver.modules.system.service.permission.impl.SysPermissionServiceImpl; | 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 | import org.junit.jupiter.api.Test; | 17 | import org.junit.jupiter.api.Test; |
| 11 | import org.springframework.boot.test.mock.mockito.MockBean; | 18 | import org.springframework.boot.test.mock.mockito.MockBean; |
| 12 | import org.springframework.context.annotation.Import; | 19 | import org.springframework.context.annotation.Import; |
| @@ -17,8 +24,12 @@ import java.util.List; | @@ -17,8 +24,12 @@ import java.util.List; | ||
| 17 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; | 24 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; |
| 18 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; | 25 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; |
| 19 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | 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 | import static org.mockito.Mockito.verify; | 31 | import static org.mockito.Mockito.verify; |
| 32 | +import static org.mockito.Mockito.when; | ||
| 22 | 33 | ||
| 23 | @Import(SysPermissionServiceImpl.class) | 34 | @Import(SysPermissionServiceImpl.class) |
| 24 | public class SysPermissionServiceTest extends BaseDbUnitTest { | 35 | public class SysPermissionServiceTest extends BaseDbUnitTest { |
| @@ -35,6 +46,8 @@ public class SysPermissionServiceTest extends BaseDbUnitTest { | @@ -35,6 +46,8 @@ public class SysPermissionServiceTest extends BaseDbUnitTest { | ||
| 35 | private SysRoleService roleService; | 46 | private SysRoleService roleService; |
| 36 | @MockBean | 47 | @MockBean |
| 37 | private SysMenuService menuService; | 48 | private SysMenuService menuService; |
| 49 | + @MockBean | ||
| 50 | + private SysDeptService deptService; | ||
| 38 | 51 | ||
| 39 | @MockBean | 52 | @MockBean |
| 40 | private SysPermissionProducer permissionProducer; | 53 | private SysPermissionProducer permissionProducer; |
| @@ -106,4 +119,111 @@ public class SysPermissionServiceTest extends BaseDbUnitTest { | @@ -106,4 +119,111 @@ public class SysPermissionServiceTest extends BaseDbUnitTest { | ||
| 106 | assertPojoEquals(dbUserRoles.get(0), userRoleDO02); | 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 | } |