kt-template-online-api/test/blog/blog-menu-sql.spec.ts

73 lines
1.8 KiB
TypeScript

import { readFileSync } from 'node:fs';
import { join } from 'node:path';
describe('blog-menu.sql', () => {
const sql = readFileSync(join(process.cwd(), 'sql/blog-menu.sql'), 'utf8');
function expectMenuRoute(
name: string,
path: string,
component: string,
authCode: string,
) {
expect(sql).toContain(
`'${name}', '${path}', '${component}', NULL, '${authCode}', 'menu'`,
);
}
it('adds local blog admin menus and action permissions', () => {
[
'Blog',
'BlogArticle',
'BlogArticleCreate',
'BlogArticleEdit',
'BlogArticleDelete',
'BlogArticleImport',
'BlogCategory',
'BlogTag',
'BlogTheme',
'BlogThemeSave',
'BlogThemeImport',
].forEach((name) => {
expect(sql).toContain(`'${name}'`);
});
});
it('keeps database menu routes aligned with admin route components', () => {
expect(sql).toContain(
"'Blog', '/blog', NULL, '/blog/article', NULL, 'catalog'",
);
expectMenuRoute(
'BlogArticle',
'/blog/article',
'/blog/article/list',
'Blog:Article:List',
);
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', () => {
expect(sql).toContain('INSERT IGNORE INTO `admin_role_menu`');
expect(sql).toContain("menu.`name` LIKE 'Blog%'");
expect(sql).toContain("role.`role_code` IN ('super', 'admin')");
expect(sql).not.toMatch(/DELETE\s+FROM\s+`admin_role_menu`/i);
});
});