Files
openwork/apps/app/tests/settings-route.test.ts

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);
});
});