83b935c11b
title-breadcrumb 提供 resolveDocumentTitle('页面 - 数富AI')、updateDocumentTitle
(非浏览器静默)、crumbsForActiveRoute(分组->页面);AdminLayout 用 watch 同步
document.title 并在层级>1 时渲染 el-breadcrumb。
77 lines
3.4 KiB
TypeScript
77 lines
3.4 KiB
TypeScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import { readSource } from './helpers.ts'
|
|
import {
|
|
ADMIN_BRAND,
|
|
crumbsForActiveRoute,
|
|
resolveDocumentTitle,
|
|
updateDocumentTitle,
|
|
} from '../src/layout/title-breadcrumb.ts'
|
|
import type { AdminMenuNode } from '../src/types/admin.ts'
|
|
|
|
function node(partial: Partial<AdminMenuNode> & { key: string; name: string }): AdminMenuNode {
|
|
return { key: partial.key, name: partial.name, route: partial.route, children: partial.children }
|
|
}
|
|
|
|
const TREE: AdminMenuNode[] = [
|
|
node({ key: 'account', name: '账号权限', children: [
|
|
node({ key: 'admin_users', name: '用户管理', route: '/account/users' }),
|
|
] }),
|
|
node({ key: 'top', name: '顶级页', route: '/top' }),
|
|
]
|
|
|
|
test('test_task_015_page_title_breadcrumb_normal_primary_path', () => {
|
|
// 正常主路径:文档标题 = 页面标题 - 品牌。
|
|
assert.equal(resolveDocumentTitle('用户管理'), '用户管理 - 数富AI')
|
|
assert.equal(ADMIN_BRAND, '数富AI')
|
|
})
|
|
|
|
test('test_task_015_page_title_breadcrumb_normal_variant_input', () => {
|
|
// 正常变体:分组内命中时返回 分组->页面 两级面包屑。
|
|
const crumbs = crumbsForActiveRoute(TREE, '/account/users')
|
|
assert.deepEqual(crumbs.map((c) => c.name), ['账号权限', '用户管理'])
|
|
assert.equal(crumbs[1].route, '/account/users')
|
|
})
|
|
|
|
test('test_task_015_page_title_breadcrumb_normal_repeated_operation_is_idempotent', () => {
|
|
// 正常重复:标题与面包屑解析稳定。
|
|
assert.equal(resolveDocumentTitle('菜单管理'), resolveDocumentTitle('菜单管理'))
|
|
assert.deepEqual(crumbsForActiveRoute(TREE, '/account/users'), crumbsForActiveRoute(TREE, '/account/users'))
|
|
})
|
|
|
|
test('test_task_015_page_title_breadcrumb_boundary_empty_input', () => {
|
|
// 边界空值:无页面标题时文档标题仅品牌;空树/空激活路径返回空面包屑。
|
|
assert.equal(resolveDocumentTitle(''), ADMIN_BRAND)
|
|
assert.equal(resolveDocumentTitle(' '), ADMIN_BRAND)
|
|
assert.deepEqual(crumbsForActiveRoute([], '/x'), [])
|
|
assert.deepEqual(crumbsForActiveRoute(undefined, '/x'), [])
|
|
})
|
|
|
|
test('test_task_015_page_title_breadcrumb_boundary_single_item', () => {
|
|
// 边界单元素:顶级叶子页命中返回自身单级面包屑。
|
|
const crumbs = crumbsForActiveRoute(TREE, '/top')
|
|
assert.equal(crumbs.length, 1)
|
|
assert.equal(crumbs[0].name, '顶级页')
|
|
})
|
|
|
|
test('test_task_015_page_title_breadcrumb_boundary_limit_or_missing_field', () => {
|
|
// 边界上限/缺字段:激活路径不在菜单树中时返回空,不伪造父级。
|
|
assert.deepEqual(crumbsForActiveRoute(TREE, '/no/such/page'), [])
|
|
})
|
|
|
|
test('test_task_015_page_title_breadcrumb_invalid_input_rejected', () => {
|
|
// 异常输入:非法页面标题按空处理;doc 缺省时更新静默失败不抛异常。
|
|
assert.equal(resolveDocumentTitle(null as unknown as string), ADMIN_BRAND)
|
|
assert.doesNotThrow(() => updateDocumentTitle('标题', null))
|
|
})
|
|
|
|
test('test_task_015_page_title_breadcrumb_dependency_failure_returns_actionable_message', () => {
|
|
// 依赖失败:壳层接入文档标题同步与面包屑渲染。
|
|
const layout = readSource('src/layout/AdminLayout.vue')
|
|
assert.match(layout, /updateDocumentTitle/)
|
|
assert.match(layout, /resolveDocumentTitle/)
|
|
assert.match(layout, /crumbsForActiveRoute/)
|
|
assert.match(layout, /el-breadcrumb/)
|
|
assert.match(layout, /breadcrumbs\.length > 1/)
|
|
})
|