Files
pi/packages/coding-agent/test/clipboard-image-native-errors.test.ts
T
Christian Klotzand1dustycy fd889a2741 fix(coding-agent,tui): paste Finder file paths instead of icons (#10136)
Read Finder file URLs before icon image data on macOS. Quote paths in
bash mode and reject terminal control characters before rendering.

Fixes #9999

Co-authored-by: 1dustycy <onedustycy@gmail.com>
2026-09-28 20:59:29 +01:00

40 lines
1.5 KiB
TypeScript

import type * as Tui from "@earendil-works/pi-tui";
import { afterEach, expect, test, vi } from "vitest";
import { InteractiveMode } from "../src/modes/interactive/interactive-mode.ts";
const readClipboardText = vi.hoisted(() => vi.fn<() => Promise<string | null>>());
vi.mock("@earendil-works/pi-tui", async (importOriginal) => ({
...(await importOriginal<typeof Tui>()),
getNativeClipboard: () => ({
async getImage() {
throw new Error("Native clipboard operation failed");
},
}),
}));
vi.mock("../src/utils/clipboard.ts", () => ({
copyToClipboard: vi.fn(),
readClipboardFilePaths: vi.fn(async () => null),
readClipboardText,
}));
vi.mock("../src/utils/clipboard-command.ts", () => ({ runClipboardCommand: vi.fn(async () => undefined) }));
afterEach(() => vi.unstubAllEnvs());
test("native image errors abort paste without reading text or changing the editor", async () => {
vi.stubEnv("TERMUX_VERSION", "");
const context = {
editor: { insertTextAtCursor: vi.fn() },
showError: vi.fn(),
ui: { requestRender: vi.fn() },
};
const prototype = InteractiveMode.prototype as unknown as {
handleClipboardPaste(this: typeof context): Promise<void>;
};
await prototype.handleClipboardPaste.call(context);
expect(readClipboardText).not.toHaveBeenCalled();
expect(context.editor.insertTextAtCursor).not.toHaveBeenCalled();
expect(context.ui.requestRender).not.toHaveBeenCalled();
expect(context.showError).toHaveBeenCalledExactlyOnceWith(
"Failed to paste from clipboard: Native clipboard operation failed",
);
});