129 lines · 3.9 KB · TypeScript
RawDownload
import { assert, beforeEach, it, vi } from "vite-plus/test"; const { execFileMock, loadWindowsForegroundApiMock } = vi.hoisted(() => ({  execFileMock: vi.fn(),  loadWindowsForegroundApiMock: vi.fn(),})); vi.mock("node:child_process", () => ({ execFile: execFileMock }));vi.mock("../electron/WindowsForeground.ts", () => ({  loadWindowsForegroundApi: loadWindowsForegroundApiMock,})); import { activeWindow } from "./ActiveWindow.ts"; beforeEach(() => {  execFileMock.mockReset();  loadWindowsForegroundApiMock.mockReset();}); function stubMacLookup(stdout: string) {  execFileMock.mockImplementation(    (      _file: string,      _args: ReadonlyArray<string>,      _options: unknown,      callback: (error: Error | null, stdout: string) => void,    ) => callback(null, stdout),  );} it("parses the frontmost macOS window from the osascript lookup", async () => {  stubMacLookup(    JSON.stringify({      id: 42,      title: "main.ts",      bounds: { x: 10, y: 20, width: 800, height: 600 },      owner: {        name: "Editor",        processId: 123,        path: "/Applications/Editor.app",        bundleId: "com.example.editor",      },    }) + "\n",  );   const window = await activeWindow("darwin");   assert.deepEqual(window, {    platform: "macos",    id: 42,    title: "main.ts",    bounds: { x: 10, y: 20, width: 800, height: 600 },    owner: {      name: "Editor",      processId: 123,      path: "/Applications/Editor.app",      bundleId: "com.example.editor",    },  });  const [file, args] = execFileMock.mock.calls[0]!;  assert.strictEqual(file, "/usr/bin/osascript");  assert.deepEqual(args.slice(0, 3), ["-l", "JavaScript", "-e"]);  assert.lengthOf(loadWindowsForegroundApiMock.mock.calls, 0);}); it("omits an empty macOS bundle identifier", async () => {  stubMacLookup(    JSON.stringify({      id: 7,      title: "",      bounds: { x: 0, y: 0, width: 1, height: 1 },      owner: { name: "cli", processId: 9, path: "", bundleId: "" },    }),  );   const window = await activeWindow("darwin");   assert.deepEqual(window?.owner, { name: "cli", processId: 9, path: "" });}); it("resolves undefined when macOS has no frontmost window", async () => {  stubMacLookup("\n");   assert.isUndefined(await activeWindow("darwin"));}); it("composes the Windows foreground window from Win32 calls", async () => {  const api = {    getForegroundWindow: vi.fn(() => 0x1_f123_4567n),    getWindowRect: vi.fn(() => ({ x: 10, y: 20, width: 800, height: 600 })),    getWindowThreadAndProcessId: vi.fn(() => ({ threadId: 5, processId: 123 })),    getProcessImagePath: vi.fn(() => "C:\\Program Files\\Editor\\editor.exe"),    getWindowText: vi.fn(() => "main.ts - Editor"),  };  loadWindowsForegroundApiMock.mockResolvedValue(api);   const window = await activeWindow("win32");   assert.deepEqual(window, {    platform: "windows",    id: 0x1_f123_4567,    title: "main.ts - Editor",    bounds: { x: 10, y: 20, width: 800, height: 600 },    owner: { name: "editor.exe", processId: 123, path: "C:\\Program Files\\Editor\\editor.exe" },  });  assert.deepEqual(api.getWindowRect.mock.calls, [[0x1_f123_4567n]]);  assert.deepEqual(api.getProcessImagePath.mock.calls, [[123]]);  assert.lengthOf(execFileMock.mock.calls, 0);}); it("resolves undefined when Windows reports no foreground window", async () => {  const api = {    getForegroundWindow: vi.fn(() => 0n),    getWindowRect: vi.fn(),    getWindowThreadAndProcessId: vi.fn(),    getProcessImagePath: vi.fn(),    getWindowText: vi.fn(),  };  loadWindowsForegroundApiMock.mockResolvedValue(api);   assert.isUndefined(await activeWindow("win32"));  assert.lengthOf(api.getWindowRect.mock.calls, 0);}); it("resolves undefined on other platforms without querying the OS", async () => {  assert.isUndefined(await activeWindow("linux"));  assert.lengthOf(execFileMock.mock.calls, 0);  assert.lengthOf(loadWindowsForegroundApiMock.mock.calls, 0);});