Files
MyGoNavi/frontend/src/utils/sidebarMetadata.test.ts
tianqijiuyun-latiao 3be08cb6cd 🐛 fix(sidebar): 修复视图元数据重复导致侧边栏树渲染错乱
- MySQL 视图元数据缺失 schema 时回填当前数据库
- 避免多条回退查询生成重复视图节点
- 补充侧边栏视图去重回归测试
2026-06-24 10:14:22 +08:00

58 lines
2.4 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import {
buildMySQLCompatibleViewMetadataSqls,
isSidebarViewTableType,
normalizeSidebarViewMetadataEntry,
normalizeSidebarViewName,
resolveSidebarMetadataDialect,
} from './sidebarMetadata';
describe('sidebarMetadata', () => {
it('normalizes MySQL-compatible view names without schema prefixes', () => {
expect(normalizeSidebarViewName('mysql', 'SYSDBA', 'SYSDBA', 'SYSDBA.V_ACCOUNT')).toBe('V_ACCOUNT');
});
it('keeps MySQL-compatible view schema metadata after display-name normalization', () => {
expect(normalizeSidebarViewMetadataEntry('mysql', 'SYSDBA', 'SYSDBA', 'SYSDBA.V_ACCOUNT')).toEqual({
viewName: 'V_ACCOUNT',
schemaName: 'SYSDBA',
});
expect(normalizeSidebarViewMetadataEntry('mysql', 'GDB_APP', 'SYSDBA', 'V_ACCOUNT')).toEqual({
viewName: 'V_ACCOUNT',
schemaName: 'SYSDBA',
});
});
it('falls back to the current database when MySQL-compatible view rows omit schema metadata', () => {
expect(normalizeSidebarViewMetadataEntry('mysql', 'information_schema', '', 'CHARACTER_SETS')).toEqual({
viewName: 'CHARACTER_SETS',
schemaName: 'information_schema',
});
});
it('uses MySQL metadata queries for custom MySQL-compatible domestic drivers', () => {
expect(resolveSidebarMetadataDialect('goldendb')).toBe('mysql');
expect(resolveSidebarMetadataDialect('custom', 'gdb')).toBe('mysql');
expect(resolveSidebarMetadataDialect('custom', 'goldendb')).toBe('mysql');
expect(resolveSidebarMetadataDialect('custom', 'greatdb')).toBe('mysql');
expect(resolveSidebarMetadataDialect('custom', 'doris')).toBe('mysql');
});
it('accepts MySQL-compatible view type variants returned by domestic databases', () => {
expect(isSidebarViewTableType(undefined)).toBe(true);
expect(isSidebarViewTableType('VIEW')).toBe(true);
expect(isSidebarViewTableType('SYSTEM VIEW')).toBe(true);
expect(isSidebarViewTableType('BASE VIEW')).toBe(true);
expect(isSidebarViewTableType('BASE TABLE')).toBe(false);
expect(isSidebarViewTableType('MATERIALIZED VIEW')).toBe(false);
});
it('adds SHOW FULL TABLES view-only fallbacks for MySQL-compatible databases', () => {
expect(buildMySQLCompatibleViewMetadataSqls('GDB_APP')).toEqual(expect.arrayContaining([
"SHOW FULL TABLES FROM `GDB_APP` WHERE Table_type = 'VIEW'",
"SHOW FULL TABLES WHERE Table_type = 'VIEW'",
]));
});
});