Files
sundynix-agentix/sundynix-admin/src/routes.test.tsx
T
Blizzard 30e80c0eed feat(admin): 提示词控制面页 + 概览/状态页重做 + 接入 vitest
- 新增「提示词」页(/prompts):接 /api/v1/prompts,建版本/激活热下发/
  对比激活版行级 diff/撤销,挂到配置组
- 概览页重做为系统控制塔:吃 admin/overview(全平台口径)——平台任务/
  评测/用户规模/服务在线 + 模型路由态 + 提示词覆盖态 + 健康拓扑 + 30s自刷
- 服务状态页重做:中性克制风 + 请求链路做成深色实时数据管道(流动光点/
  节点辉光) + MCP 工具改能力域配色小卡片
- 接入 vitest(此前零测试):41 单测(api 控制面/lib diff/路由派生)
- api.ts 增 statsOverview/adminOverview/prompt 控制面四接口 + groupPrompts

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 08:59:40 +08:00

31 lines
1.2 KiB
TypeScript

import { describe, it, expect } from "vitest";
import { routes, navGroups, defaultPath } from "./routes";
// routes 是控制台导航的单一事实源 —— 派生分组必须保序、不丢项、不串组。
describe("navGroups", () => {
it("按注册顺序归并分组,每条路由都落到对应组", () => {
const groups = navGroups();
const flat = groups.flatMap((g) => g.items);
// 不丢项、不重复
expect(flat).toHaveLength(routes.length);
expect(new Set(flat.map((r) => r.path)).size).toBe(routes.length);
});
it("分组首次出现的顺序即组顺序(保持注册顺序)", () => {
const seen: string[] = [];
for (const r of routes) if (!seen.includes(r.group)) seen.push(r.group);
expect(navGroups().map((g) => g.group)).toEqual(seen);
});
it("同组路由保持注册时的相对顺序", () => {
for (const g of navGroups()) {
const expected = routes.filter((r) => r.group === g.group).map((r) => r.path);
expect(g.items.map((r) => r.path)).toEqual(expected);
}
});
it("defaultPath 指向一个真实存在的路由", () => {
expect(routes.some((r) => r.path === defaultPath)).toBe(true);
});
});