kt-template-admin/apps/web-antdv-next/src/api/core/menu.spec.ts

228 lines
5.6 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest';
const requestClientGet = vi.fn();
vi.mock('#/api/request', () => ({
requestClient: {
get: requestClientGet,
},
}));
describe('core menu api', () => {
beforeEach(() => {
requestClientGet.mockReset();
});
it('keeps supported dashboard routes from backend menus', async () => {
requestClientGet.mockResolvedValue([
{
name: 'Dashboard',
path: '/dashboard',
redirect: '/analytics',
children: [
{
name: 'Analytics',
path: '/analytics',
component: '/dashboard/analytics/index',
},
],
},
{
name: 'Unsupported',
path: '/unsupported',
component: '/unsupported/index',
},
{
name: 'QqBot',
path: '/qqbot',
children: [
{
name: 'QqBotAccount',
path: '/qqbot/account',
component: '/qqbot/account/list',
children: [
{
name: 'QqBotAccountWebUI',
authCode: 'QqBot:Account:WebUI',
type: 'button',
},
],
},
{
name: 'QqBotAccountNapcatWebui',
path: '/qqbot/account/:accountId/napcat-webui',
component: '/qqbot/account/napcat-webui/index',
meta: {
activePath: '/qqbot/account',
hideInMenu: true,
title: 'NapCat WebUI',
},
},
],
},
]);
const { getAllMenusApi } = await import('./menu');
const menus = await getAllMenusApi();
expect(requestClientGet).toHaveBeenCalledWith('/menu/all');
expect(menus).toEqual([
{
name: 'Dashboard',
path: '/dashboard',
redirect: '/analytics',
children: [
{
name: 'Analytics',
path: '/analytics',
component: '/dashboard/analytics/index',
},
],
},
{
name: 'QqBot',
path: '/qqbot',
children: [
{
name: 'QqBotAccount',
path: '/qqbot/account',
component: '/qqbot/account/list',
children: [
{
name: 'QqBotAccountWebUI',
authCode: 'QqBot:Account:WebUI',
type: 'button',
},
],
},
{
name: 'QqBotAccountNapcatWebui',
path: '/qqbot/account/:accountId/napcat-webui',
component: '/qqbot/account/napcat-webui/index',
meta: {
activePath: '/qqbot/account',
hideInMenu: true,
title: 'NapCat WebUI',
},
},
],
},
]);
});
it('uses backend sort as the authoritative menu order before menu generation', async () => {
requestClientGet.mockResolvedValue([
{
name: 'Dashboard',
path: '/dashboard',
sort: 200,
meta: {
order: -1,
title: 'Dashboard',
},
},
{
name: 'QqBot',
path: '/qqbot',
sort: 1,
meta: {
title: 'QQBot',
},
children: [
{
name: 'QqBotAccount',
path: '/qqbot/account',
component: '/qqbot/account/list',
sort: 1,
meta: {
title: '账号连接',
},
},
],
},
{
name: 'Blog',
path: '/blog',
sort: 0,
meta: {
order: 100,
title: '博客管理',
},
},
]);
const { getAllMenusApi } = await import('./menu');
const menus = await getAllMenusApi();
expect(menus.map((menu) => menu.meta?.order)).toEqual([200, 1, 0]);
expect(menus[1]?.children?.[0]?.meta?.order).toBe(1);
});
it('keeps blog article preview hidden route and row action permission from backend menus', async () => {
requestClientGet.mockResolvedValue([
{
name: 'Blog',
path: '/blog',
children: [
{
name: 'BlogArticle',
path: '/blog/article',
component: '/blog/article/list',
children: [
{
name: 'BlogArticlePreviewButton',
authCode: 'Blog:Article:Preview',
type: 'button',
},
],
},
{
name: 'BlogArticlePreview',
path: '/blog/article/:articleId/preview',
component: '/blog/article/preview/index',
meta: {
activePath: '/blog/article',
hideInMenu: true,
title: '文章预览',
},
},
],
},
]);
const { getAllMenusApi } = await import('./menu');
const menus = await getAllMenusApi();
expect(menus).toEqual([
{
name: 'Blog',
path: '/blog',
children: [
{
name: 'BlogArticle',
path: '/blog/article',
component: '/blog/article/list',
children: [
{
name: 'BlogArticlePreviewButton',
authCode: 'Blog:Article:Preview',
type: 'button',
},
],
},
{
name: 'BlogArticlePreview',
path: '/blog/article/:articleId/preview',
component: '/blog/article/preview/index',
meta: {
activePath: '/blog/article',
hideInMenu: true,
title: '文章预览',
},
},
],
},
]);
});
});