fix(schema-diff): load Oracle namespace options

This commit is contained in:
Eve authored and GitHub committed 2026-09-14 19:59:59 +08:00
1 parent cabc7656de
commit 0854cc3e08
2 files changed
+85 -8

No files matched your search

@@ -472,14 +472,7 @@ async function loadDatabases(connectionId: string, side: "source" | "target") {
try {
await store.ensureConnected(connectionId);
const config = store.getConfig(connectionId);
let dbNames: string[];
if (config?.db_type === "dameng") {
// 达梦的"数据库"概念对应 schema,使用 fetchNamespaceOptionsForConnection
dbNames = await fetchNamespaceOptionsForConnection(connectionId, config);
} else {
const dbs = await api.listDatabases(connectionId);
dbNames = Array.isArray(dbs) ? dbs.map((db: any) => (typeof db === "string" ? db : db.name || db.database)) : [];
}
const dbNames = config ? await fetchNamespaceOptionsForConnection(connectionId, config) : (await api.listDatabases(connectionId)).map((db) => db.name);
if (side === "source") {
sourceDatabases.value = dbNames;
if (props.sourceDatabase) {
@@ -0,0 +1,84 @@
// @vitest-environment happy-dom
import { createApp, defineComponent, h, nextTick, type App } from "vue";
import { afterEach, expect, it, vi } from "vitest";
import i18n from "@/i18n";
import { getDefaultOptionsForDbType } from "@/types/schemaDiff";
import SchemaDiffConfigStep from "@/components/diff/SchemaDiffConfigStep.vue";
const mocks = vi.hoisted(() => ({
ensureConnected: vi.fn().mockResolvedValue(undefined),
listDatabases: vi.fn().mockResolvedValue([]),
listSchemas: vi.fn().mockResolvedValue(["APP", "REPORTING"]),
}));
vi.mock("@/stores/connectionStore", () => {
const connection = { id: "oracle-11g", name: "Oracle 11g", db_type: "oracle", driver_profile: "oracle", database: "XE" };
return {
useConnectionStore: () => ({
connections: [connection],
sidebarLayout: { groups: [], order: [{ type: "connection", id: connection.id }] },
getConfig: (id: string) => (id === connection.id ? connection : undefined),
ensureConnected: mocks.ensureConnected,
}),
};
});
vi.mock("@/lib/backend/api", () => ({
listDatabases: mocks.listDatabases,
listSchemas: mocks.listSchemas,
}));
const mountedApps: App[] = [];
async function flushAsyncSetup() {
for (let index = 0; index < 8; index += 1) {
await nextTick();
await new Promise((resolve) => setTimeout(resolve, 0));
}
}
afterEach(() => {
for (const app of mountedApps.splice(0)) app.unmount();
document.body.textContent = "";
vi.clearAllMocks();
});
it("offers Oracle schemas as schema-diff database choices", async () => {
const container = document.createElement("div");
document.body.append(container);
const app = createApp(
defineComponent({
setup: () => () =>
h(SchemaDiffConfigStep, {
configs: [],
activeConfigId: "",
sourceConnectionId: "oracle-11g",
sourceDatabase: "",
sourceSchema: "",
targetConnectionId: "",
targetDatabase: "",
targetSchema: "",
ignoreComments: false,
options: getDefaultOptionsForDbType("oracle"),
tableListLoader: { load: vi.fn().mockResolvedValue([]) },
loading: false,
recentConfigs: [],
}),
}),
);
mountedApps.push(app);
app.use(i18n);
app.mount(container);
await flushAsyncSetup();
const sourceDatabase = document.querySelector<HTMLButtonElement>("button.dbx-searchable-select-trigger");
expect(sourceDatabase?.disabled).toBe(false);
sourceDatabase?.click();
await flushAsyncSetup();
const options = [...document.querySelectorAll<HTMLButtonElement>(".dbx-searchable-select-list button")].map((button) => button.textContent?.trim());
expect(options).toEqual(expect.arrayContaining(["APP", "REPORTING"]));
expect(mocks.listDatabases).not.toHaveBeenCalled();
expect(mocks.listSchemas).toHaveBeenCalledWith("oracle-11g", "XE", true);
});