Commit ef9dfda300b07acb6b577c3447aa291ea48717db

Authored by YunaiV
2 parents 72ad1234 20840a3a

Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.2-postgresql

yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceTest.java
1 -//package cn.iocoder.yudao.module.system.service.permission;  
2 -//  
3 -//import cn.hutool.core.bean.BeanUtil;  
4 -//import cn.hutool.core.lang.Assert;  
5 -//import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;  
6 -//import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;  
7 -//import cn.iocoder.yudao.framework.common.util.spring.SpringAopUtils;  
8 -//import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuCreateReqVO;  
9 -//import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO;  
10 -//import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuUpdateReqVO;  
11 -//import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;  
12 -//import cn.iocoder.yudao.module.system.dal.mysql.permission.MenuMapper;  
13 -//import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum;  
14 -//import cn.iocoder.yudao.module.system.mq.producer.permission.MenuProducer;  
15 -//import cn.iocoder.yudao.module.system.service.tenant.TenantService;  
16 -//import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;  
17 -//import com.google.common.collect.Multimap;  
18 -//import org.junit.jupiter.api.Test;  
19 -//import org.springframework.boot.test.mock.mockito.MockBean;  
20 -//import org.springframework.context.annotation.Import;  
21 -//  
22 -//import javax.annotation.Resource;  
23 -//import java.util.*;  
24 -//  
25 -//import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;  
26 -//import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;  
27 -//import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;  
28 -//import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;  
29 -//import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;  
30 -//import static org.junit.jupiter.api.Assertions.*;  
31 -//import static org.mockito.ArgumentMatchers.argThat;  
32 -//import static org.mockito.Mockito.doNothing;  
33 -//import static org.mockito.Mockito.verify;  
34 -//  
35 -//// TODO @芋艿:单测的代码质量可以提升下  
36 -//@Import(MenuServiceImpl.class)  
37 -//public class MenuServiceTest extends BaseDbUnitTest {  
38 -//  
39 -// @Resource  
40 -// private MenuServiceImpl menuService;  
41 -//  
42 -// @Resource  
43 -// private MenuMapper menuMapper;  
44 -//  
45 -// @MockBean  
46 -// private PermissionService permissionService;  
47 -// @MockBean  
48 -// private MenuProducer menuProducer;  
49 -// @MockBean  
50 -// private TenantService tenantService;  
51 -//  
52 -// @Test  
53 -// public void testInitLocalCache_success() throws Exception {  
54 -// MenuDO menuDO1 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L);  
55 -// menuMapper.insert(menuDO1);  
56 -// MenuDO menuDO2 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L);  
57 -// menuMapper.insert(menuDO2);  
58 -//  
59 -// // 调用  
60 -// menuService.initLocalCache();  
61 -//  
62 -// // 获取代理对象  
63 -// MenuServiceImpl target = (MenuServiceImpl) SpringAopUtils.getTarget(menuService);  
64 -//  
65 -// Map<Long, MenuDO> menuCache =  
66 -// (Map<Long, MenuDO>) BeanUtil.getFieldValue(target, "menuCache");  
67 -// Assert.isTrue(menuCache.size() == 2);  
68 -// assertPojoEquals(menuDO1, menuCache.get(menuDO1.getId()));  
69 -// assertPojoEquals(menuDO2, menuCache.get(menuDO2.getId()));  
70 -//  
71 -// Multimap<String, MenuDO> permissionMenuCache =  
72 -// (Multimap<String, MenuDO>) BeanUtil.getFieldValue(target, "permissionMenuCache");  
73 -// Assert.isTrue(permissionMenuCache.size() == 2);  
74 -// assertPojoEquals(menuDO1, permissionMenuCache.get(menuDO1.getPermission()));  
75 -// assertPojoEquals(menuDO2, permissionMenuCache.get(menuDO2.getPermission()));  
76 -//  
77 -// Date maxUpdateTime = (Date) BeanUtil.getFieldValue(target, "maxUpdateTime");  
78 -// assertEquals(ObjectUtils.max(menuDO1.getUpdateTime(), menuDO2.getUpdateTime()), maxUpdateTime);  
79 -// }  
80 -//  
81 -// @Test  
82 -// public void testCreateMenu_success() {  
83 -// //构造父目录  
84 -// MenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L);  
85 -// menuMapper.insert(menuDO);  
86 -// Long parentId = menuDO.getId();  
87 -//  
88 -// //调用  
89 -// MenuCreateReqVO vo = randomPojo(MenuCreateReqVO.class, o -> {  
90 -// o.setParentId(parentId);  
91 -// o.setName("testSonName");  
92 -// o.setType(MenuTypeEnum.MENU.getType());  
93 -// o.setStatus(randomCommonStatus());  
94 -// });  
95 -// Long menuId = menuService.createMenu(vo);  
96 -//  
97 -// //断言  
98 -// assertNotNull(menuId);  
99 -// // 校验记录的属性是否正确  
100 -// MenuDO ret = menuMapper.selectById(menuId);  
101 -// assertPojoEquals(vo, ret);  
102 -// // 校验调用  
103 -// verify(menuProducer).sendMenuRefreshMessage();  
104 -// }  
105 -//  
106 -// @Test  
107 -// public void testUpdateMenu_success() {  
108 -// //构造父子目录  
109 -// MenuDO sonMenuDO = initParentAndSonMenuDO();  
110 -// Long sonId = sonMenuDO.getId();  
111 -// Long parentId = sonMenuDO.getParentId();  
112 -//  
113 -// //调用  
114 -// MenuUpdateReqVO vo = randomPojo(MenuUpdateReqVO.class, o -> {  
115 -// o.setId(sonId);  
116 -// o.setParentId(parentId);  
117 -// o.setType(MenuTypeEnum.MENU.getType());  
118 -// o.setStatus(randomCommonStatus());  
119 -// o.setName("pppppp"); //修改名字  
120 -// });  
121 -// menuService.updateMenu(vo);  
122 -//  
123 -// //断言  
124 -// // 校验记录的属性是否正确  
125 -// MenuDO ret = menuMapper.selectById(sonId);  
126 -// assertPojoEquals(vo, ret);  
127 -// // 校验调用  
128 -// verify(menuProducer).sendMenuRefreshMessage();  
129 -// }  
130 -//  
131 -// @Test  
132 -// public void testUpdateMenu_sonIdNotExist() {  
133 -// Long sonId = 99999L;  
134 -// Long parentId = 10000L;  
135 -//  
136 -// //调用  
137 -// MenuUpdateReqVO vo = randomPojo(MenuUpdateReqVO.class, o -> {  
138 -// o.setId(sonId);  
139 -// o.setParentId(parentId);  
140 -// o.setType(MenuTypeEnum.MENU.getType());  
141 -// o.setStatus(randomCommonStatus());  
142 -// });  
143 -// //断言  
144 -// assertServiceException(() -> menuService.updateMenu(vo), MENU_NOT_EXISTS);  
145 -// }  
146 -//  
147 -// @Test  
148 -// public void testDeleteMenu_success() {  
149 -// MenuDO sonMenuDO = initParentAndSonMenuDO();  
150 -// Long sonId = sonMenuDO.getId();  
151 -//  
152 -// // 调用  
153 -// menuService.deleteMenu(sonId);  
154 -//  
155 -// // 断言  
156 -// MenuDO menuDO = menuMapper.selectById(sonId);  
157 -// assertNull(menuDO);  
158 -// verify(permissionService).processMenuDeleted(sonId);  
159 -// verify(menuProducer).sendMenuRefreshMessage();  
160 -// }  
161 -//  
162 -// @Test  
163 -// public void testDeleteMenu_menuNotExist() {  
164 -// Long sonId = 99999L;  
165 -//  
166 -// assertServiceException(() -> menuService.deleteMenu(sonId), MENU_NOT_EXISTS);  
167 -// }  
168 -//  
169 -// @Test  
170 -// public void testDeleteMenu_existChildren() {  
171 -// MenuDO sonMenu = initParentAndSonMenuDO();  
172 -// Long parentId = sonMenu.getParentId();  
173 -//  
174 -// assertServiceException(() -> menuService.deleteMenu(parentId), MENU_EXISTS_CHILDREN);  
175 -// }  
176 -//  
177 -// @Test  
178 -// public void testGetMenus() {  
179 -// // mock 数据  
180 -// MenuDO menu100 = randomPojo(MenuDO.class, o -> o.setId(100L).setStatus(CommonStatusEnum.ENABLE.getStatus()));  
181 -// menuMapper.insert(menu100);  
182 -// MenuDO menu101 = randomPojo(MenuDO.class, o -> o.setId(101L).setStatus(CommonStatusEnum.DISABLE.getStatus()));  
183 -// menuMapper.insert(menu101);  
184 -// // 准备参数  
185 -// MenuListReqVO reqVO = new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus());  
186 -//  
187 -// // 调用  
188 -// List<MenuDO> result = menuService.getMenus(reqVO);  
189 -// // 断言  
190 -// assertEquals(1, result.size());  
191 -// assertPojoEquals(menu100, result.get(0));  
192 -// }  
193 -//  
194 -// @Test  
195 -// public void testTenantMenus() {  
196 -// // mock 数据  
197 -// MenuDO menu100 = randomPojo(MenuDO.class, o -> o.setId(100L).setStatus(CommonStatusEnum.ENABLE.getStatus()));  
198 -// menuMapper.insert(menu100);  
199 -// MenuDO menu101 = randomPojo(MenuDO.class, o -> o.setId(101L).setStatus(CommonStatusEnum.DISABLE.getStatus()));  
200 -// menuMapper.insert(menu101);  
201 -// MenuDO menu102 = randomPojo(MenuDO.class, o -> o.setId(102L).setStatus(CommonStatusEnum.ENABLE.getStatus()));  
202 -// menuMapper.insert(menu102);  
203 -// // mock 过滤菜单  
204 -// // mock 账户额度充足  
205 -// Set<Long> menuIds = asSet(100L, 101L);  
206 -// doNothing().when(tenantService).handleTenantMenu(argThat(handler -> {  
207 -// handler.handle(menuIds);  
208 -// return true;  
209 -// }));  
210 -// // 准备参数  
211 -// MenuListReqVO reqVO = new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus());  
212 -//  
213 -// // 调用  
214 -// List<MenuDO> result = menuService.getTenantMenus(reqVO);  
215 -// // 断言  
216 -// assertEquals(1, result.size());  
217 -// assertPojoEquals(menu100, result.get(0));  
218 -// }  
219 -//  
220 -// @Test  
221 -// public void testGetMenusReqVo_success() {  
222 -// Map<Long, MenuDO> idMenuMap = new HashMap<>();  
223 -// // 用于验证可以模糊搜索名称包含"name",状态为1的menu  
224 -// MenuDO menu = createMenuDO(MenuTypeEnum.MENU, "name2", 0L, 1);  
225 -// menuMapper.insert(menu);  
226 -// idMenuMap.put(menu.getId(), menu);  
227 -//  
228 -// menu = createMenuDO(MenuTypeEnum.MENU, "11name111", 0L, 1);  
229 -// menuMapper.insert(menu);  
230 -// idMenuMap.put(menu.getId(), menu);  
231 -//  
232 -// menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 1);  
233 -// menuMapper.insert(menu);  
234 -// idMenuMap.put(menu.getId(), menu);  
235 -//  
236 -// // 以下是不符合搜索条件的的menu  
237 -// menu = createMenuDO(MenuTypeEnum.MENU, "xxxxxx", 0L, 1);  
238 -// menuMapper.insert(menu);  
239 -// menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 2);  
240 -// menuMapper.insert(menu);  
241 -//  
242 -// // 调用  
243 -// MenuListReqVO reqVO = new MenuListReqVO();  
244 -// reqVO.setStatus(1);  
245 -// reqVO.setName("name");  
246 -// List<MenuDO> menuDOS = menuService.getMenus(reqVO);  
247 -//  
248 -// // 断言  
249 -// assertEquals(menuDOS.size(), idMenuMap.size());  
250 -// menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));  
251 -// }  
252 -//  
253 -// @Test  
254 -// public void testListMenusFromCache_success() throws Exception {  
255 -// Map<Long, MenuDO> mockCacheMap = new HashMap<>();  
256 -// // 获取代理对象  
257 -// MenuServiceImpl target = (MenuServiceImpl) SpringAopUtils.getTarget(menuService);  
258 -// BeanUtil.setFieldValue(target, "menuCache", mockCacheMap);  
259 -//  
260 -// Map<Long, MenuDO> idMenuMap = new HashMap<>();  
261 -// // 用于验证搜索类型为MENU,状态为1的menu  
262 -// MenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1);  
263 -// mockCacheMap.put(menuDO.getId(), menuDO);  
264 -// idMenuMap.put(menuDO.getId(), menuDO);  
265 -//  
266 -// menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1);  
267 -// mockCacheMap.put(menuDO.getId(), menuDO);  
268 -// idMenuMap.put(menuDO.getId(), menuDO);  
269 -//  
270 -// // 以下是不符合搜索条件的menu  
271 -// menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1);  
272 -// mockCacheMap.put(menuDO.getId(), menuDO);  
273 -// menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2);  
274 -// mockCacheMap.put(menuDO.getId(), menuDO);  
275 -//  
276 -// List<MenuDO> menuDOS = menuService.getMenuListFromCache(Collections.singletonList(MenuTypeEnum.MENU.getType()),  
277 -// Collections.singletonList(CommonStatusEnum.DISABLE.getStatus()));  
278 -// assertEquals(menuDOS.size(), idMenuMap.size());  
279 -// menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));  
280 -// }  
281 -//  
282 -// @Test  
283 -// public void testListMenusFromCache2_success() throws Exception {  
284 -// Map<Long, MenuDO> mockCacheMap = new HashMap<>();  
285 -// // 获取代理对象  
286 -// MenuServiceImpl target = (MenuServiceImpl) SpringAopUtils.getTarget(menuService);  
287 -// BeanUtil.setFieldValue(target, "menuCache", mockCacheMap);  
288 -//  
289 -// Map<Long, MenuDO> idMenuMap = new HashMap<>();  
290 -// // 验证搜索id为1, 类型为MENU, 状态为1 的menu  
291 -// MenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1);  
292 -// mockCacheMap.put(menuDO.getId(), menuDO);  
293 -// idMenuMap.put(menuDO.getId(), menuDO);  
294 -//  
295 -// // 以下是不符合搜索条件的menu  
296 -// menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1);  
297 -// mockCacheMap.put(menuDO.getId(), menuDO);  
298 -// menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1);  
299 -// mockCacheMap.put(menuDO.getId(), menuDO);  
300 -// menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2);  
301 -// mockCacheMap.put(menuDO.getId(), menuDO);  
302 -//  
303 -// List<MenuDO> menuDOS = menuService.getMenuListFromCache(Collections.singletonList(1L),  
304 -// Collections.singletonList(MenuTypeEnum.MENU.getType()), Collections.singletonList(1));  
305 -// assertEquals(menuDOS.size(), idMenuMap.size());  
306 -// menuDOS.forEach(menu -> assertPojoEquals(idMenuMap.get(menu.getId()), menu));  
307 -// }  
308 -//  
309 -// @Test  
310 -// public void testCheckParentResource_success() {  
311 -// MenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L);  
312 -// menuMapper.insert(menuDO);  
313 -// Long parentId = menuDO.getId();  
314 -//  
315 -// menuService.checkParentResource(parentId, null);  
316 -// }  
317 -//  
318 -// @Test  
319 -// public void testCheckParentResource_canNotSetSelfToBeParent() {  
320 -// assertServiceException(() -> menuService.checkParentResource(1L, 1L), MENU_PARENT_ERROR);  
321 -// }  
322 -//  
323 -// @Test  
324 -// public void testCheckParentResource_parentNotExist() {  
325 -// assertServiceException(() -> menuService.checkParentResource(randomLongId(), null), MENU_PARENT_NOT_EXISTS);  
326 -// }  
327 -//  
328 -// @Test  
329 -// public void testCheckParentResource_parentTypeError() {  
330 -// MenuDO menuDO = createMenuDO(MenuTypeEnum.BUTTON, "parent", 0L);  
331 -// menuMapper.insert(menuDO);  
332 -// Long parentId = menuDO.getId();  
333 -//  
334 -// assertServiceException(() -> menuService.checkParentResource(parentId, null), MENU_PARENT_NOT_DIR_OR_MENU);  
335 -// }  
336 -//  
337 -// @Test  
338 -// public void testCheckResource_success() {  
339 -// MenuDO sonMenu = initParentAndSonMenuDO();  
340 -// Long parentId = sonMenu.getParentId();  
341 -//  
342 -// Long otherSonMenuId = randomLongId();  
343 -// String otherSonMenuName = randomString();  
344 -//  
345 -// menuService.checkResource(parentId, otherSonMenuName, otherSonMenuId);  
346 -// }  
347 -//  
348 -// @Test  
349 -// public void testCheckResource_sonMenuNameDuplicate(){  
350 -// MenuDO sonMenu=initParentAndSonMenuDO();  
351 -// Long parentId=sonMenu.getParentId();  
352 -//  
353 -// Long otherSonMenuId=randomLongId();  
354 -// String otherSonMenuName=sonMenu.getName(); //相同名称  
355 -//  
356 -// assertServiceException(() -> menuService.checkResource(parentId, otherSonMenuName, otherSonMenuId), MENU_NAME_DUPLICATE);  
357 -// }  
358 -//  
359 -// /**  
360 -// * 构造父子目录,返回子目录  
361 -// *  
362 -// * @return  
363 -// */  
364 -// private MenuDO initParentAndSonMenuDO() {  
365 -// //构造父子目录  
366 -// MenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L);  
367 -// menuMapper.insert(menuDO);  
368 -// Long parentId = menuDO.getId();  
369 -//  
370 -// MenuDO sonMenuDO = createMenuDO(MenuTypeEnum.MENU, "testSonName", parentId);  
371 -// menuMapper.insert(sonMenuDO);  
372 -// return sonMenuDO;  
373 -// }  
374 -//  
375 -// private MenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId) {  
376 -// return createMenuDO(typeEnum, menuName, parentId, randomCommonStatus());  
377 -// }  
378 -//  
379 -// private MenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) {  
380 -// return createMenuDO(null, typeEnum, menuName, parentId, status);  
381 -// }  
382 -//  
383 -// private MenuDO createMenuDO(Long id, MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) {  
384 -// return randomPojo(MenuDO.class, o -> {  
385 -// o.setId(id);  
386 -// o.setParentId(parentId);  
387 -// o.setType(typeEnum.getType());  
388 -// o.setStatus(status);  
389 -// o.setName(menuName);  
390 -// });  
391 -// }  
392 -//  
393 -//} 1 +package cn.iocoder.yudao.module.system.service.permission;
  2 +
  3 +import cn.hutool.core.bean.BeanUtil;
  4 +import cn.hutool.core.lang.Assert;
  5 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  6 +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
  7 +import cn.iocoder.yudao.framework.common.util.spring.SpringAopUtils;
  8 +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuCreateReqVO;
  9 +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
  10 +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuUpdateReqVO;
  11 +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
  12 +import cn.iocoder.yudao.module.system.dal.mysql.permission.MenuMapper;
  13 +import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum;
  14 +import cn.iocoder.yudao.module.system.mq.producer.permission.MenuProducer;
  15 +import cn.iocoder.yudao.module.system.service.tenant.TenantService;
  16 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  17 +import com.google.common.collect.Multimap;
  18 +import org.junit.jupiter.api.Test;
  19 +import org.springframework.boot.test.mock.mockito.MockBean;
  20 +import org.springframework.context.annotation.Import;
  21 +
  22 +import javax.annotation.Resource;
  23 +import java.util.*;
  24 +
  25 +import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;
  26 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  27 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
  28 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
  29 +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
  30 +import static org.junit.jupiter.api.Assertions.*;
  31 +import static org.mockito.ArgumentMatchers.argThat;
  32 +import static org.mockito.Mockito.doNothing;
  33 +import static org.mockito.Mockito.verify;
  34 +
  35 +// TODO @芋艿:单测的代码质量可以提升下
  36 +@Import(MenuServiceImpl.class)
  37 +public class MenuServiceTest extends BaseDbUnitTest {
  38 +
  39 + @Resource
  40 + private MenuServiceImpl menuService;
  41 +
  42 + @Resource
  43 + private MenuMapper menuMapper;
  44 +
  45 + @MockBean
  46 + private PermissionService permissionService;
  47 + @MockBean
  48 + private MenuProducer menuProducer;
  49 + @MockBean
  50 + private TenantService tenantService;
  51 +
  52 + @Test
  53 + public void testInitLocalCache_success() throws Exception {
  54 + MenuDO menuDO1 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L);
  55 + menuMapper.insert(menuDO1);
  56 + MenuDO menuDO2 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L);
  57 + menuMapper.insert(menuDO2);
  58 +
  59 + // 调用
  60 + menuService.initLocalCache();
  61 +
  62 + // 获取代理对象
  63 + MenuServiceImpl target = (MenuServiceImpl) SpringAopUtils.getTarget(menuService);
  64 +
  65 + Map<Long, MenuDO> menuCache =
  66 + (Map<Long, MenuDO>) BeanUtil.getFieldValue(target, "menuCache");
  67 + Assert.isTrue(menuCache.size() == 2);
  68 + assertPojoEquals(menuDO1, menuCache.get(menuDO1.getId()));
  69 + assertPojoEquals(menuDO2, menuCache.get(menuDO2.getId()));
  70 +
  71 + Multimap<String, MenuDO> permissionMenuCache =
  72 + (Multimap<String, MenuDO>) BeanUtil.getFieldValue(target, "permissionMenuCache");
  73 + Assert.isTrue(permissionMenuCache.size() == 2);
  74 + assertPojoEquals(menuDO1, permissionMenuCache.get(menuDO1.getPermission()));
  75 + assertPojoEquals(menuDO2, permissionMenuCache.get(menuDO2.getPermission()));
  76 +
  77 + Date maxUpdateTime = (Date) BeanUtil.getFieldValue(target, "maxUpdateTime");
  78 + assertEquals(ObjectUtils.max(menuDO1.getUpdateTime(), menuDO2.getUpdateTime()), maxUpdateTime);
  79 + }
  80 +
  81 + @Test
  82 + public void testCreateMenu_success() {
  83 + //构造父目录
  84 + MenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L);
  85 + menuMapper.insert(menuDO);
  86 + Long parentId = menuDO.getId();
  87 +
  88 + //调用
  89 + MenuCreateReqVO vo = randomPojo(MenuCreateReqVO.class, o -> {
  90 + o.setParentId(parentId);
  91 + o.setName("testSonName");
  92 + o.setType(MenuTypeEnum.MENU.getType());
  93 + o.setStatus(randomCommonStatus());
  94 + });
  95 + Long menuId = menuService.createMenu(vo);
  96 +
  97 + //断言
  98 + assertNotNull(menuId);
  99 + // 校验记录的属性是否正确
  100 + MenuDO ret = menuMapper.selectById(menuId);
  101 + assertPojoEquals(vo, ret);
  102 + // 校验调用
  103 + verify(menuProducer).sendMenuRefreshMessage();
  104 + }
  105 +
  106 + @Test
  107 + public void testUpdateMenu_success() {
  108 + //构造父子目录
  109 + MenuDO sonMenuDO = initParentAndSonMenuDO();
  110 + Long sonId = sonMenuDO.getId();
  111 + Long parentId = sonMenuDO.getParentId();
  112 +
  113 + //调用
  114 + MenuUpdateReqVO vo = randomPojo(MenuUpdateReqVO.class, o -> {
  115 + o.setId(sonId);
  116 + o.setParentId(parentId);
  117 + o.setType(MenuTypeEnum.MENU.getType());
  118 + o.setStatus(randomCommonStatus());
  119 + o.setName("pppppp"); //修改名字
  120 + });
  121 + menuService.updateMenu(vo);
  122 +
  123 + //断言
  124 + // 校验记录的属性是否正确
  125 + MenuDO ret = menuMapper.selectById(sonId);
  126 + assertPojoEquals(vo, ret);
  127 + // 校验调用
  128 + verify(menuProducer).sendMenuRefreshMessage();
  129 + }
  130 +
  131 + @Test
  132 + public void testUpdateMenu_sonIdNotExist() {
  133 + Long sonId = 99999L;
  134 + Long parentId = 10000L;
  135 +
  136 + //调用
  137 + MenuUpdateReqVO vo = randomPojo(MenuUpdateReqVO.class, o -> {
  138 + o.setId(sonId);
  139 + o.setParentId(parentId);
  140 + o.setType(MenuTypeEnum.MENU.getType());
  141 + o.setStatus(randomCommonStatus());
  142 + });
  143 + //断言
  144 + assertServiceException(() -> menuService.updateMenu(vo), MENU_NOT_EXISTS);
  145 + }
  146 +
  147 + @Test
  148 + public void testDeleteMenu_success() {
  149 + MenuDO sonMenuDO = initParentAndSonMenuDO();
  150 + Long sonId = sonMenuDO.getId();
  151 +
  152 + // 调用
  153 + menuService.deleteMenu(sonId);
  154 +
  155 + // 断言
  156 + MenuDO menuDO = menuMapper.selectById(sonId);
  157 + assertNull(menuDO);
  158 + verify(permissionService).processMenuDeleted(sonId);
  159 + verify(menuProducer).sendMenuRefreshMessage();
  160 + }
  161 +
  162 + @Test
  163 + public void testDeleteMenu_menuNotExist() {
  164 + Long sonId = 99999L;
  165 +
  166 + assertServiceException(() -> menuService.deleteMenu(sonId), MENU_NOT_EXISTS);
  167 + }
  168 +
  169 + @Test
  170 + public void testDeleteMenu_existChildren() {
  171 + MenuDO sonMenu = initParentAndSonMenuDO();
  172 + Long parentId = sonMenu.getParentId();
  173 +
  174 + assertServiceException(() -> menuService.deleteMenu(parentId), MENU_EXISTS_CHILDREN);
  175 + }
  176 +
  177 + @Test
  178 + public void testGetMenus() {
  179 + // mock 数据
  180 + MenuDO menu100 = randomPojo(MenuDO.class, o -> o.setId(100L).setStatus(CommonStatusEnum.ENABLE.getStatus()));
  181 + menuMapper.insert(menu100);
  182 + MenuDO menu101 = randomPojo(MenuDO.class, o -> o.setId(101L).setStatus(CommonStatusEnum.DISABLE.getStatus()));
  183 + menuMapper.insert(menu101);
  184 + // 准备参数
  185 + MenuListReqVO reqVO = new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus());
  186 +
  187 + // 调用
  188 + List<MenuDO> result = menuService.getMenus(reqVO);
  189 + // 断言
  190 + assertEquals(1, result.size());
  191 + assertPojoEquals(menu100, result.get(0));
  192 + }
  193 +
  194 + @Test
  195 + public void testTenantMenus() {
  196 + // mock 数据
  197 + MenuDO menu100 = randomPojo(MenuDO.class, o -> o.setId(100L).setStatus(CommonStatusEnum.ENABLE.getStatus()));
  198 + menuMapper.insert(menu100);
  199 + MenuDO menu101 = randomPojo(MenuDO.class, o -> o.setId(101L).setStatus(CommonStatusEnum.DISABLE.getStatus()));
  200 + menuMapper.insert(menu101);
  201 + MenuDO menu102 = randomPojo(MenuDO.class, o -> o.setId(102L).setStatus(CommonStatusEnum.ENABLE.getStatus()));
  202 + menuMapper.insert(menu102);
  203 + // mock 过滤菜单
  204 + // mock 账户额度充足
  205 + Set<Long> menuIds = asSet(100L, 101L);
  206 + doNothing().when(tenantService).handleTenantMenu(argThat(handler -> {
  207 + handler.handle(menuIds);
  208 + return true;
  209 + }));
  210 + // 准备参数
  211 + MenuListReqVO reqVO = new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus());
  212 +
  213 + // 调用
  214 + List<MenuDO> result = menuService.getTenantMenus(reqVO);
  215 + // 断言
  216 + assertEquals(1, result.size());
  217 + assertPojoEquals(menu100, result.get(0));
  218 + }
  219 +
  220 + @Test
  221 + public void testGetMenusReqVo_success() {
  222 + Map<Long, MenuDO> idMenuMap = new HashMap<>();
  223 + // 用于验证可以模糊搜索名称包含"name",状态为1的menu
  224 + MenuDO menu = createMenuDO(MenuTypeEnum.MENU, "name2", 0L, 1);
  225 + menuMapper.insert(menu);
  226 + idMenuMap.put(menu.getId(), menu);
  227 +
  228 + menu = createMenuDO(MenuTypeEnum.MENU, "11name111", 0L, 1);
  229 + menuMapper.insert(menu);
  230 + idMenuMap.put(menu.getId(), menu);
  231 +
  232 + menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 1);
  233 + menuMapper.insert(menu);
  234 + idMenuMap.put(menu.getId(), menu);
  235 +
  236 + // 以下是不符合搜索条件的的menu
  237 + menu = createMenuDO(MenuTypeEnum.MENU, "xxxxxx", 0L, 1);
  238 + menuMapper.insert(menu);
  239 + menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 2);
  240 + menuMapper.insert(menu);
  241 +
  242 + // 调用
  243 + MenuListReqVO reqVO = new MenuListReqVO();
  244 + reqVO.setStatus(1);
  245 + reqVO.setName("name");
  246 + List<MenuDO> menuDOS = menuService.getMenus(reqVO);
  247 +
  248 + // 断言
  249 + assertEquals(menuDOS.size(), idMenuMap.size());
  250 + menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
  251 + }
  252 +
  253 + @Test
  254 + public void testListMenusFromCache_success() throws Exception {
  255 + Map<Long, MenuDO> mockCacheMap = new HashMap<>();
  256 + // 获取代理对象
  257 + MenuServiceImpl target = (MenuServiceImpl) SpringAopUtils.getTarget(menuService);
  258 + BeanUtil.setFieldValue(target, "menuCache", mockCacheMap);
  259 +
  260 + Map<Long, MenuDO> idMenuMap = new HashMap<>();
  261 + // 用于验证搜索类型为MENU,状态为1的menu
  262 + MenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1);
  263 + mockCacheMap.put(menuDO.getId(), menuDO);
  264 + idMenuMap.put(menuDO.getId(), menuDO);
  265 +
  266 + menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1);
  267 + mockCacheMap.put(menuDO.getId(), menuDO);
  268 + idMenuMap.put(menuDO.getId(), menuDO);
  269 +
  270 + // 以下是不符合搜索条件的menu
  271 + menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1);
  272 + mockCacheMap.put(menuDO.getId(), menuDO);
  273 + menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2);
  274 + mockCacheMap.put(menuDO.getId(), menuDO);
  275 +
  276 + List<MenuDO> menuDOS = menuService.getMenuListFromCache(Collections.singletonList(MenuTypeEnum.MENU.getType()),
  277 + Collections.singletonList(CommonStatusEnum.DISABLE.getStatus()));
  278 + assertEquals(menuDOS.size(), idMenuMap.size());
  279 + menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
  280 + }
  281 +
  282 + @Test
  283 + public void testListMenusFromCache2_success() throws Exception {
  284 + Map<Long, MenuDO> mockCacheMap = new HashMap<>();
  285 + // 获取代理对象
  286 + MenuServiceImpl target = (MenuServiceImpl) SpringAopUtils.getTarget(menuService);
  287 + BeanUtil.setFieldValue(target, "menuCache", mockCacheMap);
  288 +
  289 + Map<Long, MenuDO> idMenuMap = new HashMap<>();
  290 + // 验证搜索id为1, 类型为MENU, 状态为1 的menu
  291 + MenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1);
  292 + mockCacheMap.put(menuDO.getId(), menuDO);
  293 + idMenuMap.put(menuDO.getId(), menuDO);
  294 +
  295 + // 以下是不符合搜索条件的menu
  296 + menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1);
  297 + mockCacheMap.put(menuDO.getId(), menuDO);
  298 + menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1);
  299 + mockCacheMap.put(menuDO.getId(), menuDO);
  300 + menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2);
  301 + mockCacheMap.put(menuDO.getId(), menuDO);
  302 +
  303 + List<MenuDO> menuDOS = menuService.getMenuListFromCache(Collections.singletonList(1L),
  304 + Collections.singletonList(MenuTypeEnum.MENU.getType()), Collections.singletonList(1));
  305 + assertEquals(menuDOS.size(), idMenuMap.size());
  306 + menuDOS.forEach(menu -> assertPojoEquals(idMenuMap.get(menu.getId()), menu));
  307 + }
  308 +
  309 + @Test
  310 + public void testCheckParentResource_success() {
  311 + MenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L);
  312 + menuMapper.insert(menuDO);
  313 + Long parentId = menuDO.getId();
  314 +
  315 + menuService.checkParentResource(parentId, null);
  316 + }
  317 +
  318 + @Test
  319 + public void testCheckParentResource_canNotSetSelfToBeParent() {
  320 + assertServiceException(() -> menuService.checkParentResource(1L, 1L), MENU_PARENT_ERROR);
  321 + }
  322 +
  323 + @Test
  324 + public void testCheckParentResource_parentNotExist() {
  325 + assertServiceException(() -> menuService.checkParentResource(randomLongId(), null), MENU_PARENT_NOT_EXISTS);
  326 + }
  327 +
  328 + @Test
  329 + public void testCheckParentResource_parentTypeError() {
  330 + MenuDO menuDO = createMenuDO(MenuTypeEnum.BUTTON, "parent", 0L);
  331 + menuMapper.insert(menuDO);
  332 + Long parentId = menuDO.getId();
  333 +
  334 + assertServiceException(() -> menuService.checkParentResource(parentId, null), MENU_PARENT_NOT_DIR_OR_MENU);
  335 + }
  336 +
  337 + @Test
  338 + public void testCheckResource_success() {
  339 + MenuDO sonMenu = initParentAndSonMenuDO();
  340 + Long parentId = sonMenu.getParentId();
  341 +
  342 + Long otherSonMenuId = randomLongId();
  343 + String otherSonMenuName = randomString();
  344 +
  345 + menuService.checkResource(parentId, otherSonMenuName, otherSonMenuId);
  346 + }
  347 +
  348 + @Test
  349 + public void testCheckResource_sonMenuNameDuplicate(){
  350 + MenuDO sonMenu=initParentAndSonMenuDO();
  351 + Long parentId=sonMenu.getParentId();
  352 +
  353 + Long otherSonMenuId=randomLongId();
  354 + String otherSonMenuName=sonMenu.getName(); //相同名称
  355 +
  356 + assertServiceException(() -> menuService.checkResource(parentId, otherSonMenuName, otherSonMenuId), MENU_NAME_DUPLICATE);
  357 + }
  358 +
  359 + /**
  360 + * 构造父子目录,返回子目录
  361 + *
  362 + * @return
  363 + */
  364 + private MenuDO initParentAndSonMenuDO() {
  365 + //构造父子目录
  366 + MenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L);
  367 + menuMapper.insert(menuDO);
  368 + Long parentId = menuDO.getId();
  369 +
  370 + MenuDO sonMenuDO = createMenuDO(MenuTypeEnum.MENU, "testSonName", parentId);
  371 + menuMapper.insert(sonMenuDO);
  372 + return sonMenuDO;
  373 + }
  374 +
  375 + private MenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId) {
  376 + return createMenuDO(typeEnum, menuName, parentId, randomCommonStatus());
  377 + }
  378 +
  379 + private MenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) {
  380 + return createMenuDO(null, typeEnum, menuName, parentId, status);
  381 + }
  382 +
  383 + private MenuDO createMenuDO(Long id, MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) {
  384 + return randomPojo(MenuDO.class, o -> {
  385 + o.setId(id);
  386 + o.setParentId(parentId);
  387 + o.setType(typeEnum.getType());
  388 + o.setStatus(status);
  389 + o.setName(menuName);
  390 + });
  391 + }
  392 +
  393 +}