import React from "react"; import { fireEvent, render } from "@testing-library/react"; import { describe, expect, it, vi } from "vitest"; import { GuacamoleToolbar } from "../../src/frontend/GuacamoleToolbar.js"; import type { GuacamoleDisplayHandle } from "../../src/frontend/GuacamoleDisplay.js"; vi.mock("react-i18next", async (importOriginal) => ({ ...(await importOriginal()), useTranslation: () => ({ t: (key: string) => key }), })); describe("GuacamoleToolbar Windows key", () => { it("sends Super_L for Win shortcuts and the sticky modifier", () => { const sendKey = vi.fn(); const displayRef = { current: { disconnect: vi.fn(), isConnected: () => true, sendKey, sendMouse: vi.fn(), setClipboard: vi.fn(), getFilesystem: () => null, uploadFile: async () => {}, zoomIn: vi.fn(() => 1.25), zoomOut: vi.fn(() => 0.75), resetZoom: vi.fn(() => 1), } satisfies GuacamoleDisplayHandle, } as React.RefObject; const { getByText } = render( , ); fireEvent.click(getByText("Win+L")); expect(sendKey.mock.calls).toEqual([ [0xffeb, true], [0x006c, true], [0x006c, false], [0xffeb, false], ]); sendKey.mockClear(); fireEvent.click(getByText("Win")); expect(sendKey.mock.calls).toEqual([ [0xffeb, true], [0xffeb, false], ]); sendKey.mockClear(); fireEvent.click(getByText("remoteDesktop.toolbar.win")); expect(sendKey).toHaveBeenCalledWith(0xffeb, true); }); it.each(["vnc", "rdp"] as const)( "exposes working zoom controls for %s", (protocol) => { const zoomIn = vi.fn(() => 1.25); const zoomOut = vi.fn(() => 0.75); const resetZoom = vi.fn(() => 1); const displayRef = { current: { disconnect: vi.fn(), isConnected: () => true, sendKey: vi.fn(), sendMouse: vi.fn(), setClipboard: vi.fn(), getFilesystem: () => null, uploadFile: async () => {}, zoomIn, zoomOut, resetZoom, } satisfies GuacamoleDisplayHandle, } as React.RefObject; const { getByLabelText, getByText } = render( , ); fireEvent.click(getByLabelText("remoteDesktop.toolbar.zoomOut")); fireEvent.click(getByLabelText("remoteDesktop.toolbar.zoomIn")); fireEvent.click(getByText("125%")); expect(zoomOut).toHaveBeenCalledOnce(); expect(zoomIn).toHaveBeenCalledOnce(); expect(resetZoom).toHaveBeenCalledOnce(); }, ); it("offers an explicit session-only hide action", () => { const onHide = vi.fn(); const displayRef = { current: { disconnect: vi.fn(), isConnected: () => true, sendKey: vi.fn(), sendMouse: vi.fn(), setClipboard: vi.fn(), getFilesystem: () => null, uploadFile: vi.fn(), zoomIn: vi.fn(() => 1.25), zoomOut: vi.fn(() => 0.75), resetZoom: vi.fn(() => 1), } satisfies GuacamoleDisplayHandle, } as React.RefObject; const { getByLabelText } = render( , ); fireEvent.click(getByLabelText("remoteDesktop.toolbar.hide")); expect(onHide).toHaveBeenCalledOnce(); }); it("labels the VNC meta key Super instead of Windows", () => { const displayRef = { current: { disconnect: vi.fn(), isConnected: () => true, sendKey: vi.fn(), sendMouse: vi.fn(), setClipboard: vi.fn(), getFilesystem: () => null, uploadFile: vi.fn(), zoomIn: vi.fn(() => 1.25), zoomOut: vi.fn(() => 0.75), resetZoom: vi.fn(() => 1), } satisfies GuacamoleDisplayHandle, } as React.RefObject; const { getByText, queryByText } = render( , ); expect(getByText("Super+L")).toBeTruthy(); expect(getByText("Super")).toBeTruthy(); expect(queryByText("Win+L")).toBeNull(); expect(queryByText("Win")).toBeNull(); }); });