/ src / browser / cdp.test.ts
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  });