/** * Unit tests for additional lib/commands/app.ts functions * (getPageSource, getWindowHandle, getWindowHandles, getWindowRect, setWindow) */ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { getPageSource, getWindowHandle, getWindowHandles, getWindowRect, setWindow, } from '../../../lib/commands/app'; import { createMockDriver } from '../../fixtures/driver'; vi.mock('../../../lib/winapi/user32', () => ({ getWindowAllHandlesForProcessIds: vi.fn().mockReturnValue([]), trySetForegroundWindow: vi.fn().mockReturnValue(true), })); describe('getPageSource', () => { beforeEach(() => vi.clearAllMocks()); it('returns XML page source string', async () => { const driver = createMockDriver() as any; driver.sendPowerShellCommand.mockResolvedValue(''); const result = await getPageSource.call(driver); expect(result).toBe(''); expect(driver.sendPowerShellCommand).toHaveBeenCalledTimes(1); }); }); describe('getWindowHandle', () => { beforeEach(() => vi.clearAllMocks()); it('returns hex-formatted window handle', async () => { const driver = createMockDriver() as any; driver.sendPowerShellCommand.mockResolvedValue('12648430'); // 0x00C0FFEE const result = await getWindowHandle.call(driver); expect(result).toBe('0x00c0ffee'); }); it('pads handle to 8 hex digits', async () => { const driver = createMockDriver() as any; driver.sendPowerShellCommand.mockResolvedValue('1'); // 0x00000001 const result = await getWindowHandle.call(driver); expect(result).toBe('0x00000001'); }); }); describe('getWindowHandles', () => { beforeEach(() => vi.clearAllMocks()); it('returns array of hex window handles for each child window', async () => { const driver = createMockDriver() as any; // First call: findAll children of rootElement → two element IDs // Subsequent calls: getNativeWindowHandle for each child driver.sendPowerShellCommand .mockResolvedValueOnce('1.1.1\n2.2.2') // findAll .mockResolvedValueOnce('100') // handle for element 1 .mockResolvedValueOnce('200'); // handle for element 2 const result = await getWindowHandles.call(driver); expect(result).toHaveLength(2); expect(result[0]).toBe('0x00000064'); // 100 = 0x64 expect(result[1]).toBe('0x000000c8'); // 200 = 0xC8 }); it('returns empty array when no child windows found', async () => { const driver = createMockDriver() as any; driver.sendPowerShellCommand.mockResolvedValue(''); // no elements const result = await getWindowHandles.call(driver); expect(result).toEqual([]); }); }); describe('getWindowRect', () => { beforeEach(() => vi.clearAllMocks()); it('returns parsed rect object', async () => { const driver = createMockDriver() as any; driver.sendPowerShellCommand.mockResolvedValue('{"x":10,"y":20,"width":800,"height":600}'); const result = await getWindowRect.call(driver); expect(result).toEqual({ x: 10, y: 20, width: 800, height: 600 }); }); it('replaces Infinity with max int32', async () => { const driver = createMockDriver() as any; driver.sendPowerShellCommand.mockResolvedValue('{"x":Infinity,"y":0,"width":Infinity,"height":0}'); const result = await getWindowRect.call(driver); expect(result.x).toBe(0x7FFFFFFF); expect(result.width).toBe(0x7FFFFFFF); }); }); describe('setWindow', () => { beforeEach(() => vi.clearAllMocks()); it('sets root element by numeric handle', async () => { const driver = createMockDriver() as any; const { trySetForegroundWindow } = await import('../../../lib/winapi/user32'); // findFirst returns a valid element ID driver.sendPowerShellCommand.mockResolvedValue('1.2.3'); await setWindow.call(driver, '12345'); expect(driver.sendPowerShellCommand).toHaveBeenCalled(); // The last PS command should set $rootElement const calls = driver.sendPowerShellCommand.mock.calls; const setRootCall = calls.find((c: any[]) => c[0].includes('$rootElement =')); expect(setRootCall).toBeDefined(); expect(trySetForegroundWindow).toHaveBeenCalledWith(12345); }); it('sets root element by window name', async () => { const driver = createMockDriver() as any; driver.sendPowerShellCommand .mockResolvedValueOnce('') // numeric handle search fails (NaN) .mockResolvedValueOnce('5.6.7'); // name search succeeds await setWindow.call(driver, 'Calculator'); const calls = driver.sendPowerShellCommand.mock.calls; const setRootCall = calls.find((c: any[]) => c[0].includes('$rootElement =')); expect(setRootCall).toBeDefined(); }); it('throws NoSuchWindowError when window is not found after retries', async () => { const driver = createMockDriver() as any; // All calls return empty (window not found) driver.sendPowerShellCommand.mockResolvedValue(''); await expect(setWindow.call(driver, 'NonExistentWindow')).rejects.toThrow('No window was found'); }, 10000); });