mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-06-29 05:01:22 +08:00
🐛 fix(sidebar): 修复视图元数据重复导致侧边栏树渲染错乱
- MySQL 视图元数据缺失 schema 时回填当前数据库 - 避免多条回退查询生成重复视图节点 - 补充侧边栏视图去重回归测试
This commit is contained in:
@@ -1,10 +1,17 @@
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
vi.mock("../../../wailsjs/go/app/App", () => ({
|
||||
DBQuery: vi.fn(),
|
||||
}));
|
||||
|
||||
import { buildSchemasMetadataQuerySpecs } from "./sidebarMetadataLoaders";
|
||||
import { DBQuery } from "../../../wailsjs/go/app/App";
|
||||
import { buildSchemasMetadataQuerySpecs, loadViews } from "./sidebarMetadataLoaders";
|
||||
|
||||
const mockedDBQuery = vi.mocked(DBQuery);
|
||||
|
||||
beforeEach(() => {
|
||||
mockedDBQuery.mockReset();
|
||||
});
|
||||
|
||||
describe("buildSchemasMetadataQuerySpecs", () => {
|
||||
it("returns schema queries for independent-schema targets", () => {
|
||||
@@ -25,4 +32,35 @@ describe("buildSchemasMetadataQuerySpecs", () => {
|
||||
it("keeps unsupported dialects empty", () => {
|
||||
expect(buildSchemasMetadataQuerySpecs("mysql", "app")).toEqual([]);
|
||||
});
|
||||
|
||||
it("deduplicates MySQL view metadata when fallback queries omit schema names", async () => {
|
||||
mockedDBQuery.mockImplementation(async (_config: unknown, _dbName: string, sql: string) => {
|
||||
if (sql.includes("information_schema.views")) {
|
||||
return {
|
||||
success: true,
|
||||
data: [{ view_name: "CHARACTER_SETS", schema_name: "information_schema" }],
|
||||
};
|
||||
}
|
||||
if (sql.includes("information_schema.tables")) {
|
||||
return {
|
||||
success: true,
|
||||
data: [{ view_name: "CHARACTER_SETS", schema_name: "information_schema", table_type: "SYSTEM VIEW" }],
|
||||
};
|
||||
}
|
||||
if (sql.includes("SHOW FULL TABLES FROM `information_schema` WHERE Table_type = 'VIEW'")) {
|
||||
return {
|
||||
success: true,
|
||||
data: [{ Tables_in_information_schema: "CHARACTER_SETS", Table_type: "VIEW" }],
|
||||
};
|
||||
}
|
||||
return { success: false, data: [] };
|
||||
});
|
||||
|
||||
const result = await loadViews({ config: { type: "mysql" } }, "information_schema");
|
||||
|
||||
expect(result.supported).toBe(true);
|
||||
expect(result.views).toEqual([
|
||||
{ viewName: "CHARACTER_SETS", schemaName: "information_schema" },
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -24,6 +24,13 @@ describe('sidebarMetadata', () => {
|
||||
});
|
||||
});
|
||||
|
||||
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');
|
||||
|
||||
@@ -78,9 +78,14 @@ export const normalizeSidebarViewMetadataEntry = (
|
||||
|
||||
const parsedViewName = splitQualifiedNameLast(viewName);
|
||||
const parsedNormalizedViewName = splitQualifiedNameLast(normalizedViewName);
|
||||
const normalizedDialect = String(dialect || '').trim().toLowerCase();
|
||||
const normalizedDbName = String(dbName || '').trim();
|
||||
const resolvedSchemaName = String(
|
||||
schemaName || parsedNormalizedViewName.parentPath || parsedViewName.parentPath || '',
|
||||
).trim();
|
||||
return {
|
||||
viewName: normalizedViewName,
|
||||
schemaName: String(schemaName || parsedNormalizedViewName.parentPath || parsedViewName.parentPath || '').trim(),
|
||||
schemaName: resolvedSchemaName || (normalizedDialect === 'mysql' ? normalizedDbName : ''),
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user