UNPKG

@cloudflare/puppeteer

Version:

Puppeteer fork for Cloudflare Browser Run (formerly Browser Rendering)

140 lines 6.23 kB
/** * @license * Copyright 2024 Google Inc. * SPDX-License-Identifier: Apache-2.0 */ import { afterEach, describe, it } from 'node:test'; import expect from 'expect'; import sinon from 'sinon'; import { ExtensionTransport } from './ExtensionTransport.js'; describe('ExtensionTransport', function () { afterEach(() => { sinon.restore(); }); function mockChrome() { const fakeAttach = sinon.fake.resolves(undefined); const fakeDetach = sinon.fake.resolves(undefined); const fakeSendCommand = sinon.fake.resolves({}); const fakeGetTargets = sinon.fake.resolves([]); const onEvent = []; sinon.define(globalThis, 'chrome', { debugger: { attach: fakeAttach, detach: fakeDetach, sendCommand: fakeSendCommand, getTargets: fakeGetTargets, onEvent: { addListener: (cb) => { onEvent.push(cb); }, removeListener: (cb) => { const idx = onEvent.indexOf(cb); if (idx !== -1) { onEvent.splice(idx, 1); } }, }, }, }); return { fakeAttach, fakeDetach, fakeSendCommand, fakeGetTargets, onEvent, }; } describe('connectTab', function () { it('should attach using tabId', async () => { const { fakeAttach, onEvent } = mockChrome(); const transport = await ExtensionTransport.connectTab(1); expect(transport).toBeInstanceOf(ExtensionTransport); expect(fakeAttach.calledOnceWith({ tabId: 1 }, '1.3')).toBeTruthy(); expect(onEvent).toHaveLength(1); }); it('should detach', async () => { const { onEvent } = mockChrome(); const transport = await ExtensionTransport.connectTab(1); transport.close(); expect(onEvent).toHaveLength(0); }); }); describe('send', function () { async function testTranportResponse(command) { const { fakeSendCommand } = mockChrome(); const transport = await ExtensionTransport.connectTab(1); const onmessageFake = sinon.fake(); transport.onmessage = onmessageFake; transport.send(JSON.stringify(command)); expect(fakeSendCommand.notCalled).toBeTruthy(); return onmessageFake.getCalls().map(call => { return call.args[0]; }); } it('provides a dummy response to Browser.getVersion', async () => { expect(await testTranportResponse({ id: 1, method: 'Browser.getVersion', })).toStrictEqual([ '{"id":1,"method":"Browser.getVersion","result":{"protocolVersion":"1.3","product":"chrome","revision":"unknown","userAgent":"chrome","jsVersion":"unknown"}}', ]); }); it('provides a dummy response to Target.getBrowserContexts', async () => { expect(await testTranportResponse({ id: 1, method: 'Target.getBrowserContexts', })).toStrictEqual([ '{"id":1,"method":"Target.getBrowserContexts","result":{"browserContextIds":[]}}', ]); }); it('provides a dummy response and events to Target.setDiscoverTargets', async () => { expect(await testTranportResponse({ id: 1, method: 'Target.setDiscoverTargets', })).toStrictEqual([ '{"method":"Target.targetCreated","params":{"targetInfo":{"targetId":"tabTargetId","type":"tab","title":"tab","url":"about:blank","attached":false,"canAccessOpener":false}}}', '{"method":"Target.targetCreated","params":{"targetInfo":{"targetId":"pageTargetId","type":"page","title":"page","url":"about:blank","attached":false,"canAccessOpener":false}}}', '{"id":1,"method":"Target.setDiscoverTargets","result":{}}', ]); }); it('attaches to a dummy tab target on Target.setAutoAttach', async () => { expect(await testTranportResponse({ id: 1, method: 'Target.setAutoAttach', })).toStrictEqual([ '{"method":"Target.attachedToTarget","params":{"targetInfo":{"targetId":"tabTargetId","type":"tab","title":"tab","url":"about:blank","attached":false,"canAccessOpener":false},"sessionId":"tabTargetSessionId"}}', '{"id":1,"method":"Target.setAutoAttach","result":{}}', ]); }); it('attaches to a dummy page target on Target.setAutoAttach', async () => { expect(await testTranportResponse({ id: 1, method: 'Target.setAutoAttach', sessionId: 'tabTargetSessionId', })).toStrictEqual([ '{"method":"Target.attachedToTarget","params":{"targetInfo":{"targetId":"pageTargetId","type":"page","title":"page","url":"about:blank","attached":false,"canAccessOpener":false},"sessionId":"pageTargetSessionId"}}', '{"id":1,"sessionId":"tabTargetSessionId","method":"Target.setAutoAttach","result":{}}', ]); }); it('rewrites session id for pageTargetSessionId commands', async () => { const { fakeSendCommand } = mockChrome(); const transport = await ExtensionTransport.connectTab(1); transport.send(JSON.stringify({ id: 1, method: 'Runtime.evaluate', params: {}, sessionId: 'pageTargetSessionId', })); expect(fakeSendCommand.calledOnce).toBeTruthy(); expect(fakeSendCommand.lastCall.args).toStrictEqual([ { tabId: 1, sessionId: undefined, }, 'Runtime.evaluate', {}, ]); }); }); }); //# sourceMappingURL=ExtensionTransport.test.js.map