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 & { 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/) })