diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/permission/service/support/AdminMenuRouteMatrix.java b/backend-java/src/main/java/com/nanri/aiimage/modules/permission/service/support/AdminMenuRouteMatrix.java new file mode 100644 index 00000000..ba33119d --- /dev/null +++ b/backend-java/src/main/java/com/nanri/aiimage/modules/permission/service/support/AdminMenuRouteMatrix.java @@ -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 ROUTES = build(); + + private static Map build() { + Map 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); + } +} diff --git a/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/MigrationSql.java b/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/MigrationSql.java new file mode 100644 index 00000000..dc7ac7c1 --- /dev/null +++ b/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/MigrationSql.java @@ -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); + } + } +} diff --git a/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task154Test.java b/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task154Test.java new file mode 100644 index 00000000..637e9ca0 --- /dev/null +++ b/backend-java/src/test/java/com/nanri/aiimage/modules/permission/service/support/Task154Test.java @@ -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")); + } +}