Commit 5f839f5bb0b0567124c6437acd5d7a9c725289bd

Authored by YunaiV
1 parent d5721c30

fix(system): 按租户套餐过滤菜单管理列表

yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java
@@ -67,10 +67,10 @@ public class MenuController { @@ -67,10 +67,10 @@ public class MenuController {
67 } 67 }
68 68
69 @GetMapping("/list") 69 @GetMapping("/list")
70 - @Operation(summary = "获取菜单列表", description = "用于【菜单管理】界面") 70 + @Operation(summary = "获取菜单列表", description = "用于【菜单管理】界面。在多租户的场景下,会只返回租户所在套餐有的菜单")
71 @PreAuthorize("@ss.hasPermission('system:menu:query')") 71 @PreAuthorize("@ss.hasPermission('system:menu:query')")
72 public CommonResult<List<MenuRespVO>> getMenuList(MenuListReqVO reqVO) { 72 public CommonResult<List<MenuRespVO>> getMenuList(MenuListReqVO reqVO) {
73 - List<MenuDO> list = menuService.getMenuList(reqVO); 73 + List<MenuDO> list = menuService.getMenuListByTenant(reqVO);
74 list.sort(Comparator.comparing(MenuDO::getSort)); 74 list.sort(Comparator.comparing(MenuDO::getSort));
75 return success(BeanUtils.toBean(list, MenuRespVO.class)); 75 return success(BeanUtils.toBean(list, MenuRespVO.class));
76 } 76 }
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuControllerTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.controller.admin.permission;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
  5 +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
  6 +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuRespVO;
  7 +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
  8 +import cn.iocoder.yudao.module.system.service.permission.MenuService;
  9 +import org.junit.jupiter.api.Test;
  10 +import org.mockito.InjectMocks;
  11 +import org.mockito.Mock;
  12 +
  13 +import java.util.ArrayList;
  14 +import java.util.Arrays;
  15 +import java.util.List;
  16 +
  17 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  18 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  19 +import static org.junit.jupiter.api.Assertions.assertEquals;
  20 +import static org.mockito.Mockito.*;
  21 +
  22 +/**
  23 + * {@link MenuController} 的单元测试
  24 + *
  25 + * @author 芋道源码
  26 + */
  27 +public class MenuControllerTest extends BaseMockitoUnitTest {
  28 +
  29 + @InjectMocks
  30 + private MenuController menuController;
  31 +
  32 + @Mock
  33 + private MenuService menuService;
  34 +
  35 + @Test
  36 + public void testGetMenuList_filterByTenant() {
  37 + // 准备参数
  38 + MenuListReqVO reqVO = new MenuListReqVO();
  39 + // mock 方法:租户过滤后的菜单
  40 + MenuDO menu1 = randomPojo(MenuDO.class, o -> o.setId(1L).setSort(2));
  41 + MenuDO menu2 = randomPojo(MenuDO.class, o -> o.setId(2L).setSort(1));
  42 + when(menuService.getMenuListByTenant(same(reqVO))).thenReturn(new ArrayList<>(Arrays.asList(menu1, menu2)));
  43 +
  44 + // 调用
  45 + CommonResult<List<MenuRespVO>> result = menuController.getMenuList(reqVO);
  46 + // 断言:按照 sort 排序,且只使用租户过滤后的菜单
  47 + assertEquals(Arrays.asList(2L, 1L), convertList(result.getData(), MenuRespVO::getId));
  48 + verify(menuService).getMenuListByTenant(same(reqVO));
  49 + verify(menuService, never()).getMenuList(any(MenuListReqVO.class));
  50 + }
  51 +
  52 +}
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImplTest.java
@@ -187,6 +187,45 @@ public class MenuServiceImplTest extends BaseDbUnitTest { @@ -187,6 +187,45 @@ public class MenuServiceImplTest extends BaseDbUnitTest {
187 } 187 }
188 188
189 @Test 189 @Test
  190 + public void testGetMenuListByTenant_tenantDisable() {
  191 + // mock 数据
  192 + MenuDO menu100 = randomPojo(MenuDO.class, o -> o.setId(100L).setStatus(CommonStatusEnum.ENABLE.getStatus()));
  193 + menuMapper.insert(menu100);
  194 + MenuDO menu101 = randomPojo(MenuDO.class, o -> o.setId(101L).setStatus(CommonStatusEnum.ENABLE.getStatus()));
  195 + menuMapper.insert(menu101);
  196 + // mock 禁用多租户:TenantService 不执行过滤处理器
  197 + doNothing().when(tenantService).handleTenantMenu(any());
  198 + // 准备参数
  199 + MenuListReqVO reqVO = new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus());
  200 +
  201 + // 调用
  202 + List<MenuDO> result = menuService.getMenuListByTenant(reqVO);
  203 + // 断言:返回全部菜单
  204 + assertEquals(asSet(100L, 101L), convertSet(result, MenuDO::getId));
  205 + }
  206 +
  207 + @Test
  208 + public void testGetMenuListByTenant_systemTenant() {
  209 + // mock 数据
  210 + MenuDO menu100 = randomPojo(MenuDO.class, o -> o.setId(100L).setStatus(CommonStatusEnum.ENABLE.getStatus()));
  211 + menuMapper.insert(menu100);
  212 + MenuDO menu101 = randomPojo(MenuDO.class, o -> o.setId(101L).setStatus(CommonStatusEnum.ENABLE.getStatus()));
  213 + menuMapper.insert(menu101);
  214 + // mock 系统租户:处理器得到全量菜单编号
  215 + doNothing().when(tenantService).handleTenantMenu(argThat(handler -> {
  216 + handler.handle(asSet(100L, 101L));
  217 + return true;
  218 + }));
  219 + // 准备参数
  220 + MenuListReqVO reqVO = new MenuListReqVO();
  221 +
  222 + // 调用
  223 + List<MenuDO> result = menuService.getMenuListByTenant(reqVO);
  224 + // 断言:返回全部菜单
  225 + assertEquals(asSet(100L, 101L), convertSet(result, MenuDO::getId));
  226 + }
  227 +
  228 + @Test
190 public void testGetMenuIdListByPermissionFromCache() { 229 public void testGetMenuIdListByPermissionFromCache() {
191 // mock 数据 230 // mock 数据
192 MenuDO menu100 = randomPojo(MenuDO.class); 231 MenuDO menu100 = randomPojo(MenuDO.class);