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
98 lines
3.0 KiB
TypeScript
98 lines
3.0 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
import {
|
|
removeKeyboardInteractiveRequest,
|
|
shouldQueueKeyboardInteractiveRequest,
|
|
} from "./useAppStartupEffects.ts";
|
|
import {
|
|
clearTerminalBootEpoch,
|
|
setTerminalBootEpoch,
|
|
} from "../../domain/terminalBootEpoch.ts";
|
|
|
|
const sessions = [{ id: "terminal-1" }, { id: "terminal-2" }];
|
|
|
|
test("terminal-scoped keyboard-interactive requests are limited to owned sessions", () => {
|
|
assert.equal(
|
|
shouldQueueKeyboardInteractiveRequest({ scope: "terminal", sessionId: "terminal-1" }, sessions),
|
|
true,
|
|
);
|
|
assert.equal(
|
|
shouldQueueKeyboardInteractiveRequest({ scope: "terminal", sessionId: "foreign-terminal" }, sessions),
|
|
false,
|
|
);
|
|
});
|
|
|
|
test("disconnected terminal sessions do not queue keyboard-interactive prompts", () => {
|
|
assert.equal(
|
|
shouldQueueKeyboardInteractiveRequest(
|
|
{ scope: "terminal", sessionId: "terminal-1" },
|
|
[{ id: "terminal-1", status: "disconnected" }],
|
|
),
|
|
false,
|
|
);
|
|
assert.equal(
|
|
shouldQueueKeyboardInteractiveRequest(
|
|
{ scope: "terminal", sessionId: "terminal-1" },
|
|
[{ id: "terminal-1", status: "connecting" }],
|
|
),
|
|
true,
|
|
);
|
|
});
|
|
|
|
test("superseded terminal boot epochs do not queue keyboard-interactive prompts", () => {
|
|
setTerminalBootEpoch("terminal-1", 3);
|
|
assert.equal(
|
|
shouldQueueKeyboardInteractiveRequest(
|
|
{ scope: "terminal", sessionId: "terminal-1", bootEpoch: 1 },
|
|
[{ id: "terminal-1", status: "connecting" }],
|
|
),
|
|
false,
|
|
);
|
|
assert.equal(
|
|
shouldQueueKeyboardInteractiveRequest(
|
|
{ scope: "terminal", sessionId: "terminal-1", bootEpoch: 3 },
|
|
[{ id: "terminal-1", status: "connecting" }],
|
|
),
|
|
true,
|
|
);
|
|
clearTerminalBootEpoch("terminal-1");
|
|
});
|
|
|
|
test("external keyboard-interactive requests are not filtered by terminal session ids", () => {
|
|
assert.equal(
|
|
shouldQueueKeyboardInteractiveRequest({ scope: "external", sessionId: "sftp-conn-1" }, sessions),
|
|
true,
|
|
);
|
|
assert.equal(
|
|
shouldQueueKeyboardInteractiveRequest({ scope: "external", sessionId: "tunnel-1" }, sessions),
|
|
true,
|
|
);
|
|
});
|
|
|
|
test("disabled peer windows still queue sender-targeted external keyboard-interactive requests", () => {
|
|
assert.equal(
|
|
shouldQueueKeyboardInteractiveRequest({ scope: "external", sessionId: "sftp-conn-1" }, sessions),
|
|
true,
|
|
);
|
|
});
|
|
|
|
test("disabled peer windows can still queue owned terminal keyboard-interactive requests", () => {
|
|
assert.equal(
|
|
shouldQueueKeyboardInteractiveRequest({ scope: "terminal", sessionId: "terminal-1" }, sessions),
|
|
true,
|
|
);
|
|
});
|
|
|
|
test("legacy unscoped keyboard-interactive requests remain visible", () => {
|
|
assert.equal(
|
|
shouldQueueKeyboardInteractiveRequest({ sessionId: "legacy-conn" }, sessions),
|
|
true,
|
|
);
|
|
});
|
|
|
|
test("cancelled keyboard-interactive requests are removed from the renderer queue", () => {
|
|
const queue = [{ requestId: "keep" }, { requestId: "cancel" }];
|
|
assert.deepEqual(removeKeyboardInteractiveRequest(queue, "cancel"), [{ requestId: "keep" }]);
|
|
});
|