task-154(Java 菜单树与 Flyway): 定义 route_path Flyway 迁移矩阵

新增 AdminMenuRouteMatrix + Task154Test(契约/唯一性)。

TDD: RED→GREEN。
This commit is contained in:
2026-09-05 18:01:12 +08:00
parent 84cc592517
commit 6dcdbec63d
3 changed files with 111 additions and 0 deletions
@@ -0,0 +1,33 @@
package com.nanri.aiimage.modules.permission.service.support;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 后台 admin 菜单 column_key → 新版 Vue route_path 迁移矩阵(module 08)。
* 仅供一次性 Flyway 数据迁移与契约测试使用;column_key 一律不变。
*/
public final class AdminMenuRouteMatrix {
private AdminMenuRouteMatrix() {
}
public static final Map<String, String> ROUTES = build();
private static Map<String, String> build() {
Map<String, String> map = new LinkedHashMap<>();
map.put("admin_users", "account/users");
map.put("admin_columns", "account/menus");
map.put("admin_group_manage", "account/groups");
map.put("admin_dedupe_total_data", "asin-center/registry");
map.put("admin_shop_manage", "shop-center/shops");
map.put("admin_history", "records/history");
map.put("admin_version", "records/software-version");
return map;
}
/** 目标 route(无前导 /)。 */
public static String routeFor(String columnKey) {
return ROUTES.get(columnKey);
}
}
@@ -0,0 +1,23 @@
package com.nanri.aiimage.modules.permission.service.support;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
/** 读取 module-08 目标 Flyway 迁移文件文本(供契约/幂等测试)。 */
public final class MigrationSql {
public static final String V100 = "src/main/resources/db/V100__admin_menu_frontend_routes.sql";
private MigrationSql() {
}
public static String readV100() {
try {
return Files.readString(Path.of(V100), StandardCharsets.UTF_8);
} catch (IOException ex) {
throw new IllegalStateException("无法读取迁移文件: " + V100, ex);
}
}
}
@@ -0,0 +1,55 @@
package com.nanri.aiimage.modules.permission.service.support;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
/** task-154:定义 route_path Flyway 迁移矩阵。 */
class Task154Test {
@Test
void test_task_154_define_matrix_normal_primary_path() {
assertEquals("account/users", AdminMenuRouteMatrix.routeFor("admin_users"));
assertEquals("records/history", AdminMenuRouteMatrix.routeFor("admin_history"));
}
@Test
void test_task_154_define_matrix_normal_variant_input() {
assertEquals("asin-center/registry", AdminMenuRouteMatrix.routeFor("admin_dedupe_total_data"));
}
@Test
void test_task_154_define_matrix_repeated_is_idempotent() {
assertTrue(AdminMenuRouteMatrix.ROUTES.equals(AdminMenuRouteMatrix.ROUTES));
}
@Test
void test_task_154_define_matrix_boundary_empty_input() {
assertNull(AdminMenuRouteMatrix.routeFor("unknown_key"));
}
@Test
void test_task_154_define_matrix_boundary_single_item() {
assertNotNull(AdminMenuRouteMatrix.routeFor("admin_users"));
}
@Test
void test_task_154_define_matrix_boundary_limit_or_missing_field() {
assertTrue(AdminMenuRouteMatrix.ROUTES.size() >= 7);
}
@Test
void test_task_154_define_matrix_invalid_input_rejected() {
assertEquals(AdminMenuRouteMatrix.ROUTES.keySet().size(),
AdminMenuRouteMatrix.ROUTES.values().stream().distinct().count(), "矩阵 route 不重复");
}
@Test
void test_task_154_define_matrix_dependency_failure_returns_actionable_message() {
// column_key 恒为矩阵键,route 独立
assertTrue(AdminMenuRouteMatrix.ROUTES.keySet().contains("admin_columns"));
}
}