cdp.test.ts
1 import { beforeEach, describe, expect, it, vi } from 'vitest'; 2 3 const { MockWebSocket } = vi.hoisted(() => { 4 class MockWebSocket { 5 static OPEN = 1; 6 readyState = 1; 7 private handlers = new Map<string, Array<(...args: unknown[]) => void>>(); 8 9 constructor(_url: string) { 10 queueMicrotask(() => this.emit('open')); 11 } 12 13 on(event: string, handler: (...args: unknown[]) => void): void { 14 const handlers = this.handlers.get(event) ?? []; 15 handlers.push(handler); 16 this.handlers.set(event, handlers); 17 } 18 19 send(_message: string): void {} 20 21 close(): void { 22 this.readyState = 3; 23 } 24 25 private emit(event: string, ...args: unknown[]): void { 26 for (const handler of this.handlers.get(event) ?? []) { 27 handler(...args); 28 } 29 } 30 } 31 32 return { MockWebSocket }; 33 }); 34 35 vi.mock('ws', () => ({ 36 WebSocket: MockWebSocket, 37 })); 38 39 import { CDPBridge } from './cdp.js'; 40 41 describe('CDPBridge cookies', () => { 42 beforeEach(() => { 43 vi.unstubAllEnvs(); 44 }); 45 46 it('filters cookies by actual domain match instead of substring match', async () => { 47 vi.stubEnv('OPENCLI_CDP_ENDPOINT', 'ws://127.0.0.1:9222/devtools/page/1'); 48 49 const bridge = new CDPBridge(); 50 vi.spyOn(bridge, 'send').mockResolvedValue({ 51 cookies: [ 52 { name: 'good', value: '1', domain: '.example.com' }, 53 { name: 'exact', value: '2', domain: 'example.com' }, 54 { name: 'bad', value: '3', domain: 'notexample.com' }, 55 ], 56 }); 57 58 const page = await bridge.connect(); 59 const cookies = await page.getCookies({ domain: 'example.com' }); 60 61 expect(cookies).toEqual([ 62 { name: 'good', value: '1', domain: '.example.com' }, 63 { name: 'exact', value: '2', domain: 'example.com' }, 64 ]); 65 }); 66 });