147 lines
6.0 KiB
TypeScript
147 lines
6.0 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
|
|
import {
|
|
extensionsPathForRoute,
|
|
parseExtensionsPath,
|
|
parseSettingsPath,
|
|
settingsDeveloperModePaletteItem,
|
|
settingsReturnRoute,
|
|
settingsPathForRoute,
|
|
} from "../src/react-app/shell/settings-route";
|
|
import {
|
|
getSettingsTabLabel,
|
|
getWorkspaceSettingsTabs,
|
|
isSettingsTabActive,
|
|
} from "../src/react-app/domains/settings/shell/settings-page";
|
|
|
|
describe("settings route parsing", () => {
|
|
test("parses the first-class Extensions route for direct workspace navigation and reloads", () => {
|
|
const pathname = "/workspace/workspace_1/extensions";
|
|
const route = parseExtensionsPath(pathname);
|
|
|
|
expect(route).toEqual({ tab: "extensions", redirectPath: null, extensionsSection: "all" });
|
|
expect(parseExtensionsPath(pathname)).toEqual(route);
|
|
expect(isSettingsTabActive(route.tab, "extensions")).toBe(true);
|
|
expect(isSettingsTabActive(route.tab, "general")).toBe(false);
|
|
});
|
|
|
|
test("preserves top-level Extensions section and detail deep links", () => {
|
|
expect(parseExtensionsPath("/extensions/apps")).toEqual({ tab: "extensions", redirectPath: null, extensionsSection: "apps" });
|
|
expect(parseExtensionsPath("/workspace/workspace_1/extensions/mcps")).toEqual({ tab: "extensions", redirectPath: null, extensionsSection: "mcps" });
|
|
expect(parseExtensionsPath("/workspace/workspace_1/extensions/skill%3Abriefing")).toEqual({
|
|
tab: "extensions",
|
|
redirectPath: null,
|
|
extensionsSection: "all",
|
|
extensionDetailId: "skill:briefing",
|
|
});
|
|
});
|
|
|
|
test("redirects Connect settings into Extensions", () => {
|
|
expect(parseSettingsPath("/settings/connect")).toEqual({
|
|
tab: "extensions",
|
|
redirectPath: "extensions",
|
|
extensionsSection: "all",
|
|
});
|
|
expect(parseSettingsPath("/workspace/workspace_1/settings/connect")).toEqual({
|
|
tab: "extensions",
|
|
redirectPath: "extensions",
|
|
extensionsSection: "all",
|
|
});
|
|
});
|
|
|
|
test("preserves extension section deep links", () => {
|
|
expect(parseSettingsPath("/settings/extensions/apps")).toEqual({ tab: "extensions", redirectPath: null, extensionsSection: "apps" });
|
|
expect(parseSettingsPath("/settings/extensions/connections")).toEqual({ tab: "extensions", redirectPath: null, extensionsSection: "connections" });
|
|
expect(parseSettingsPath("/settings/extensions/mcps")).toEqual({ tab: "extensions", redirectPath: null, extensionsSection: "mcps" });
|
|
expect(parseSettingsPath("/settings/extensions/skills")).toEqual({ tab: "extensions", redirectPath: null, extensionsSection: "skills" });
|
|
expect(parseSettingsPath("/settings/extensions/plugins")).toEqual({ tab: "extensions", redirectPath: null, extensionsSection: "plugins" });
|
|
});
|
|
|
|
test("round-trips Library state sections through settings and first-class route writers", () => {
|
|
const sections: Array<"needs-sign-in" | "needs-admin-setup"> = ["needs-sign-in", "needs-admin-setup"];
|
|
for (const section of sections) {
|
|
const settingsRoute = parseSettingsPath(`/settings/extensions/${section}`);
|
|
expect(settingsRoute).toEqual({ tab: "extensions", redirectPath: null, extensionsSection: section });
|
|
expect(settingsPathForRoute(settingsRoute)).toBe(`extensions/${section}`);
|
|
expect(parseSettingsPath(`/settings/${settingsPathForRoute(settingsRoute)}`)).toEqual(settingsRoute);
|
|
|
|
const extensionsRoute = parseExtensionsPath(`/extensions/${section}`);
|
|
expect(extensionsPathForRoute(extensionsRoute)).toBe(section);
|
|
expect(parseExtensionsPath(`/extensions/${extensionsPathForRoute(extensionsRoute)}`)).toEqual(extensionsRoute);
|
|
}
|
|
});
|
|
|
|
test("redirects the old mcp section to the MCPs filter", () => {
|
|
expect(parseSettingsPath("/settings/extensions/mcp")).toEqual({
|
|
tab: "extensions",
|
|
redirectPath: "extensions/mcps",
|
|
extensionsSection: "mcps",
|
|
});
|
|
expect(parseSettingsPath("/settings/mcp")).toEqual({
|
|
tab: "extensions",
|
|
redirectPath: "extensions/mcps",
|
|
extensionsSection: "mcps",
|
|
});
|
|
});
|
|
|
|
test("treats non-section extension tails as detail ids", () => {
|
|
expect(parseSettingsPath("/settings/extensions/notion")).toEqual({
|
|
tab: "extensions",
|
|
redirectPath: null,
|
|
extensionsSection: "all",
|
|
extensionDetailId: "notion",
|
|
});
|
|
expect(parseSettingsPath("/settings/extensions/skill%3Abriefing")).toEqual({
|
|
tab: "extensions",
|
|
redirectPath: null,
|
|
extensionsSection: "all",
|
|
extensionDetailId: "skill:briefing",
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("settings navigation", () => {
|
|
test("includes Library in workspace settings", () => {
|
|
expect(getWorkspaceSettingsTabs()).toEqual(["preferences", "permissions", "extensions", "advanced"]);
|
|
expect(getSettingsTabLabel("extensions")).toBe("Library");
|
|
});
|
|
|
|
test("returns to the originating session in the same workspace", () => {
|
|
expect(settingsReturnRoute("workspace_1", "workspace_1", "session_1")).toBe(
|
|
"/workspace/workspace_1/session/session_1",
|
|
);
|
|
});
|
|
|
|
test("does not carry a session into a different selected workspace", () => {
|
|
expect(settingsReturnRoute("workspace_2", "workspace_1", "session_1")).toBe(
|
|
"/workspace/workspace_2/session",
|
|
);
|
|
});
|
|
|
|
test("returns direct settings visits to the selected workspace root", () => {
|
|
expect(settingsReturnRoute("workspace_1", null, null)).toBe("/workspace/workspace_1/session");
|
|
expect(settingsReturnRoute("", null, null)).toBe("/session");
|
|
});
|
|
|
|
test("labels the developer mode palette toggle from its current state", () => {
|
|
let toggleCount = 0;
|
|
const enable = settingsDeveloperModePaletteItem(false, () => {
|
|
toggleCount += 1;
|
|
});
|
|
const disable = settingsDeveloperModePaletteItem(true, () => {
|
|
toggleCount += 1;
|
|
});
|
|
|
|
expect({ title: enable.title, meta: enable.meta }).toEqual({
|
|
title: "Enable Developer Mode",
|
|
meta: "Off",
|
|
});
|
|
expect({ title: disable.title, meta: disable.meta }).toEqual({
|
|
title: "Disable Developer Mode",
|
|
meta: "On",
|
|
});
|
|
enable.action();
|
|
expect(toggleCount).toBe(1);
|
|
});
|
|
});
|