Files
dbx/apps/desktop/src/lib/__tests__/app/rightSidebarPanels.spec.ts
T

83 lines
4.7 KiB
TypeScript
Vendored

import { readFileSync } from "node:fs";
import { describe, expect, it } from "vitest";
const appSource = readFileSync(new URL("../../../App.vue", import.meta.url), "utf8");
const toolbarSource = readFileSync(new URL("../../../components/layout/AppToolbar.vue", import.meta.url), "utf8");
function functionSource(name: string, nextName: string): string {
const start = appSource.indexOf(`function ${name}`);
const end = appSource.indexOf(`function ${nextName}`, start + 1);
return appSource.slice(start, end);
}
describe("right sidebar panel entry points", () => {
it("routes toolbar and close actions through the centralized controller", () => {
expect(appSource).toContain("@toggle-ai=\"toggleRightSidebarPanel('ai')\"");
expect(appSource).toContain("@toggle-history=\"toggleRightSidebarPanel('history')\"");
expect(appSource).toContain("@toggle-sql-library=\"toggleRightSidebarPanel('sqlLibrary')\"");
expect(appSource).toContain("@toggle-sql-file-panel=\"toggleRightSidebarPanel('sqlFile')\"");
expect(appSource).toContain("@close=\"closeRightSidebarPanel('history')\"");
expect(appSource).toContain("@close=\"closeRightSidebarPanel('sqlLibrary')\"");
expect(appSource).toContain("@close=\"closeRightSidebarPanel('sqlFile')\"");
});
it("toggles the AI panel through the configured global shortcut", () => {
expect(appSource).toContain("isToggleAiPanelShortcut(e, shortcuts)");
expect(appSource).toContain('toggleRightSidebarPanel("ai");');
});
it("routes welcome, history analysis, selection, and error-fix opens through the same controller", () => {
expect(appSource).toContain("@show-history=\"openRightSidebarPanel('history')\"");
expect(functionSource("fixWithAi", "sendSelectionToAi")).toContain('openRightSidebarPanel("ai")');
expect(functionSource("sendSelectionToAi", "openAiPanel")).toContain('openRightSidebarPanel("ai")');
expect(functionSource("openAiPanel", "analyzeHistoryWithAi")).toContain('openRightSidebarPanel("ai")');
});
it("keeps existing persisted panel keys and synchronizes exclusivity after settings load", () => {
expect(appSource).toContain('ai: "dbx-ai-panel-open"');
expect(appSource).toContain('sqlLibrary: "dbx-sql-library-open"');
expect(appSource).toContain('sqlFile: "dbx-sql-file-panel-open"');
expect(appSource).not.toContain('history: "dbx-');
expect(appSource).toContain("settingsStore.isEditorSettingsLoaded");
expect(appSource).toContain("enforceRightSidebarPanelExclusivity(currentRightSidebarPanelState(), lastOpenedRightSidebarPanel)");
});
it("does not couple toolbar visibility to panel closing", () => {
for (const [setting, event] of [
["sqlLibrary", "toggle-sql-library"],
["sqlFileTree", "toggle-sql-file-panel"],
["history", "toggle-history"],
["ai", "toggle-ai"],
]) {
expect(toolbarSource).toContain(`<Tooltip v-if="toolbarItems.${setting}">`);
expect(toolbarSource).toContain(`@click="emit('${event}')"`);
}
expect(appSource).not.toMatch(/watch\([\s\S]{0,180}toolbarItems\.(ai|history|sqlLibrary|sqlFileTree)[\s\S]{0,180}closeRightSidebarPanel/);
});
it("keeps the maximized AI surface in the parent layout", () => {
expect(appSource).toContain("const isAiPanelMaximized = ref(false);");
expect(appSource).toContain(':maximized="isAiPanelMaximized"');
expect(appSource).toContain('@toggle-maximize="toggleAiPanelMaximized"');
expect(appSource).toContain("isAiPanelMaximized ? 'min-w-0 flex-1' : 'min-w-[180px] max-w-full'");
expect(appSource).toContain('v-show="!isAiPanelMaximized && !isZenMode"');
expect(functionSource("setRightSidebarPanelOpen", "toggleRightSidebarPanel")).toContain("isAiPanelMaximized.value = false;");
});
it("keeps Zen mode as a temporary data or Nacos-tab layout", () => {
expect(appSource).toContain("const isZenMode = ref(false);");
expect(appSource).toContain('return mode === "data" || mode === "nacos";');
expect(appSource).toContain("function toggleZenMode() {");
expect(appSource).toContain("if (!supportsZenMode(activeTab.value?.mode)) return;");
expect(appSource).toContain("isToggleZenModeShortcut(e, shortcuts) && supportsZenMode(activeTab.value?.mode)");
expect(appSource).toContain('@toggle-zen-mode="toggleZenMode"');
expect(appSource).toContain('v-show="sidebarOpen && !isZenMode"');
expect(appSource).toContain(':show-sidebar-expand="!sidebarOpen && !isZenMode"');
expect(toolbarSource).toContain('<Tooltip v-if="showSidebarExpand">');
expect(toolbarSource).toContain("@click=\"emit('expand-sidebar')\"");
expect(appSource).toContain('@expand-sidebar="setSidebarOpen(true)"');
expect(appSource).toContain('v-show="!isAiPanelMaximized || isZenMode"');
expect(appSource).toContain('v-show="!isZenMode"');
});
});