task-143(Java 菜单树与 Flyway): 实现有效菜单节点索引
indexById(去 null id/重复后写) 单测(Task143Test 8 用例)。 TDD: RED→GREEN。
This commit is contained in:
+14
@@ -109,4 +109,18 @@ public final class AdminMenuTreeBuilder {
|
|||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 以 id 建立有效节点索引;缺 id 跳过,重复 id 后写覆盖。null/空回空 Map。 */
|
||||||
|
public static Map<Long, PermissionMenuItemVo> indexById(List<PermissionMenuItemVo> menus) {
|
||||||
|
Map<Long, PermissionMenuItemVo> 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+74
@@ -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<Long, PermissionMenuItemVo> 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<Long, PermissionMenuItemVo> 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<PermissionMenuItemVo> 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<Long, PermissionMenuItemVo> index = AdminMenuTreeBuilder.indexById(List.of(item(null, "no-id")));
|
||||||
|
assertFalse(index.containsKey(null));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void test_task_143_implement_invalid_input_rejected() {
|
||||||
|
Map<Long, PermissionMenuItemVo> 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"));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user