99 lines
3.1 KiB
TypeScript
99 lines
3.1 KiB
TypeScript
import { readFileSync } from 'node:fs';
|
|
import { join } from 'node:path';
|
|
|
|
describe('blog-menu.sql', () => {
|
|
const sqlFiles = [
|
|
readFileSync(join(process.cwd(), 'sql/blog-menu.sql'), 'utf8'),
|
|
readFileSync(join(process.cwd(), 'sql/vben-admin-init.sql'), 'utf8'),
|
|
];
|
|
|
|
/**
|
|
* 断言博客菜单种子和全量初始化 SQL 同步包含同一段菜单配置。
|
|
* @param snippet - SQL 片段;同时约束增量菜单脚本和全量初始化脚本。
|
|
*/
|
|
function expectAllSqlToContain(snippet: string) {
|
|
sqlFiles.forEach((sql) => {
|
|
expect(sql).toContain(snippet);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 执行 博客内容流程。
|
|
* @param name - 名称文本;影响 expectMenuRoute 的返回值。
|
|
* @param path - 路由或文件路径;影响 expectMenuRoute 的返回值。
|
|
* @param component - component 输入;影响 expectMenuRoute 的返回值。
|
|
* @param authCode - authCode 输入;影响 expectMenuRoute 的返回值。
|
|
*/
|
|
function expectMenuRoute(
|
|
name: string,
|
|
path: string,
|
|
component: string,
|
|
authCode: string,
|
|
) {
|
|
expectAllSqlToContain(
|
|
`'${name}', '${path}', '${component}', NULL, '${authCode}', 'menu'`,
|
|
);
|
|
}
|
|
|
|
it('adds local blog admin menus and action permissions', () => {
|
|
[
|
|
'Blog',
|
|
'BlogArticle',
|
|
'BlogArticleCreate',
|
|
'BlogArticleEdit',
|
|
'BlogArticleDelete',
|
|
'BlogArticleImport',
|
|
'BlogArticlePreview',
|
|
'BlogArticlePreviewButton',
|
|
'BlogCategory',
|
|
'BlogTag',
|
|
'BlogTheme',
|
|
'BlogThemeSave',
|
|
'BlogThemeImport',
|
|
].forEach((name) => {
|
|
expectAllSqlToContain(`'${name}'`);
|
|
});
|
|
});
|
|
|
|
it('keeps database menu routes aligned with admin route components', () => {
|
|
expectAllSqlToContain(
|
|
"'Blog', '/blog', NULL, '/blog/article', NULL, 'catalog'",
|
|
);
|
|
expectMenuRoute(
|
|
'BlogArticle',
|
|
'/blog/article',
|
|
'/blog/article/list',
|
|
'Blog:Article:List',
|
|
);
|
|
expectAllSqlToContain(
|
|
"'BlogArticlePreview', '/blog/article/:articleId/preview', '/blog/article/preview/index', NULL, 'Blog:Article:Preview', 'menu'",
|
|
);
|
|
expectAllSqlToContain(
|
|
`'BlogArticlePreviewButton', NULL, NULL, NULL, 'Blog:Article:Preview', 'button'`,
|
|
);
|
|
expectAllSqlToContain('"hideInMenu":true');
|
|
expectAllSqlToContain('"activePath":"/blog/article"');
|
|
expectMenuRoute(
|
|
'BlogCategory',
|
|
'/blog/category',
|
|
'/blog/category/list',
|
|
'Blog:Category:List',
|
|
);
|
|
expectMenuRoute('BlogTag', '/blog/tag', '/blog/tag/list', 'Blog:Tag:List');
|
|
expectMenuRoute(
|
|
'BlogTheme',
|
|
'/blog/theme',
|
|
'/blog/theme/config',
|
|
'Blog:Theme:List',
|
|
);
|
|
});
|
|
|
|
it('grants blog menus to admin roles without deleting existing role menus', () => {
|
|
const blogMenuSql = sqlFiles[0] || '';
|
|
expect(blogMenuSql).toContain('INSERT IGNORE INTO `admin_role_menu`');
|
|
expect(blogMenuSql).toContain("menu.`name` LIKE 'Blog%'");
|
|
expect(blogMenuSql).toContain("role.`role_code` IN ('super', 'admin')");
|
|
expect(blogMenuSql).not.toMatch(/DELETE\s+FROM\s+`admin_role_menu`/i);
|
|
});
|
|
});
|