From ef19a5c00c968d9a69a05cdde6c41076d77de110 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:51:13 +0800 Subject: [PATCH] =?UTF-8?q?task-143(Java=20=E8=8F=9C=E5=8D=95=E6=A0=91?= =?UTF-8?q?=E4=B8=8E=20Flyway):=20=E5=AE=9E=E7=8E=B0=E6=9C=89=E6=95=88?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E8=8A=82=E7=82=B9=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit indexById(去 null id/重复后写) 单测(Task143Test 8 用例)。 TDD: RED→GREEN。 --- .../service/support/AdminMenuTreeBuilder.java | 14 ++++ .../service/support/Task143Test.java | 74 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task143Test.java diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/permission/service/support/AdminMenuTreeBuilder.java b/backend-java/src/main/java/com/nanri/aiimage/modules/permission/service/support/AdminMenuTreeBuilder.java index b4f8ded3..073441f3 100644 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/permission/service/support/AdminMenuTreeBuilder.java +++ b/backend-java/src/main/java/com/nanri/aiimage/modules/permission/service/support/AdminMenuTreeBuilder.java @@ -109,4 +109,18 @@ public final class AdminMenuTreeBuilder { } return out; } + + /** 以 id 建立有效节点索引;缺 id 跳过,重复 id 后写覆盖。null/空回空 Map。 */ + public static Map indexById(List menus) { + Map index = new HashMap<>(); + if (menus == null) { + return index; + } + for (PermissionMenuItemVo menu : menus) { + if (menu != null && menu.getId() != null) { + index.put(menu.getId(), menu); + } + } + return index; + } } diff --git a/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task143Test.java b/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task143Test.java new file mode 100644 index 00000000..21a25eac --- /dev/null +++ b/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task143Test.java @@ -0,0 +1,74 @@ +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-143:有效菜单节点索引。 */ +class Task143Test { + + private PermissionMenuItemVo item(Long id, String key) { + PermissionMenuItemVo vo = new PermissionMenuItemVo(); + vo.setId(id); + vo.setColumnKey(key); + vo.setMenuType("admin"); + return vo; + } + + @Test + void test_task_143_implement_normal_primary_path() { + Map index = AdminMenuTreeBuilder.indexById( + List.of(item(1L, "a"), item(2L, "b"))); + assertEquals(2, index.size()); + assertEquals("a", index.get(1L).getColumnKey()); + } + + @Test + void test_task_143_implement_normal_variant_input() { + Map index = AdminMenuTreeBuilder.indexById( + List.of(item(1L, "a"), item(1L, "a2"))); + assertEquals(1, index.size()); + assertEquals("a2", index.get(1L).getColumnKey()); + } + + @Test + void test_task_143_implement_repeated_is_idempotent() { + List menus = List.of(item(5L, "k")); + assertEquals(AdminMenuTreeBuilder.indexById(menus), AdminMenuTreeBuilder.indexById(menus)); + } + + @Test + void test_task_143_implement_boundary_empty_input() { + assertTrue(AdminMenuTreeBuilder.indexById(null).isEmpty()); + assertTrue(AdminMenuTreeBuilder.indexById(List.of()).isEmpty()); + } + + @Test + void test_task_143_implement_boundary_single_item() { + assertEquals(1, AdminMenuTreeBuilder.indexById(List.of(item(9L, "solo"))).size()); + } + + @Test + void test_task_143_implement_boundary_limit_or_missing_field() { + Map index = AdminMenuTreeBuilder.indexById(List.of(item(null, "no-id"))); + assertFalse(index.containsKey(null)); + } + + @Test + void test_task_143_implement_invalid_input_rejected() { + Map index = AdminMenuTreeBuilder.indexById(List.of((PermissionMenuItemVo) null)); + assertTrue(index.isEmpty()); + } + + @Test + void test_task_143_implement_dependency_failure_returns_actionable_message() { + // 纯索引,不触碰 DB/http;调用方先用权限服务取有效集合。 + assertTrue(AdminMenuTreeBuilder.indexById(List.of(item(3L, "x"))).get(3L).getColumnKey().equals("x")); + } +}