From fb24561c672ae584192ed9b4f97f5e624e2f5796 Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Thu, 27 Mar 2025 17:13:06 +0100 Subject: [PATCH] chore: test --vision (#54) --- tests/basic.spec.ts | 52 ++++++++++++++++++++++++++++++++++++++++++++- tests/fixtures.ts | 14 +++++++++--- 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/tests/basic.spec.ts b/tests/basic.spec.ts index 2476a7b..d5a67eb 100644 --- a/tests/basic.spec.ts +++ b/tests/basic.spec.ts @@ -16,7 +16,7 @@ import { test, expect } from './fixtures'; -test('test tool list', async ({ server }) => { +test('test tool list', async ({ server, visionServer }) => { const list = await server.send({ jsonrpc: '2.0', id: 1, @@ -69,6 +69,56 @@ test('test tool list', async ({ server }) => { ], }), })); + + const visionList = await visionServer.send({ + jsonrpc: '2.0', + id: 1, + method: 'tools/list', + }); + + expect(visionList).toEqual(expect.objectContaining({ + id: 1, + result: expect.objectContaining({ + tools: expect.arrayContaining([ + expect.objectContaining({ + name: 'browser_navigate', + }), + expect.objectContaining({ + name: 'browser_go_back', + }), + expect.objectContaining({ + name: 'browser_go_forward', + }), + expect.objectContaining({ + name: 'browser_screenshot', + }), + expect.objectContaining({ + name: 'browser_move_mouse', + }), + expect.objectContaining({ + name: 'browser_click', + }), + expect.objectContaining({ + name: 'browser_drag', + }), + expect.objectContaining({ + name: 'browser_type', + }), + expect.objectContaining({ + name: 'browser_press_key', + }), + expect.objectContaining({ + name: 'browser_wait', + }), + expect.objectContaining({ + name: 'browser_save_as_pdf', + }), + expect.objectContaining({ + name: 'browser_close', + }), + ]), + }), + })); }); test('test resources list', async ({ server }) => { diff --git a/tests/fixtures.ts b/tests/fixtures.ts index d8f0f1e..e9b2dfd 100644 --- a/tests/fixtures.ts +++ b/tests/fixtures.ts @@ -69,7 +69,7 @@ class MCPServer extends EventEmitter { }); } - async send(message: any, options?: { timeout?: number }): Promise { + async send(message: any, options?: { timeout?: number }): Promise { await this.sendNoReply(message); return this._waitForResponse(options || {}); } @@ -112,7 +112,8 @@ class MCPServer extends EventEmitter { type Fixtures = { server: MCPServer; - startServer: (options?: { env?: NodeJS.ProcessEnv }) => Promise; + visionServer: MCPServer; + startServer: (options?: { env?: NodeJS.ProcessEnv, vision?: boolean }) => Promise; wsEndpoint: string; }; @@ -121,12 +122,19 @@ export const test = baseTest.extend({ await use(await startServer()); }, + visionServer: async ({ startServer }, use) => { + await use(await startServer({ vision: true })); + }, + startServer: async ({ }, use, testInfo) => { let server: MCPServer | undefined; const userDataDir = testInfo.outputPath('user-data-dir'); use(async options => { - server = new MCPServer('node', [path.join(__dirname, '../cli.js'), '--headless', '--user-data-dir', userDataDir], options); + const args = ['--headless', '--user-data-dir', userDataDir]; + if (options?.vision) + args.push('--vision'); + server = new MCPServer('node', [path.join(__dirname, '../cli.js'), ...args], options); const initialize = await server.send({ jsonrpc: '2.0', id: 0,