import assert from 'node:assert/strict'; import { test } from 'node:test'; import { buildCommand, parseTabIds } from '../nodes/BrowserCli/request'; test('tab:list maps to tabs.list', () => { assert.deepEqual(buildCommand('tab', 'list', {}), { command: 'tabs.list', args: {} }); }); test('client:list maps to clients.list', () => { assert.deepEqual(buildCommand('client', 'list', {}), { command: 'clients.list', args: {} }); }); test('gateway:health pings with tabs.list (serve has no health route)', () => { assert.deepEqual(buildCommand('gateway', 'health', {}), { command: 'tabs.list', args: {} }); }); test('tab:open sends navigate.open with background derived from focus', () => { const bg = buildCommand('tab', 'open', { url: 'https://example.com', focus: false }); assert.deepEqual(bg, { command: 'navigate.open', args: { url: 'https://example.com', focus: false, background: true }, }); const fg = buildCommand('tab', 'open', { url: 'https://example.com', focus: true }); assert.equal(fg.args.focus, true); assert.equal(fg.args.background, false, 'focused open sends background:false (matches SDK)'); }); test('tab:close supports ids, inactive, duplicates', () => { assert.deepEqual(buildCommand('tab', 'close', { mode: 'ids', tabIds: '12, 34' }), { command: 'tabs.close', args: { tabIds: [12, 34] }, }); assert.deepEqual(buildCommand('tab', 'close', { mode: 'inactive' }).args, { inactive: true }); assert.deepEqual(buildCommand('tab', 'close', { mode: 'duplicates' }).args, { duplicates: true }); }); test('dom:type sends dom.type with selector + text', () => { assert.deepEqual(buildCommand('dom', 'type', { selector: '#q', text: 'hello' }), { command: 'dom.type', args: { selector: '#q', text: 'hello' }, }); }); test('dom:eval includes tabId only when set', () => { assert.deepEqual(buildCommand('dom', 'eval', { code: 'return 1', tabId: 0 }).args, { code: 'return 1' }); assert.deepEqual(buildCommand('dom', 'eval', { code: 'return 1', tabId: 7 }).args, { code: 'return 1', tabId: 7 }); }); test('page:extractMarkdown omits empty selector', () => { assert.deepEqual(buildCommand('page', 'extractMarkdown', { selector: '' }).args, {}); assert.deepEqual(buildCommand('page', 'extractMarkdown', { selector: 'main' }).args, { selector: 'main' }); }); test('command:execute passes command and args through', () => { assert.deepEqual(buildCommand('command', 'execute', { command: 'tabs.query', args: { search: 'docs' } }), { command: 'tabs.query', args: { search: 'docs' }, }); }); test('unknown operation throws', () => { assert.throws(() => buildCommand('tab', 'nope', {}), /Unsupported operation/); }); test('parseTabIds accepts array, json, and delimited strings', () => { assert.deepEqual(parseTabIds([1, 2, 3]), [1, 2, 3]); assert.deepEqual(parseTabIds('[4, 5]'), [4, 5]); assert.deepEqual(parseTabIds('6, 7 8'), [6, 7, 8]); assert.deepEqual(parseTabIds(''), []); assert.deepEqual(parseTabIds(9), [9]); });