Open History to see the last commit
1import { act, render } from "../../../test/render";
2import { DEFAULT_CLIENT_SETTINGS } from "@t3tools/contracts";
3import { userEvent } from "vite-plus/test/browser";
4import { expect, it, vi } from "vite-plus/test";
5
6const suppress = vi.hoisted(() => vi.fn<(enabled: boolean) => Promise<void>>());
7vi.mock(import("../../lib/desktopSnapShot"), async (original) => ({
8 ...(await original()),
9 getDesktopSnapShotBridge: () => ({ setSnapShotShortcutSuppressed: suppress }) as never,
10}));
11
12import { useSnapShotShortcutRecorder } from "./useSnapShotShortcutRecorder";
13
14function deferred<T>() {
15 let resolve!: (value: T) => void;
16 const promise = new Promise<T>((done) => {
17 resolve = done;
18 });
19 return { promise, resolve };
20}
21
22const recorded = vi.fn();
23const error = vi.fn();
24
25function Recorder(props: { allowModifierPairs?: boolean; shortcutLabel?: string }) {
26 const recorder = useSnapShotShortcutRecorder({
27 shortcut: DEFAULT_CLIENT_SETTINGS.snapShotShortcut,
28 shortcutLabel: props.shortcutLabel,
29 allowModifierPairs: props.allowModifierPairs ?? false,
30 onRecord: recorded,
31 onError: error,
32 });
33 return recorder.input;
34}
35
36function setup() {
37 suppress.mockReset().mockResolvedValue(undefined);
38 recorded.mockReset();
39 error.mockReset();
40}
41async function renderRecorder(props: Parameters<typeof Recorder>[0] = {}) {
42 const screen = await render(<Recorder {...props} />);
43 const button = () =>
44 screen.container.querySelector<HTMLButtonElement>("[data-keybinding-capture]")!;
45 // aria-pressed mirrors the hook's recording state, which flips once suppression resolves.
46 const expectRecording = (recording: boolean) =>
47 expect.element(screen.getByRole("button")).toHaveAttribute("aria-pressed", String(recording));
48 return {
49 ...screen,
50 button,
51 expectRecording,
52 async start() {
53 await userEvent.click(button());
54 await expectRecording(true);
55 },
56 };
57}
58
59it("ignores late suppression acknowledgements after cancellation", async () => {
60 setup();
61 using _platform = vi.spyOn(navigator, "platform", "get").mockReturnValue("Linux x86_64");
62 const pending = deferred<void>();
63 suppress.mockImplementation((enabled) => (enabled ? pending.promise : Promise.resolve()));
64 await using screen = await renderRecorder();
65 const { button } = screen;
66 await userEvent.click(button());
67 await act(async () => button().blur());
68 await act(async () => pending.resolve());
69 await screen.expectRecording(false);
70 expect(suppress).toHaveBeenLastCalledWith(false);
71 expect(recorded).not.toHaveBeenCalled();
72});