Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
|
|
import { createEmptyPane } from "./types.ts";
|
|
import {
|
|
closeSftpTabStateImmediately,
|
|
removeSftpTabFromState,
|
|
} from "./useSftpTabsState.ts";
|
|
|
|
test("closing the active SFTP tab selects its nearest remaining neighbor", () => {
|
|
const left = createEmptyPane("left");
|
|
const middle = createEmptyPane("middle");
|
|
const right = createEmptyPane("right");
|
|
|
|
assert.deepEqual(removeSftpTabFromState({
|
|
tabs: [left, middle, right],
|
|
activeTabId: middle.id,
|
|
}, middle.id), {
|
|
tabs: [left, right],
|
|
activeTabId: right.id,
|
|
});
|
|
});
|
|
|
|
test("closing a background SFTP tab preserves the active tab", () => {
|
|
const active = createEmptyPane("active");
|
|
const background = createEmptyPane("background");
|
|
|
|
assert.deepEqual(removeSftpTabFromState({
|
|
tabs: [active, background],
|
|
activeTabId: active.id,
|
|
}, background.id), {
|
|
tabs: [active],
|
|
activeTabId: active.id,
|
|
});
|
|
});
|
|
|
|
test("closing a tab updates the live ref before React commits the state update", () => {
|
|
const closing = createEmptyPane("closing");
|
|
const remaining = createEmptyPane("remaining");
|
|
const initial = {
|
|
tabs: [closing, remaining],
|
|
activeTabId: closing.id,
|
|
};
|
|
const tabsRef = { current: initial };
|
|
let queuedUpdate: ((prev: typeof initial) => typeof initial) | undefined;
|
|
|
|
closeSftpTabStateImmediately({
|
|
tabsRef,
|
|
tabId: closing.id,
|
|
setTabs: (update) => {
|
|
queuedUpdate = update;
|
|
},
|
|
});
|
|
|
|
assert.deepEqual(tabsRef.current.tabs, [remaining]);
|
|
assert.equal(tabsRef.current.activeTabId, remaining.id);
|
|
assert.deepEqual(queuedUpdate?.(initial), tabsRef.current);
|
|
});
|