30e80c0eed
- 新增「提示词」页(/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>
31 lines
1.2 KiB
TypeScript
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);
|
|
});
|
|
});
|