feat(saved-sql): run queries in the current database
This commit is contained in:
1 parent
4062f11a26
commit
e2ba75b102
22 files changed
+501
-51
No files matched your search
@@ -0,0 +1,55 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { resolveSavedSqlExecutionTarget, savedSqlDefaultTargetForWrite, savedSqlExecutionTargetFromTab } from "@/lib/savedSql/savedSqlExecutionTarget";
|
||||
|
||||
const savedTarget = {
|
||||
connectionId: "saved-connection",
|
||||
database: "saved_database",
|
||||
schema: "saved_schema",
|
||||
};
|
||||
|
||||
describe("saved SQL execution targets", () => {
|
||||
it("uses the saved target by default", () => {
|
||||
expect(
|
||||
resolveSavedSqlExecutionTarget(savedTarget, "saved", {
|
||||
connectionId: "current-connection",
|
||||
database: "current_database",
|
||||
schema: "current_schema",
|
||||
catalog: "current_catalog",
|
||||
}),
|
||||
).toEqual(savedTarget);
|
||||
});
|
||||
|
||||
it("uses the current tab target when requested", () => {
|
||||
expect(
|
||||
resolveSavedSqlExecutionTarget(savedTarget, "current", {
|
||||
connectionId: "current-connection",
|
||||
database: "current_database",
|
||||
schema: "current_schema",
|
||||
catalog: "current_catalog",
|
||||
}),
|
||||
).toEqual({
|
||||
connectionId: "current-connection",
|
||||
database: "current_database",
|
||||
schema: "current_schema",
|
||||
catalog: "current_catalog",
|
||||
});
|
||||
});
|
||||
|
||||
it("falls back to the saved target when no current tab is available", () => {
|
||||
expect(resolveSavedSqlExecutionTarget(savedTarget, "current")).toEqual(savedTarget);
|
||||
expect(savedSqlExecutionTargetFromTab(undefined)).toBeUndefined();
|
||||
});
|
||||
|
||||
it("preserves the saved default target when an existing file is updated", () => {
|
||||
expect(
|
||||
savedSqlDefaultTargetForWrite(
|
||||
{
|
||||
connectionId: "runtime-connection",
|
||||
database: "runtime_database",
|
||||
schema: "runtime_schema",
|
||||
},
|
||||
savedTarget,
|
||||
),
|
||||
).toEqual(savedTarget);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,45 @@
|
||||
import type { QueryTab, SavedSqlFile } from "@/types/database";
|
||||
|
||||
export type SavedSqlOpenTargetMode = "saved" | "current";
|
||||
|
||||
export interface SavedSqlExecutionTarget {
|
||||
connectionId: string;
|
||||
database: string;
|
||||
schema?: string;
|
||||
catalog?: string;
|
||||
}
|
||||
|
||||
type SavedSqlFileTarget = Pick<SavedSqlFile, "connectionId" | "database" | "schema">;
|
||||
type QueryTabTarget = Pick<QueryTab, "connectionId" | "database" | "schema" | "catalog">;
|
||||
|
||||
export function savedSqlExecutionTargetFromFile(file: SavedSqlFileTarget): SavedSqlExecutionTarget {
|
||||
return {
|
||||
connectionId: file.connectionId,
|
||||
database: file.database,
|
||||
schema: file.schema,
|
||||
};
|
||||
}
|
||||
|
||||
export function savedSqlExecutionTargetFromTab(tab: QueryTabTarget | undefined): SavedSqlExecutionTarget | undefined {
|
||||
if (!tab?.connectionId) return undefined;
|
||||
return {
|
||||
connectionId: tab.connectionId,
|
||||
database: tab.database,
|
||||
schema: tab.schema,
|
||||
catalog: tab.catalog,
|
||||
};
|
||||
}
|
||||
|
||||
export function resolveSavedSqlExecutionTarget(file: SavedSqlFileTarget, mode: SavedSqlOpenTargetMode, currentTarget?: SavedSqlExecutionTarget): SavedSqlExecutionTarget {
|
||||
if (mode === "current" && currentTarget) return { ...currentTarget };
|
||||
return savedSqlExecutionTargetFromFile(file);
|
||||
}
|
||||
|
||||
export function savedSqlDefaultTargetForWrite(currentTarget: SavedSqlExecutionTarget, existingFile?: SavedSqlFileTarget): SavedSqlFileTarget {
|
||||
if (existingFile) return savedSqlExecutionTargetFromFile(existingFile);
|
||||
return {
|
||||
connectionId: currentTarget.connectionId,
|
||||
database: currentTarget.database,
|
||||
schema: currentTarget.schema,
|
||||
};
|
||||
}
|
||||
@@ -21,6 +21,7 @@ function makeSettings(overrides: Partial<EditorSettings> = {}): EditorSettings {
|
||||
confirmDangerousSqlExecution: true,
|
||||
continueOnErrorOnBatch: false,
|
||||
confirmUnsavedSqlClose: true,
|
||||
savedSqlOpenTargetMode: "saved",
|
||||
objectBrowserViewMode: "list",
|
||||
sqlVariableSyntaxOverrides: {},
|
||||
tabLayout: "scroll",
|
||||
@@ -36,6 +37,10 @@ describe("EDITOR_SETTINGS_DRAFT_KEYS", () => {
|
||||
it("includes the table-open page size", () => {
|
||||
expect(EDITOR_SETTINGS_DRAFT_KEYS).toContain("tableOpenPageSize");
|
||||
});
|
||||
|
||||
it("includes the saved SQL open target mode", () => {
|
||||
expect(EDITOR_SETTINGS_DRAFT_KEYS).toContain("savedSqlOpenTargetMode");
|
||||
});
|
||||
});
|
||||
|
||||
describe("editorSettingsDraftFromSettings", () => {
|
||||
@@ -54,6 +59,10 @@ describe("editorSettingsDraftFromSettings", () => {
|
||||
delete (settings as Partial<EditorSettings>).tableOpenPageSize;
|
||||
expect(editorSettingsDraftFromSettings(settings).tableOpenPageSize).toBe(100);
|
||||
});
|
||||
|
||||
it("maps the saved SQL open target mode", () => {
|
||||
expect(editorSettingsDraftFromSettings(makeSettings({ savedSqlOpenTargetMode: "current" })).savedSqlOpenTargetMode).toBe("current");
|
||||
});
|
||||
});
|
||||
|
||||
describe("normalizeTableOpenPageSizeDraft", () => {
|
||||
@@ -94,6 +103,14 @@ describe("editorSettingsDraftChanged", () => {
|
||||
draft.tableOpenPageSize = Number.NaN;
|
||||
expect(editorSettingsDraftChanged(draft, base)).toBe(false);
|
||||
});
|
||||
|
||||
it("detects a saved SQL open target change", () => {
|
||||
const settings = makeSettings({ savedSqlOpenTargetMode: "saved" });
|
||||
const draft = editorSettingsDraftFromSettings(settings);
|
||||
const base = editorSettingsDraftFromSettings(settings);
|
||||
draft.savedSqlOpenTargetMode = "current";
|
||||
expect(editorSettingsDraftChanged(draft, base)).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("editorSettingsPatchFromDraft", () => {
|
||||
@@ -121,6 +138,14 @@ describe("editorSettingsPatchFromDraft", () => {
|
||||
draft.tableOpenPageSize = 200000.9;
|
||||
expect(editorSettingsPatchFromDraft(draft, base).tableOpenPageSize).toBe(100000);
|
||||
});
|
||||
|
||||
it("includes the saved SQL open target when changed", () => {
|
||||
const settings = makeSettings({ savedSqlOpenTargetMode: "saved" });
|
||||
const draft = editorSettingsDraftFromSettings(settings);
|
||||
const base = editorSettingsDraftFromSettings(settings);
|
||||
draft.savedSqlOpenTargetMode = "current";
|
||||
expect(editorSettingsPatchFromDraft(draft, base).savedSqlOpenTargetMode).toBe("current");
|
||||
});
|
||||
});
|
||||
|
||||
describe("EDITOR_SETTINGS_DRAFT_KEYS - tabLayout", () => {
|
||||
|
||||
@@ -23,6 +23,7 @@ export const EDITOR_SETTINGS_DRAFT_KEYS = [
|
||||
"sqlSemanticDiagnosticsMode",
|
||||
"confirmDangerousSqlExecution",
|
||||
"confirmUnsavedSqlClose",
|
||||
"savedSqlOpenTargetMode",
|
||||
"appLayout",
|
||||
"tabLayout",
|
||||
"showColumnCommentsInHeader",
|
||||
|
||||
Reference in new issue
Block a user