import path from 'node:path' import { describe, it, expect, vi } from 'vitest' import { MESSAGE_TYPES } from '@wdio/types' import { ServerWorkerCommunicator } from '../../src/communicator.js' import { SESSIONS } from '../../src/constants.js' vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger'))) describe('ServerWorkerCommunicator', () => { it('should register server and worker', () => { const server: any = { onBrowserEvent: vi.fn() } const worker: any = { on: vi.fn() } const communicator = new ServerWorkerCommunicator({} as any) communicator.register(server, worker) expect(server.onBrowserEvent).toBeCalledTimes(1) expect(worker.on).toBeCalledTimes(1) }) it('onWorkerMessage and onBrowserEvent handling', async () => { const server: any = { onBrowserEvent: vi.fn() } const worker: any = { on: vi.fn(), postMessage: vi.fn() } const communicator = new ServerWorkerCommunicator({} as any) communicator.register(server, worker) const onWorkerMessage = worker.on.mock.calls[0][1] expect(SESSIONS.size).toBe(0) await onWorkerMessage({ name: 'sessionStarted', cid: '0-0', content: { capabilities: {} } }, {}, {}) expect(SESSIONS.size).toBe(1) await onWorkerMessage({ name: 'sessionEnded', cid: '0-0' }, {}, {}) expect(SESSIONS.size).toBe(0) expect(communicator.coverageMaps).toHaveLength(0) await onWorkerMessage({ name: 'workerEvent', args: { type: MESSAGE_TYPES.coverageMap } }, {}, {}) expect(communicator.coverageMaps).toHaveLength(1) const onBrowserEvent = server.onBrowserEvent.mock.calls[0][0] const client = { send: vi.fn().mockReturnValue('some value') } onBrowserEvent({ type: 'foobar' }, client) expect( await onWorkerMessage({ name: 'workerResponse', args: { id: 123, message: {} } }, {}, {}) ).toBe(undefined) expect( await onWorkerMessage({ name: 'workerResponse', args: { id: 0, message: {} } }, {}, {}) ).toBe('some value') }) })