task-154(Java 菜单树与 Flyway): 定义 route_path Flyway 迁移矩阵
新增 AdminMenuRouteMatrix + Task154Test(契约/唯一性)。 TDD: RED→GREEN。
This commit is contained in:
+33
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
+23
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+55
@@ -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"));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user