源码快照 @ 2026-09-02 (source-only, 剔除非源码素材)
This commit is contained in:
@@ -0,0 +1,159 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
|
||||
import {
|
||||
closeWorkbenchTab,
|
||||
focusWorkbenchPane,
|
||||
openWorkbenchTab,
|
||||
setWorkbenchSplit,
|
||||
syncWorkbenchSnapshot,
|
||||
type WorkbenchSnapshot,
|
||||
} from "../src/react-app/domains/session/chat/workbench-store";
|
||||
|
||||
const emptyWorkbench: WorkbenchSnapshot = {
|
||||
revision: 0,
|
||||
primary: null,
|
||||
tabs: [],
|
||||
secondary: null,
|
||||
focusedPane: "primary",
|
||||
};
|
||||
|
||||
describe("workbench store", () => {
|
||||
test("retains workspace ownership for two visible sessions", () => {
|
||||
let state = syncWorkbenchSnapshot(emptyWorkbench, {
|
||||
workspaceId: "workspace-a",
|
||||
workspaceTitle: "Workspace A",
|
||||
primarySessionId: "session-a",
|
||||
sessionsKnown: true,
|
||||
sessions: [{ workspaceId: "workspace-a", sessionId: "session-a", title: "Primary" }],
|
||||
});
|
||||
state = openWorkbenchTab(state, {
|
||||
workspaceId: "workspace-b",
|
||||
workspaceTitle: "Workspace B",
|
||||
sessionId: "session-b",
|
||||
title: "Secondary",
|
||||
});
|
||||
state = setWorkbenchSplit(state, { workspaceId: "workspace-b", sessionId: "session-b" });
|
||||
|
||||
expect(state.primary).toMatchObject({ workspaceId: "workspace-a", sessionId: "session-a" });
|
||||
expect(state.secondary).toMatchObject({ workspaceId: "workspace-b", sessionId: "session-b" });
|
||||
expect(state.tabs.map((tab) => `${tab.workspaceId}/${tab.sessionId}`)).toEqual([
|
||||
"workspace-a/session-a",
|
||||
"workspace-b/session-b",
|
||||
]);
|
||||
expect(state.focusedPane).toBe("secondary");
|
||||
});
|
||||
|
||||
test("preserves a cross-workspace secondary while the primary workspace synchronizes", () => {
|
||||
let state = syncWorkbenchSnapshot(emptyWorkbench, {
|
||||
workspaceId: "workspace-a",
|
||||
primarySessionId: "session-a",
|
||||
sessionsKnown: true,
|
||||
sessions: [{ workspaceId: "workspace-a", sessionId: "session-a" }],
|
||||
});
|
||||
state = openWorkbenchTab(state, { workspaceId: "workspace-b", sessionId: "session-b" });
|
||||
state = setWorkbenchSplit(state, { workspaceId: "workspace-b", sessionId: "session-b" });
|
||||
|
||||
const synchronized = syncWorkbenchSnapshot(state, {
|
||||
workspaceId: "workspace-a",
|
||||
workspaceTitle: "Workspace A renamed",
|
||||
primarySessionId: "session-a",
|
||||
sessionsKnown: true,
|
||||
sessions: [{ workspaceId: "workspace-a", sessionId: "session-a", title: "Primary renamed" }],
|
||||
});
|
||||
|
||||
expect(synchronized.primary?.title).toBe("Primary renamed");
|
||||
expect(synchronized.secondary).toMatchObject({ workspaceId: "workspace-b", sessionId: "session-b" });
|
||||
});
|
||||
|
||||
test("treats identical session IDs in different workspaces as distinct", () => {
|
||||
let state = syncWorkbenchSnapshot(emptyWorkbench, {
|
||||
workspaceId: "workspace-a",
|
||||
primarySessionId: "session-shared",
|
||||
sessionsKnown: true,
|
||||
sessions: [{ workspaceId: "workspace-a", sessionId: "session-shared" }],
|
||||
});
|
||||
state = openWorkbenchTab(state, { workspaceId: "workspace-b", sessionId: "session-shared" });
|
||||
state = setWorkbenchSplit(state, { workspaceId: "workspace-b", sessionId: "session-shared" });
|
||||
|
||||
expect(state.tabs).toHaveLength(2);
|
||||
expect(state.secondary?.workspaceId).toBe("workspace-b");
|
||||
});
|
||||
|
||||
test("focuses and closes a secondary by its full workspace reference", () => {
|
||||
let state = syncWorkbenchSnapshot(emptyWorkbench, {
|
||||
workspaceId: "workspace-a",
|
||||
primarySessionId: "session-a",
|
||||
sessionsKnown: true,
|
||||
sessions: [{ workspaceId: "workspace-a", sessionId: "session-a" }],
|
||||
});
|
||||
state = openWorkbenchTab(state, { workspaceId: "workspace-b", sessionId: "session-b" });
|
||||
state = setWorkbenchSplit(state, { workspaceId: "workspace-b", sessionId: "session-b" });
|
||||
state = focusWorkbenchPane(state, "primary");
|
||||
state = focusWorkbenchPane(state, "secondary");
|
||||
state = closeWorkbenchTab(state, { workspaceId: "workspace-b", sessionId: "session-b" });
|
||||
|
||||
expect(state.secondary).toBeNull();
|
||||
expect(state.primary).toMatchObject({ workspaceId: "workspace-a", sessionId: "session-a" });
|
||||
expect(state.focusedPane).toBe("primary");
|
||||
});
|
||||
|
||||
test("promotes the secondary session when the primary closes", () => {
|
||||
let state = syncWorkbenchSnapshot(emptyWorkbench, {
|
||||
workspaceId: "workspace-a",
|
||||
primarySessionId: "session-a",
|
||||
sessionsKnown: true,
|
||||
sessions: [{ workspaceId: "workspace-a", sessionId: "session-a" }],
|
||||
});
|
||||
state = openWorkbenchTab(state, { workspaceId: "workspace-b", sessionId: "session-b" });
|
||||
state = setWorkbenchSplit(state, { workspaceId: "workspace-b", sessionId: "session-b" });
|
||||
state = closeWorkbenchTab(state, { workspaceId: "workspace-a", sessionId: "session-a" });
|
||||
|
||||
expect(state.primary).toMatchObject({ workspaceId: "workspace-b", sessionId: "session-b" });
|
||||
expect(state.secondary).toBeNull();
|
||||
expect(state.focusedPane).toBe("primary");
|
||||
expect(state.tabs.map((tab) => `${tab.workspaceId}/${tab.sessionId}`)).toEqual([
|
||||
"workspace-b/session-b",
|
||||
]);
|
||||
});
|
||||
|
||||
test("keeps the same revision when synchronization changes nothing", () => {
|
||||
const state = syncWorkbenchSnapshot(emptyWorkbench, {
|
||||
workspaceId: "workspace-a",
|
||||
primarySessionId: "session-a",
|
||||
sessionsKnown: true,
|
||||
sessions: [{ workspaceId: "workspace-a", sessionId: "session-a", title: "Session" }],
|
||||
});
|
||||
const unchanged = syncWorkbenchSnapshot(state, {
|
||||
workspaceId: "workspace-a",
|
||||
primarySessionId: "session-a",
|
||||
sessionsKnown: true,
|
||||
sessions: [{ workspaceId: "workspace-a", sessionId: "session-a", title: "Session" }],
|
||||
});
|
||||
|
||||
expect(unchanged).toBe(state);
|
||||
});
|
||||
|
||||
test("does not prune retained same-workspace tabs while the session index reloads", () => {
|
||||
let state = syncWorkbenchSnapshot(emptyWorkbench, {
|
||||
workspaceId: "workspace-a",
|
||||
primarySessionId: "session-a",
|
||||
sessionsKnown: true,
|
||||
sessions: [
|
||||
{ workspaceId: "workspace-a", sessionId: "session-a" },
|
||||
{ workspaceId: "workspace-a", sessionId: "session-b" },
|
||||
],
|
||||
});
|
||||
state = openWorkbenchTab(state, { workspaceId: "workspace-a", sessionId: "session-b" });
|
||||
state = setWorkbenchSplit(state, { workspaceId: "workspace-a", sessionId: "session-b" });
|
||||
|
||||
const loading = syncWorkbenchSnapshot(state, {
|
||||
workspaceId: "workspace-a",
|
||||
primarySessionId: "session-a",
|
||||
sessionsKnown: false,
|
||||
sessions: [],
|
||||
});
|
||||
|
||||
expect(loading.tabs.map((tab) => tab.sessionId)).toEqual(["session-a", "session-b"]);
|
||||
expect(loading.secondary?.sessionId).toBe("session-b");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user