a0f6582914
- 后台密钥管理「代理设置」列改为完整明文展示(含账号密码),便于运维核对; 新增 full 字段仅对代理模块下发,密钥两列保持脱敏 - 新增 biz_user_secret_usage_daily(V117):用户 × 模块 × 天累计真实对外请求次数 - 计次口径:LLM 每次真实 HTTP 请求(含重试)计 1 次;代理每次成功提取计 1 次 - LLM 埋点走 SecretUsageContext 上下文(批次外设置、线程池内快照恢复) - 新增内部上报接口 /api/internal/user-secret-usage(X-Internal-Token) - 新增后台页「密钥用量统计」:日期范围 + 用户名 + 分组筛选,含范围内汇总
80 lines
3.9 KiB
TypeScript
80 lines
3.9 KiB
TypeScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import { readSource } from './helpers.ts'
|
|
import {
|
|
adminPages,
|
|
adminRouteRecords,
|
|
routeOf,
|
|
validateAdminPages,
|
|
} from '../src/router/routes.ts'
|
|
|
|
test('test_task_008_domain_route_registry_normal_primary_path', () => {
|
|
// 正常主路径:注册表首批 account 域页面登记为可消费路由记录。
|
|
assert.ok(adminPages.length >= 18, '业务页至少 18(随版本递增,不设上限断言)')
|
|
assert.equal(adminRouteRecords.length, adminPages.length)
|
|
const first = adminRouteRecords[0]
|
|
assert.equal(first.path, 'account/users')
|
|
assert.equal((first.meta as { title?: string }).title, '用户管理')
|
|
assert.equal((first.meta as { menuKey?: string }).menuKey, 'admin_users')
|
|
assert.deepEqual(validateAdminPages(adminPages), [])
|
|
})
|
|
|
|
test('test_task_008_domain_route_registry_normal_variant_input', () => {
|
|
// 正常变体:无 menuKey 的页面元数据不携带菜单 key,仍带标题。
|
|
const record = routeOf({ path: 'tasks/plain', title: '无菜单页', load: async () => ({ default: {} }) })
|
|
const meta = record.meta as { title?: string; menuKey?: string }
|
|
assert.equal(meta.title, '无菜单页')
|
|
assert.equal('menuKey' in meta, false)
|
|
})
|
|
|
|
test('test_task_008_domain_route_registry_normal_repeated_operation_is_idempotent', () => {
|
|
// 正常重复:从同一注册表重复生成记录结果稳定。
|
|
const once = JSON.stringify(adminPages.map(routeOf))
|
|
const twice = JSON.stringify(adminPages.map(routeOf))
|
|
assert.equal(once, twice)
|
|
assert.deepEqual(validateAdminPages(adminPages), validateAdminPages(adminPages))
|
|
})
|
|
|
|
test('test_task_008_domain_route_registry_boundary_empty_input', () => {
|
|
// 边界空值:空注册表可校验、可映射为空路由列表。
|
|
assert.deepEqual(validateAdminPages([]), [])
|
|
assert.equal([].map(routeOf).length, 0)
|
|
})
|
|
|
|
test('test_task_008_domain_route_registry_boundary_single_item', () => {
|
|
// 边界单元素:单页面登记生成唯一路由记录。
|
|
const records = [routeOf({ path: 'shop/list', title: '店铺列表', load: async () => ({ default: {} }) })]
|
|
assert.equal(records.length, 1)
|
|
assert.equal(records[0].path, 'shop/list')
|
|
})
|
|
|
|
test('test_task_008_domain_route_registry_boundary_limit_or_missing_field', () => {
|
|
// 边界上限/缺字段:路径重复、前导斜杠、缺 title、混入 base 前缀都被校验拒绝。
|
|
const base = { title: 'T', load: async () => ({ default: {} }) }
|
|
const issues = validateAdminPages([
|
|
{ ...base, path: 'a/b' },
|
|
{ ...base, path: 'a/b' },
|
|
{ ...base, path: '/lead' },
|
|
{ path: '', title: '', load: async () => ({ default: {} }) },
|
|
{ path: '/admin-vue/x', title: 'X', load: async () => ({ default: {} }) },
|
|
])
|
|
assert.ok(issues.some((i) => i.includes('路径重复')))
|
|
assert.ok(issues.some((i) => i.includes('相对子路径')))
|
|
assert.ok(issues.some((i) => i.includes('缺少标题')))
|
|
assert.ok(issues.some((i) => i.includes('base 前缀')))
|
|
})
|
|
|
|
test('test_task_008_domain_route_registry_invalid_input_rejected', () => {
|
|
// 异常输入:非法页面定义在生成路由时被拒绝并给出可操作消息。
|
|
assert.throws(() => routeOf({ path: '', title: 'T', load: async () => ({ default: {} }) }), /路由注册表页面定义非法/)
|
|
assert.throws(() => routeOf({ path: 'x', title: '', load: async () => ({ default: {} }) }), /路由注册表页面定义非法/)
|
|
})
|
|
|
|
test('test_task_008_domain_route_registry_dependency_failure_returns_actionable_message', () => {
|
|
// 依赖失败:router 消费注册表,不再内联页面懒加载与路径字面量。
|
|
const router = readSource('src/router/index.ts')
|
|
assert.match(router, /adminRouteRecords/)
|
|
assert.equal(router.includes('account/users'), false, '路径字面量应只存在于 routes.ts 注册表')
|
|
assert.equal(router.includes('() => import(\'@/pages'), false, '页面懒加载应只存在于注册表')
|
|
})
|