Files
flynn/src/tools/builtin/capture.test.ts
T
2026-02-16 10:17:24 -08:00

69 lines
2.2 KiB
TypeScript

import { describe, it, expect, vi, beforeAll, beforeEach } from 'vitest';
import { execFile } from 'child_process';
import { readFile, unlink } from 'fs/promises';
import type { ChildProcess } from 'child_process';
vi.mock('child_process', () => ({
execFile: vi.fn(),
}));
vi.mock('fs/promises', () => ({
readFile: vi.fn(),
unlink: vi.fn(),
}));
const mockExecFile = vi.mocked(execFile);
const mockReadFile = vi.mocked(readFile);
const mockUnlink = vi.mocked(unlink);
type ExecFileCallback = NonNullable<Parameters<typeof execFile>[3]>;
function mockChildProcess(): ChildProcess {
return {} as ChildProcess;
}
function mockExecFileOnce(impl: (callback: ExecFileCallback) => void): void {
mockExecFile.mockImplementationOnce((_cmd, _args, _opts, callback) => {
if (typeof callback === 'function') {
impl(callback as ExecFileCallback);
}
return mockChildProcess();
});
}
describe('capture tools', () => {
let screenCaptureTool: typeof import('./capture.js').screenCaptureTool;
let cameraCaptureTool: typeof import('./capture.js').cameraCaptureTool;
beforeAll(async () => {
const mod = await import('./capture.js');
screenCaptureTool = mod.screenCaptureTool;
cameraCaptureTool = mod.cameraCaptureTool;
});
beforeEach(() => {
vi.clearAllMocks();
mockReadFile.mockResolvedValue(Buffer.from('image-bytes'));
mockUnlink.mockResolvedValue(undefined);
});
it('screen.capture returns base64 payload when command succeeds', async () => {
const platformSpy = vi.spyOn(process, 'platform', 'get').mockReturnValue('linux');
mockExecFileOnce((callback) => callback(null, '', ''));
const result = await screenCaptureTool.execute({ format: 'png' });
expect(result.success).toBe(true);
expect(result.output).toContain('"mimeType":"image/png"');
expect(mockExecFile).toHaveBeenCalled();
platformSpy.mockRestore();
});
it('camera.capture returns error on unsupported platform', async () => {
const platformSpy = vi.spyOn(process, 'platform', 'get').mockReturnValue('win32');
const result = await cameraCaptureTool.execute({});
expect(result.success).toBe(false);
expect(result.error).toContain('only supported');
platformSpy.mockRestore();
});
});