Files
openclaw-zero-token/terminal/restore.test.ts
sjhu 571e14a236 feat: upgrade to upstream v2026.3.28
Major upgrade from e26988a38 to upstream v2026.3.28 (f9b107928).
Key changes:
- Upstream src/, ui/, extensions/ (89 bundled extensions)
- Zero-token web providers preserved in src/zero-token/
- AskOnce plugin restored and registered as CLI command
- Added missing packages: @anthropic-ai/vertex-sdk, @modelcontextprotocol/sdk
- Fixed tsconfig rootDir, skipLibCheck for plugin-sdk DTS build
- Added askonce to bundled plugin metadata and package.json exports
- Fixed AskOnce CLI command registration (missing commands metadata)
- Restored AskOnce adapter imports (correct 5-level relative paths)
- Removed stale migration artifacts from root directory
2026-03-30 17:58:12 +08:00

98 lines
3.0 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from "vitest";
const clearActiveProgressLine = vi.hoisted(() => vi.fn());
vi.mock("./progress-line.js", () => ({
clearActiveProgressLine,
}));
import { restoreTerminalState } from "./restore.js";
function configureTerminalIO(params: {
stdinIsTTY: boolean;
stdoutIsTTY: boolean;
setRawMode?: (mode: boolean) => void;
resume?: () => void;
isPaused?: () => boolean;
}) {
Object.defineProperty(process.stdin, "isTTY", { value: params.stdinIsTTY, configurable: true });
Object.defineProperty(process.stdout, "isTTY", { value: params.stdoutIsTTY, configurable: true });
(process.stdin as { setRawMode?: (mode: boolean) => void }).setRawMode = params.setRawMode;
(process.stdin as { resume?: () => void }).resume = params.resume;
(process.stdin as { isPaused?: () => boolean }).isPaused = params.isPaused;
}
function setupPausedTTYStdin() {
const setRawMode = vi.fn();
const resume = vi.fn();
const isPaused = vi.fn(() => true);
configureTerminalIO({
stdinIsTTY: true,
stdoutIsTTY: false,
setRawMode,
resume,
isPaused,
});
return { setRawMode, resume };
}
describe("restoreTerminalState", () => {
const originalStdinIsTTY = process.stdin.isTTY;
const originalStdoutIsTTY = process.stdout.isTTY;
const originalSetRawMode = (process.stdin as { setRawMode?: (mode: boolean) => void }).setRawMode;
const originalResume = (process.stdin as { resume?: () => void }).resume;
const originalIsPaused = (process.stdin as { isPaused?: () => boolean }).isPaused;
afterEach(() => {
vi.restoreAllMocks();
Object.defineProperty(process.stdin, "isTTY", {
value: originalStdinIsTTY,
configurable: true,
});
Object.defineProperty(process.stdout, "isTTY", {
value: originalStdoutIsTTY,
configurable: true,
});
(process.stdin as { setRawMode?: (mode: boolean) => void }).setRawMode = originalSetRawMode;
(process.stdin as { resume?: () => void }).resume = originalResume;
(process.stdin as { isPaused?: () => boolean }).isPaused = originalIsPaused;
});
it("does not resume paused stdin by default", () => {
const { setRawMode, resume } = setupPausedTTYStdin();
restoreTerminalState("test");
expect(setRawMode).toHaveBeenCalledWith(false);
expect(resume).not.toHaveBeenCalled();
});
it("resumes paused stdin when resumeStdin is true", () => {
const { setRawMode, resume } = setupPausedTTYStdin();
restoreTerminalState("test", { resumeStdinIfPaused: true });
expect(setRawMode).toHaveBeenCalledWith(false);
expect(resume).toHaveBeenCalledOnce();
});
it("does not touch stdin when stdin is not a TTY", () => {
const setRawMode = vi.fn();
const resume = vi.fn();
const isPaused = vi.fn(() => true);
configureTerminalIO({
stdinIsTTY: false,
stdoutIsTTY: false,
setRawMode,
resume,
isPaused,
});
restoreTerminalState("test", { resumeStdinIfPaused: true });
expect(setRawMode).not.toHaveBeenCalled();
expect(resume).not.toHaveBeenCalled();
});
});