Files
kefu/admin-web/apps/web-antd/tests/group-navigation.test.mjs
T
2026-11-04 10:14:23 +08:00

56 lines
4.3 KiB
JavaScript

import assert from 'node:assert/strict';
import {readFile} from 'node:fs/promises';
import {pathToFileURL} from 'node:url';
import {resolve} from 'node:path';
import test from 'node:test';
const ts=await import(process.env.KEFU_SSO_TYPESCRIPT?pathToFileURL(process.env.KEFU_SSO_TYPESCRIPT+'/lib/typescript.js').href:'typescript');
const moduleUrl=source=>`data:text/javascript;base64,${Buffer.from(source).toString('base64')}`;
const compile=source=>ts.transpileModule(source,{compilerOptions:{module:ts.ModuleKind.ESNext,target:ts.ScriptTarget.ES2022}}).outputText;
const {default:routes}=await import(moduleUrl(compile(await readFile(new URL('../src/router/routes/modules/console.ts',import.meta.url),'utf8'))));
const enginePath=process.env.KEFU_SSO_WORKSPACE?pathToFileURL(resolve(process.env.KEFU_SSO_WORKSPACE,'packages/utils/src/helpers/generate-routes-frontend.ts')):new URL('../../../packages/utils/src/helpers/generate-routes-frontend.ts',import.meta.url);
const engine=await readFile(enginePath,'utf8');
const tree=ts.createSourceFile('engine.ts',engine,ts.ScriptTarget.Latest,true);
const functions=tree.statements.filter(node=>ts.isFunctionDeclaration(node)&&['hasAuthority','menuHasVisibleWithForbidden'].includes(node.name?.text)).map(node=>node.getText(tree)).join('\n');
const {hasAuthority}=await import(moduleUrl(compile(functions+'\nexport {hasAuthority};')));
const sharedPath=process.env.KEFU_SSO_WORKSPACE?pathToFileURL(resolve(process.env.KEFU_SSO_WORKSPACE,'packages/@core/base/shared/src/utils/tree.ts')):new URL('../../../packages/@core/base/shared/src/utils/tree.ts',import.meta.url);
const shared=moduleUrl(compile(await readFile(sharedPath,'utf8')));
const {generateRoutesByFrontend}=await import(moduleUrl(compile(engine).replace("from '@vben-core/shared/utils'",`from '${shared}'`)));
test('基础角色只显示我的账号,业务目录使用实际Vben权限算法按子页面读权限开放',()=>{
const visible=permissions=>routes.filter(route=>!route.meta?.hideInMenu&&hasAuthority(route,permissions)).map(route=>route.name);
assert.deepEqual(visible([]),['GroupAccount']);
assert.deepEqual(visible(['model:read']),['GroupAccount','ModelCenter']);
assert.deepEqual(visible(['config:read']),['GroupAccount','DesktopCenter']);
assert.deepEqual(visible(['im:content:read']),['GroupAccount','ArchiveCenter']);
assert.deepEqual(visible(['user:read']),['GroupAccount','SystemCenter']);
const all=[...new Set(routes.flatMap(route=>(route.children||[]).flatMap(child=>child.meta?.authority||[])))];
assert.equal(visible(all).length,6);
});
test('角色读取权限经过实际Vben父子路由过滤后可进入角色页,兼容用户读取权限',async()=>{
for(const permissions of [['role:read'],['role:read','role:write'],['user:read']]){
const filtered=await generateRoutesByFrontend(structuredClone(routes.map(({component,...route})=>({...route,children:route.children?.map(({component,...child})=>child)}))),permissions);
const system=filtered.find(route=>route.name==='SystemCenter');
assert.ok(system,permissions.join(','));
assert.ok(system.children.some(route=>route.name==='RoleManage'),permissions.join(','));
if(!permissions.includes('user:read')) assert.ok(!system.children.some(route=>route.name==='UserManage'));
}
for(const permissions of [[],['role:write'],['role:create'],['role:delete']]){
const filtered=await generateRoutesByFrontend(structuredClone(routes.map(({component,...route})=>({...route,children:route.children?.map(({component,...child})=>child)}))),permissions);
assert.ok(!filtered.some(route=>route.name==='SystemCenter'),permissions.join(','));
}
});
test('每个已授予的页面都能通过实际父目录过滤,包括新增的细分读取权限',async()=>{
for(const parent of routes.filter(route=>!route.meta?.hideInMenu)){
for(const child of parent.children||[]){
for(const code of child.meta?.authority||[]){
const input=routes.map(({component,...route})=>({...route,children:route.children?.map(({component,...page})=>page)}));
const filtered=await generateRoutesByFrontend(structuredClone(input),[code]);
const directory=filtered.find(route=>route.name===parent.name);
assert.ok(directory,`${code}: ${parent.name}`);
assert.ok(directory.children.some(page=>page.name===child.name),`${code}: ${child.name}`);
}
}
}
});