Files
lingxi/apps/web/src/navigation/nav-config.spec.ts
T
Stev_Wang 073d210a92 feat(web): 搭建 Web 壳层与 UI 包基线
React 19 + Vite 6 + Router 7 + TanStack Query + Zustand;Semi 二次封装与 Remix 图标统一出口;顶部模块 + 左侧功能菜单布局、Cloud Blue 主题、登录页与 401/403/404/500 页面;请求层含 token 注入、单飞刷新与统一错误提示。
2026-11-02 17:21:16 +08:00

42 lines
1.9 KiB
TypeScript

import type { PermissionCode } from '@lingxi/shared';
import { describe, expect, it } from 'vitest';
import { filterNavByPermissions, findActiveNav, getBreadcrumbs, NAV_MODULES } from './nav-config';
describe('导航配置', () => {
it('拥有全部权限时展示全部模块与菜单', () => {
const permissions = new Set(
NAV_MODULES.flatMap((module) => module.items.map((item) => item.permission)).filter(
(code): code is PermissionCode => code !== undefined,
),
);
const modules = filterNavByPermissions(NAV_MODULES, permissions);
expect(modules.map((module) => module.key)).toEqual(NAV_MODULES.map((module) => module.key));
});
it('缺少权限点时过滤菜单,模块没有子菜单时整组隐藏', () => {
const modules = filterNavByPermissions(NAV_MODULES, new Set(['script:read']));
const script = modules.find((module) => module.key === 'script');
expect(script?.items.map((item) => item.key)).toEqual(['library']);
expect(modules.some((module) => module.key === 'platform')).toBe(false);
});
it('只有无权限要求的菜单时仍然可见', () => {
const modules = filterNavByPermissions(NAV_MODULES, new Set());
expect(modules.map((module) => module.key)).toEqual(['dashboard']);
});
it('按路径定位当前模块与菜单', () => {
const active = findActiveNav(NAV_MODULES, '/material/quick-review');
expect(active?.module.key).toBe('material');
expect(active?.item?.label).toBe('快筛');
expect(findActiveNav(NAV_MODULES, '/not-exists')).toBeNull();
});
it('面包屑从导航配置派生', () => {
expect(getBreadcrumbs(NAV_MODULES, '/')).toEqual([{ key: 'home', label: '工作台', path: '/' }]);
const breadcrumbs = getBreadcrumbs(NAV_MODULES, '/platform/users');
expect(breadcrumbs.map((entry) => entry.label)).toEqual(['工作台', '平台', '用户与组织']);
});
});