From f2d3b08e2f5965ff96f1cfcbc69469f498be0ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E8=87=AA=E8=BE=BE?= <980324341@qq.com> Date: Sat, 5 Sep 2026 17:56:52 +0800 Subject: [PATCH] =?UTF-8?q?task-150(Java=20=E8=8F=9C=E5=8D=95=E6=A0=91?= =?UTF-8?q?=E4=B8=8E=20Flyway):=20Task150Test=208=20=E7=94=A8=E4=BE=8B=20R?= =?UTF-8?q?ED=E2=86=92GREEN=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/support/Task150Test.java | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task150Test.java diff --git a/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task150Test.java b/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task150Test.java new file mode 100644 index 00000000..055f0388 --- /dev/null +++ b/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task150Test.java @@ -0,0 +1,93 @@ +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.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** task-150:当前用户菜单树控制器响应(经统一组装器序列化)。 */ +class Task150Test { + + private PermissionMenuItemVo m(Long id, Long parent, String key, String route, Integer sort) { + PermissionMenuItemVo vo = new PermissionMenuItemVo(); + vo.setId(id); + vo.setParentId(parent); + vo.setColumnKey(key); + vo.setName(key); + vo.setSortOrder(sort); + vo.setRoutePath(route); + vo.setMenuType("admin"); + return vo; + } + + @Test + void test_task_150_implement_normal_primary_path() { + List menus = List.of( + m(1L, null, "admin_users", "account/users", 1), + m(2L, null, "admin_columns", "account/menus", 2), + m(3L, 1L, "child_x", "sub/x", 1)); + List> items = AdminMenuTreeBuilder.toMapList(AdminMenuTreeBuilder.build(menus)); + assertEquals(2, items.size()); + assertEquals("/account/users", items.get(0).get("route")); + @SuppressWarnings("unchecked") + List> children = (List>) items.get(0).get("children"); + assertEquals("/sub/x", children.get(0).get("route")); + assertFalse(items.get(0).containsKey("sort")); + } + + @Test + void test_task_150_implement_normal_variant_input() { + List> items = AdminMenuTreeBuilder.toMapList( + AdminMenuTreeBuilder.build(List.of(m(1L, null, "grp", "group-1", 0)))); + assertEquals(1, items.size()); + assertFalse(items.get(0).containsKey("route"), "分组不含页面 route"); + } + + @Test + void test_task_150_implement_repeated_is_idempotent() { + List menus = List.of(m(1L, null, "k", "p", 0)); + assertTrue(AdminMenuTreeBuilder.toMapList(AdminMenuTreeBuilder.build(menus)) + .equals(AdminMenuTreeBuilder.toMapList(AdminMenuTreeBuilder.build(menus)))); + } + + @Test + void test_task_150_implement_boundary_empty_input() { + assertTrue(AdminMenuTreeBuilder.toMapList(List.of()).isEmpty()); + } + + @Test + void test_task_150_implement_boundary_single_item() { + List> items = AdminMenuTreeBuilder.toMapList( + AdminMenuTreeBuilder.build(List.of(m(1L, null, "solo", "p/solo", 0)))); + assertEquals("/p/solo", items.get(0).get("route")); + } + + @Test + void test_task_150_implement_boundary_limit_or_missing_field() { + List> items = AdminMenuTreeBuilder.toMapList( + AdminMenuTreeBuilder.build(List.of(m(1L, null, "only", null, 0)))); + assertFalse(items.get(0).containsKey("route")); + } + + @Test + void test_task_150_implement_invalid_input_rejected() { + // 只有有效权限集合才会被组装;缺失父不崩溃 + List> items = AdminMenuTreeBuilder.toMapList( + AdminMenuTreeBuilder.build(List.of(m(2L, 99L, "o", "p", 0)))); + assertEquals(1, items.size()); + } + + @Test + void test_task_150_implement_dependency_failure_returns_actionable_message() { + // 响应不含冗余 sort;children 仅在有子时出现 + List> items = AdminMenuTreeBuilder.toMapList( + AdminMenuTreeBuilder.build(List.of(m(1L, null, "a", "p", 0), m(2L, 1L, "b", "q", 0)))); + assertTrue(items.get(0).containsKey("children")); + assertFalse(items.get(0).containsKey("sort")); + } +}