mirror of
https://github.com/earendil-works/pi.git
synced 2026-10-02 08:44:38 +08:00
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>
40 lines
1.5 KiB
TypeScript
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",
|
|
);
|
|
});
|