import { getCurrentCell, setCurrentCell } from 'node-network-devtools'; import undici from 'undici'; import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; import { useCustomHeader } from './fetch'; const getInitRequest = () => ({ requestHeaders: {} as Record, id: '', loadCallFrames: () => {}, cookies: '', requestData: '', responseData: '', responseHeaders: {}, responseInfo: {}, }) satisfies NonNullable>['request']; enum Env { dev = 'dev', production = 'production', test = 'test', } describe('useCustomHeader', () => { let originalEnv: string; beforeEach(() => { originalEnv = process.env.NODE_ENV || Env.test; process.env.ENABLE_REMOTE_DEBUGGING = 'true'; }); afterEach(() => { process.env.NODE_ENV = originalEnv; }); test('should register request with custom headers in dev environment', () => { process.env.NODE_ENV = Env.dev; const headers = new Headers(); const headerText = 'authorization'; const headerValue = 'Bearer token'; headers.set(headerText, headerValue); const req = getInitRequest(); setCurrentCell({ request: req, pipes: [], isAborted: false, }); useCustomHeader(headers); const cell = getCurrentCell(); expect(cell).toBeDefined(); let request = req; if (cell) { for (const { pipe } of cell.pipes) { request = pipe(request); } } expect(request.requestHeaders[headerText]).toEqual(headerValue); }); test('should not register request in non-dev environment', () => { process.env.NODE_ENV = Env.production; const headers = new Headers(); const headerText = 'content-type'; const headerValue = 'application/json'; headers.set(headerText, headerValue); const req = getInitRequest(); setCurrentCell({ request: req, pipes: [], isAborted: false, }); useCustomHeader(headers); const cell = getCurrentCell(); expect(cell).toBeDefined(); let request = req; if (cell) { for (const { pipe } of cell.pipes) { request = pipe(request); } } expect(req.requestHeaders[headerText]).toBeUndefined(); }); }); describe('wrappedFetch', () => { test('throws when fetch fails without proxy retry', async () => { const fetchSpy = vi.spyOn(undici, 'fetch').mockRejectedValueOnce(new Error('boom')); const { default: wrappedFetch } = await import('./fetch'); await expect(wrappedFetch('http://example.com')).rejects.toThrow('boom'); fetchSpy.mockRestore(); }); });