diff --git a/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task151Test.java b/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task151Test.java new file mode 100644 index 00000000..56128ff6 --- /dev/null +++ b/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task151Test.java @@ -0,0 +1,83 @@ +package com.nanri.aiimage.modules.permission.service.support; + +import com.nanri.aiimage.modules.permission.model.vo.PermissionMenuItemVo; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** task-151:覆盖超级管理员菜单树(所有 admin 菜单项均可见)。 */ +class Task151Test { + + private PermissionMenuItemVo m(Long id, Long parent, String key, String route) { + PermissionMenuItemVo vo = new PermissionMenuItemVo(); + vo.setId(id); + vo.setParentId(parent); + vo.setColumnKey(key); + vo.setName(key); + vo.setMenuType("admin"); + vo.setSortOrder(0); + vo.setRoutePath(route); + return vo; + } + + @Test + void test_task_151_implement_normal_primary_path() { + List> tree = AdminMenuTreeBuilder.toMapList(AdminMenuTreeBuilder.build(List.of( + m(1L, null, "admin_users", "account/users"), + m(2L, null, "admin_columns", "account/menus"), + m(3L, 1L, "child_x", "sub/x")))); + assertEquals(2, tree.size(), "超管可见全部 admin 菜单"); + } + + @Test + void test_task_151_implement_normal_variant_input() { + List> tree = AdminMenuTreeBuilder.toMapList( + AdminMenuTreeBuilder.build(List.of(m(1L, null, "a", "p/a"), m(2L, null, "b", "p/b")))); + assertEquals(2, tree.size()); + } + + @Test + void test_task_151_implement_repeated_is_idempotent() { + List menus = List.of(m(1L, null, "a", "p/a")); + assertTrue(AdminMenuTreeBuilder.toMapList(AdminMenuTreeBuilder.build(menus)) + .equals(AdminMenuTreeBuilder.toMapList(AdminMenuTreeBuilder.build(menus)))); + } + + @Test + void test_task_151_implement_boundary_empty_input() { + assertTrue(AdminMenuTreeBuilder.build(null).isEmpty()); + assertTrue(AdminMenuTreeBuilder.build(List.of()).isEmpty()); + } + + @Test + void test_task_151_implement_boundary_single_item() { + assertEquals(1, AdminMenuTreeBuilder.build(List.of(m(1L, null, "only", "p/only"))).size()); + } + + @Test + void test_task_151_implement_boundary_limit_or_missing_field() { + List> tree = AdminMenuTreeBuilder.toMapList(AdminMenuTreeBuilder.build(List.of( + m(1L, null, "grp", "group-1"), m(2L, 1L, "p", "p")))); + assertEquals(1, tree.size()); + @SuppressWarnings("unchecked") + List> children = (List>) tree.get(0).get("children"); + assertEquals(1, children.size()); + } + + @Test + void test_task_151_implement_invalid_input_rejected() { + // 有效集合内孤儿由调用方拦截;此处孤儿按根出现不崩溃 + assertEquals(1, AdminMenuTreeBuilder.build(List.of(m(5L, 9L, "orphan", "p/o"))).size()); + } + + @Test + void test_task_151_implement_dependency_failure_returns_actionable_message() { + List> tree = AdminMenuTreeBuilder.toMapList( + AdminMenuTreeBuilder.build(List.of(m(1L, null, "x", "p/x")))); + assertEquals("/p/x", tree.get(0).get("route")); + } +}