4c88964473
- 新后台 admin-frontend-vue 整工程入库(base=/admin-vue/、History 路由、Nginx 静态托管方案与 verify-dist 校验) - Java AdminConsoleController 改为入口重定向: /admin|/admin.html、/login|/login.html -> /admin-vue/; 删除 classpath:static 旧 admin.html/login.html 单页与 admin.js 副本 - Flask 后台整体退役: 删除 admin_api/auth/main 蓝图、web_source 页面、static 脚本与 admin 相关测试; app.py 收敛为仅注册 version_bp(/api/version、/api/version/latest, 供桌面端更新检查) - AdminApiGuardFilterTest 豁免样例路径 /admin.html -> /admin-vue/
55 lines
2.5 KiB
TypeScript
55 lines
2.5 KiB
TypeScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import { readSource } from './helpers.ts'
|
|
import { parseMenuTree } from '../src/api/session-model.ts'
|
|
|
|
const store = readSource('src/stores/admin-session.ts')
|
|
|
|
test('test_task_029_menu_tree_init_normal_primary_path', () => {
|
|
// 正常主路径:用户拉取成功后拉取菜单树并写入 store.menuTree。
|
|
assert.match(store, /this\.menuTree\s*=\s*canonicalizeMenuTree\(await fetchAdminMenuTree\(\)\)/)
|
|
})
|
|
|
|
test('test_task_029_menu_tree_init_normal_variant_input', () => {
|
|
// 正常变体:两组数据都成功后置 initialized,才算初始化完成。
|
|
assert.match(store, /this\.initialized\s*=\s*true/)
|
|
})
|
|
|
|
test('test_task_029_menu_tree_init_normal_repeated_operation_is_idempotent', () => {
|
|
// 正常重复:菜单拉取在 store 只声明一次;成功置位后再进入即短路。
|
|
assert.ok((store.match(/fetchAdminMenuTree\(\)/g) || []).length >= 1)
|
|
assert.match(store, /if\s*\(this\.initialized\s*\|\|\s*this\.loading\)\s*return/)
|
|
})
|
|
|
|
test('test_task_029_menu_tree_init_boundary_empty_input', () => {
|
|
// 边界空值:空菜单树(无权限)也是合法初始化结果,与接口失败区分。
|
|
assert.deepEqual(parseMenuTree({ success: true, data: { items: [] } }), [])
|
|
})
|
|
|
|
test('test_task_029_menu_tree_init_boundary_single_item', () => {
|
|
// 边界单元素:单个分组节点正常写入,供侧边栏渲染。
|
|
const tree = parseMenuTree({ data: { items: [{ key: 'g', name: '分组' }] } })
|
|
assert.equal(tree.length, 1)
|
|
assert.equal(tree[0].key, 'g')
|
|
})
|
|
|
|
test('test_task_029_menu_tree_init_boundary_limit_or_missing_field', () => {
|
|
// 边界上限/缺字段:菜单树含 icon/sort 等附加字段时不被丢弃。
|
|
const tree = parseMenuTree({ data: { items: [{ key: 'p', name: '页', route: '/p', sort: 2, icon: 'grid' }] } })
|
|
assert.equal(tree[0].sort, 2)
|
|
assert.equal(tree[0].icon, 'grid')
|
|
})
|
|
|
|
test('test_task_029_menu_tree_init_invalid_input_rejected', () => {
|
|
// 异常输入:success=false 视为接口失败抛错,不落成“无权限空树”。
|
|
assert.throws(() => parseMenuTree({ success: false, message: '菜单拉取失败' }), /菜单拉取失败/)
|
|
})
|
|
|
|
test('test_task_029_menu_tree_init_dependency_failure_returns_actionable_message', () => {
|
|
// 依赖失败:store 菜单初始化复用 fetchAdminMenuTree;会话适配器指向菜单端点。
|
|
assert.match(store, /fetchAdminMenuTree/)
|
|
const session = readSource('src/api/session.ts')
|
|
assert.match(session, /\/api\/admin\/current-user\/menus/)
|
|
assert.match(session, /parseMenuTree/)
|
|
})
|