test(ai-toolbar): complete modifier and dedup coverage
This commit is contained in:
@@ -502,6 +502,20 @@ describe("AI toolbar paste capture", () => {
|
|||||||
expect(imageTriggerOpen).toHaveBeenCalledTimes(1);
|
expect(imageTriggerOpen).toHaveBeenCalledTimes(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("Shift+Cmd+A also opens the image picker when the composer is idle", async () => {
|
||||||
|
const { textareaProps, imageTriggerOpen } = await renderToolbarBoundary();
|
||||||
|
const metaEvent = createTextareaKeydownEvent({
|
||||||
|
key: "A",
|
||||||
|
metaKey: true,
|
||||||
|
shiftKey: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
textareaProps.onKeyDown?.(metaEvent);
|
||||||
|
|
||||||
|
expect(metaEvent.preventDefault).toHaveBeenCalledTimes(1);
|
||||||
|
expect(imageTriggerOpen).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
test("Shift+Mod+A stays disabled while generation is in progress", async () => {
|
test("Shift+Mod+A stays disabled while generation is in progress", async () => {
|
||||||
const { textareaProps, imageTriggerOpen } = await renderToolbarBoundary({
|
const { textareaProps, imageTriggerOpen } = await renderToolbarBoundary({
|
||||||
aiLoading: true,
|
aiLoading: true,
|
||||||
@@ -592,7 +606,7 @@ describe("AI toolbar paste capture", () => {
|
|||||||
expect(onImagesSelect.mock.calls[0]?.[0][0]?.type).toBe("image/png");
|
expect(onImagesSelect.mock.calls[0]?.[0][0]?.type).toBe("image/png");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("async clipboard fallback does not double-handle a paste already captured by the synchronous paste event", async () => {
|
test("async clipboard fallback does not double-handle a paste already handled by the synchronous document paste flow", async () => {
|
||||||
const onImagesSelect = mock();
|
const onImagesSelect = mock();
|
||||||
const clipboardRead = mock(async () => [
|
const clipboardRead = mock(async () => [
|
||||||
{
|
{
|
||||||
@@ -611,24 +625,35 @@ describe("AI toolbar paste capture", () => {
|
|||||||
"paste",
|
"paste",
|
||||||
(entry) => entry.options?.capture === true,
|
(entry) => entry.options?.capture === true,
|
||||||
);
|
);
|
||||||
|
const handleDocumentPaste = getDocumentListener(
|
||||||
|
"paste",
|
||||||
|
(entry) => !entry.options?.capture,
|
||||||
|
);
|
||||||
const handleDocumentKeydown = getDocumentListener("keydown");
|
const handleDocumentKeydown = getDocumentListener("keydown");
|
||||||
const image = new File(["image-bytes"], "clipboard.png", {
|
const image = new File(["image-bytes"], "clipboard.png", {
|
||||||
type: "image/png",
|
type: "image/png",
|
||||||
});
|
});
|
||||||
|
const preventDefault = mock();
|
||||||
|
|
||||||
const keydownPromise = handleDocumentKeydown(
|
const keydownPromise = handleDocumentKeydown(
|
||||||
createDocumentKeydownEvent({ ctrlKey: true }),
|
createDocumentKeydownEvent({ ctrlKey: true }),
|
||||||
);
|
);
|
||||||
|
|
||||||
handleCapturePaste({
|
const pasteEvent = {
|
||||||
target: { tagName: "DIV", isContentEditable: false },
|
target: { tagName: "DIV", isContentEditable: false },
|
||||||
clipboardData: createClipboardData([image]),
|
clipboardData: createClipboardData([image]),
|
||||||
} as unknown as Event);
|
preventDefault,
|
||||||
|
} as unknown as Event;
|
||||||
|
|
||||||
|
handleCapturePaste(pasteEvent);
|
||||||
|
handleDocumentPaste(pasteEvent);
|
||||||
|
|
||||||
await keydownPromise;
|
await keydownPromise;
|
||||||
|
|
||||||
|
expect(preventDefault).toHaveBeenCalledTimes(1);
|
||||||
expect(clipboardRead).not.toHaveBeenCalled();
|
expect(clipboardRead).not.toHaveBeenCalled();
|
||||||
expect(onImagesSelect).not.toHaveBeenCalled();
|
expect(onImagesSelect).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onImagesSelect).toHaveBeenCalledWith([image]);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("global paste listeners only arm when AI paste capture is usable, and disarm on cleanup", async () => {
|
test("global paste listeners only arm when AI paste capture is usable, and disarm on cleanup", async () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user