diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java index 0c78477..43ed408 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java @@ -67,10 +67,10 @@ public class MenuController { } @GetMapping("/list") - @Operation(summary = "获取菜单列表", description = "用于【菜单管理】界面") + @Operation(summary = "获取菜单列表", description = "用于【菜单管理】界面。在多租户的场景下,会只返回租户所在套餐有的菜单") @PreAuthorize("@ss.hasPermission('system:menu:query')") public CommonResult> getMenuList(MenuListReqVO reqVO) { - List list = menuService.getMenuList(reqVO); + List list = menuService.getMenuListByTenant(reqVO); list.sort(Comparator.comparing(MenuDO::getSort)); return success(BeanUtils.toBean(list, MenuRespVO.class)); } diff --git a/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuControllerTest.java b/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuControllerTest.java new file mode 100644 index 0000000..a29db4f --- /dev/null +++ b/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuControllerTest.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.system.controller.admin.permission; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuRespVO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; +import cn.iocoder.yudao.module.system.service.permission.MenuService; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +/** + * {@link MenuController} 的单元测试 + * + * @author 芋道源码 + */ +public class MenuControllerTest extends BaseMockitoUnitTest { + + @InjectMocks + private MenuController menuController; + + @Mock + private MenuService menuService; + + @Test + public void testGetMenuList_filterByTenant() { + // 准备参数 + MenuListReqVO reqVO = new MenuListReqVO(); + // mock 方法:租户过滤后的菜单 + MenuDO menu1 = randomPojo(MenuDO.class, o -> o.setId(1L).setSort(2)); + MenuDO menu2 = randomPojo(MenuDO.class, o -> o.setId(2L).setSort(1)); + when(menuService.getMenuListByTenant(same(reqVO))).thenReturn(new ArrayList<>(Arrays.asList(menu1, menu2))); + + // 调用 + CommonResult> result = menuController.getMenuList(reqVO); + // 断言:按照 sort 排序,且只使用租户过滤后的菜单 + assertEquals(Arrays.asList(2L, 1L), convertList(result.getData(), MenuRespVO::getId)); + verify(menuService).getMenuListByTenant(same(reqVO)); + verify(menuService, never()).getMenuList(any(MenuListReqVO.class)); + } + +} diff --git a/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImplTest.java b/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImplTest.java index a1f42f1..e9b26fc 100644 --- a/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImplTest.java +++ b/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImplTest.java @@ -187,6 +187,45 @@ public class MenuServiceImplTest extends BaseDbUnitTest { } @Test + public void testGetMenuListByTenant_tenantDisable() { + // mock 数据 + MenuDO menu100 = randomPojo(MenuDO.class, o -> o.setId(100L).setStatus(CommonStatusEnum.ENABLE.getStatus())); + menuMapper.insert(menu100); + MenuDO menu101 = randomPojo(MenuDO.class, o -> o.setId(101L).setStatus(CommonStatusEnum.ENABLE.getStatus())); + menuMapper.insert(menu101); + // mock 禁用多租户:TenantService 不执行过滤处理器 + doNothing().when(tenantService).handleTenantMenu(any()); + // 准备参数 + MenuListReqVO reqVO = new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + List result = menuService.getMenuListByTenant(reqVO); + // 断言:返回全部菜单 + assertEquals(asSet(100L, 101L), convertSet(result, MenuDO::getId)); + } + + @Test + public void testGetMenuListByTenant_systemTenant() { + // mock 数据 + MenuDO menu100 = randomPojo(MenuDO.class, o -> o.setId(100L).setStatus(CommonStatusEnum.ENABLE.getStatus())); + menuMapper.insert(menu100); + MenuDO menu101 = randomPojo(MenuDO.class, o -> o.setId(101L).setStatus(CommonStatusEnum.ENABLE.getStatus())); + menuMapper.insert(menu101); + // mock 系统租户:处理器得到全量菜单编号 + doNothing().when(tenantService).handleTenantMenu(argThat(handler -> { + handler.handle(asSet(100L, 101L)); + return true; + })); + // 准备参数 + MenuListReqVO reqVO = new MenuListReqVO(); + + // 调用 + List result = menuService.getMenuListByTenant(reqVO); + // 断言:返回全部菜单 + assertEquals(asSet(100L, 101L), convertSet(result, MenuDO::getId)); + } + + @Test public void testGetMenuIdListByPermissionFromCache() { // mock 数据 MenuDO menu100 = randomPojo(MenuDO.class);