源码快照 @ 2026-09-02 (source-only, 剔除非源码素材)
This commit is contained in:
@@ -0,0 +1,146 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user