import { describe, expect, it } from "vite-plus/test"; import { type KnownTerminalSession } from "@t3tools/client-runtime/state/terminal";import { DEFAULT_TERMINAL_ID, EnvironmentId, ThreadId } from "@t3tools/contracts"; import { getTerminalLabel } from "@t3tools/shared/terminalLabels"; import { buildTerminalMenuSessions, nextOpenTerminalId, nextTerminalId, resolveProjectScriptTerminalId,} from "./terminalMenu"; function makeKnownSession(input: { readonly terminalId: string; readonly status: KnownTerminalSession["state"]["status"]; readonly cwd?: string | null; readonly updatedAt?: string | null;}): KnownTerminalSession { return { target: { environmentId: EnvironmentId.make("env-1"), threadId: ThreadId.make("thread-1"), terminalId: input.terminalId, }, state: { summary: input.cwd ? { threadId: "thread-1", terminalId: input.terminalId, cwd: input.cwd, worktreePath: input.cwd, status: input.status === "closed" ? "error" : input.status, pid: input.status === "running" ? 123 : null, exitCode: null, exitSignal: null, hasRunningSubprocess: false, label: getTerminalLabel(input.terminalId), updatedAt: input.updatedAt ?? "2026-04-15T20:00:00.000Z", } : null, buffer: "", status: input.status, error: null, hasRunningSubprocess: false, updatedAt: input.updatedAt ?? "2026-04-15T20:00:00.000Z", version: 1, }, };} describe("buildTerminalMenuSessions", () => { it("only lists server-known sessions that are running or starting (plus current)", () => { expect( buildTerminalMenuSessions({ knownSessions: [ makeKnownSession({ terminalId: "term-3", status: "running", cwd: "/workspace/feature", updatedAt: "2026-04-15T20:05:00.000Z", }), makeKnownSession({ terminalId: "term-2", status: "exited", cwd: "/workspace/exited", updatedAt: "2026-04-15T20:06:00.000Z", }), ], workspaceRoot: "/workspace/root", }), ).toEqual([ { terminalId: "term-3", cwd: "/workspace/feature", status: "running", hasRunningSubprocess: false, displayLabel: "Terminal 3", updatedAt: "2026-04-15T20:05:00.000Z", }, ]); }); it("keeps the current terminal visible even if it is no longer running", () => { expect( buildTerminalMenuSessions({ knownSessions: [], workspaceRoot: "/workspace/root", currentSession: { terminalId: "term-4", cwd: "/workspace/exited", status: "exited", hasRunningSubprocess: false, displayLabel: "Terminal 4", updatedAt: "2026-04-15T20:07:00.000Z", }, }), ).toEqual([ { terminalId: "term-4", cwd: "/workspace/exited", status: "exited", hasRunningSubprocess: false, displayLabel: "Terminal 4", updatedAt: "2026-04-15T20:07:00.000Z", }, ]); });}); describe("nextTerminalId", () => { it("uses the primary id when no terminals are listed yet", () => { expect(nextTerminalId([])).toBe(DEFAULT_TERMINAL_ID); }); it("allocates term-2 when only the primary shell exists", () => { expect(nextTerminalId([DEFAULT_TERMINAL_ID])).toBe("term-2"); });}); describe("nextOpenTerminalId", () => { it("matches nextTerminalId when not on a terminal route", () => { expect(nextOpenTerminalId({ listedTerminalIds: [] })).toBe(DEFAULT_TERMINAL_ID); expect(nextOpenTerminalId({ listedTerminalIds: [DEFAULT_TERMINAL_ID] })).toBe("term-2"); }); it("avoids the mounted primary tab when the session list is still empty", () => { expect( nextOpenTerminalId({ listedTerminalIds: [], activeRouteTerminalId: DEFAULT_TERMINAL_ID, }), ).toBe("term-2"); }); it("does not double-count when the route id is already listed", () => { expect( nextOpenTerminalId({ listedTerminalIds: [DEFAULT_TERMINAL_ID], activeRouteTerminalId: DEFAULT_TERMINAL_ID, }), ).toBe("term-2"); });}); describe("resolveProjectScriptTerminalId", () => { it("reuses the default shell when no terminal is running", () => { expect( resolveProjectScriptTerminalId({ existingTerminalIds: [DEFAULT_TERMINAL_ID], hasRunningTerminal: false, }), ).toBe(DEFAULT_TERMINAL_ID); }); it("opens a new terminal when a shell is already running", () => { expect( resolveProjectScriptTerminalId({ existingTerminalIds: [DEFAULT_TERMINAL_ID, "term-2", "term-4"], hasRunningTerminal: true, }), ).toBe("term-3"); });});
import { describe, expect, it } from "vite-plus/test";
import { type KnownTerminalSession } from "@t3tools/client-runtime/state/terminal";
import { DEFAULT_TERMINAL_ID, EnvironmentId, ThreadId } from "@t3tools/contracts";
import { getTerminalLabel } from "@t3tools/shared/terminalLabels";
import {
buildTerminalMenuSessions,
nextOpenTerminalId,
nextTerminalId,
resolveProjectScriptTerminalId,
} from "./terminalMenu";
function makeKnownSession(input: {
readonly terminalId: string;
readonly status: KnownTerminalSession["state"]["status"];
readonly cwd?: string | null;
readonly updatedAt?: string | null;
}): KnownTerminalSession {
return {
target: {
environmentId: EnvironmentId.make("env-1"),
threadId: ThreadId.make("thread-1"),
terminalId: input.terminalId,
},
state: {
summary: input.cwd
? {
threadId: "thread-1",
terminalId: input.terminalId,
cwd: input.cwd,
worktreePath: input.cwd,
status: input.status === "closed" ? "error" : input.status,
pid: input.status === "running" ? 123 : null,
exitCode: null,
exitSignal: null,
hasRunningSubprocess: false,
label: getTerminalLabel(input.terminalId),
updatedAt: input.updatedAt ?? "2026-04-15T20:00:00.000Z",
}
: null,
buffer: "",
status: input.status,
error: null,
hasRunningSubprocess: false,
updatedAt: input.updatedAt ?? "2026-04-15T20:00:00.000Z",
version: 1,
},
};
}
describe("buildTerminalMenuSessions", () => {
it("only lists server-known sessions that are running or starting (plus current)", () => {
expect(
buildTerminalMenuSessions({
knownSessions: [
makeKnownSession({
terminalId: "term-3",
status: "running",
cwd: "/workspace/feature",
updatedAt: "2026-04-15T20:05:00.000Z",
}),
makeKnownSession({
terminalId: "term-2",
status: "exited",
cwd: "/workspace/exited",
updatedAt: "2026-04-15T20:06:00.000Z",
}),
],
workspaceRoot: "/workspace/root",
}),
).toEqual([
{
terminalId: "term-3",
cwd: "/workspace/feature",
status: "running",
hasRunningSubprocess: false,
displayLabel: "Terminal 3",
updatedAt: "2026-04-15T20:05:00.000Z",
},
]);
});
it("keeps the current terminal visible even if it is no longer running", () => {
expect(
buildTerminalMenuSessions({
knownSessions: [],
workspaceRoot: "/workspace/root",
currentSession: {
terminalId: "term-4",
cwd: "/workspace/exited",
status: "exited",
hasRunningSubprocess: false,
displayLabel: "Terminal 4",
updatedAt: "2026-04-15T20:07:00.000Z",
},
}),
).toEqual([
{
terminalId: "term-4",
cwd: "/workspace/exited",
status: "exited",
hasRunningSubprocess: false,
displayLabel: "Terminal 4",
updatedAt: "2026-04-15T20:07:00.000Z",
},
]);
});
});
describe("nextTerminalId", () => {
it("uses the primary id when no terminals are listed yet", () => {
expect(nextTerminalId([])).toBe(DEFAULT_TERMINAL_ID);
});
it("allocates term-2 when only the primary shell exists", () => {
expect(nextTerminalId([DEFAULT_TERMINAL_ID])).toBe("term-2");
});
});
describe("nextOpenTerminalId", () => {
it("matches nextTerminalId when not on a terminal route", () => {
expect(nextOpenTerminalId({ listedTerminalIds: [] })).toBe(DEFAULT_TERMINAL_ID);
expect(nextOpenTerminalId({ listedTerminalIds: [DEFAULT_TERMINAL_ID] })).toBe("term-2");
});
it("avoids the mounted primary tab when the session list is still empty", () => {
expect(
nextOpenTerminalId({
listedTerminalIds: [],
activeRouteTerminalId: DEFAULT_TERMINAL_ID,
}),
).toBe("term-2");
});
it("does not double-count when the route id is already listed", () => {
expect(
nextOpenTerminalId({
listedTerminalIds: [DEFAULT_TERMINAL_ID],
activeRouteTerminalId: DEFAULT_TERMINAL_ID,
}),
).toBe("term-2");
});
});
describe("resolveProjectScriptTerminalId", () => {
it("reuses the default shell when no terminal is running", () => {
expect(
resolveProjectScriptTerminalId({
existingTerminalIds: [DEFAULT_TERMINAL_ID],
hasRunningTerminal: false,
}),
).toBe(DEFAULT_TERMINAL_ID);
});
it("opens a new terminal when a shell is already running", () => {
expect(
resolveProjectScriptTerminalId({
existingTerminalIds: [DEFAULT_TERMINAL_ID, "term-2", "term-4"],
hasRunningTerminal: true,
}),
).toBe("term-3");
});
});