73 lines
2.5 KiB
TypeScript
73 lines
2.5 KiB
TypeScript
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
|
|
const fetchMock = vi.fn(() => Promise.resolve(new Response('ok')));
|
|
|
|
// The module captures the global fetch at import time, so stub before importing
|
|
const loadWrappedFetch = async () => {
|
|
vi.stubGlobal('fetch', fetchMock);
|
|
vi.resetModules();
|
|
return (await import('@/utils/request-rewriter/fetch.worker')).default;
|
|
};
|
|
|
|
const lastRequest = () => fetchMock.mock.lastCall?.[0] as unknown as Request;
|
|
|
|
afterEach(() => {
|
|
vi.unstubAllGlobals();
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
describe('worker fetch wrapper', () => {
|
|
it('applies a browser fingerprint when no user-agent is set', async () => {
|
|
const wrappedFetch = await loadWrappedFetch();
|
|
await wrappedFetch('https://example.com/page');
|
|
|
|
const request = lastRequest();
|
|
expect(request.headers.get('user-agent')).toContain('Chrome');
|
|
expect(request.headers.get('sec-ch-ua-platform')).toBe('"macOS"');
|
|
expect(request.headers.get('accept-language')).toBe('en-US,en;q=0.9');
|
|
});
|
|
|
|
it('keeps a caller-provided user-agent and headers', async () => {
|
|
const wrappedFetch = await loadWrappedFetch();
|
|
await wrappedFetch('https://example.com/page', {
|
|
headers: {
|
|
'user-agent': 'custom-ua',
|
|
'sec-fetch-site': 'same-origin',
|
|
},
|
|
});
|
|
|
|
const request = lastRequest();
|
|
expect(request.headers.get('user-agent')).toBe('custom-ua');
|
|
expect(request.headers.get('sec-fetch-site')).toBe('same-origin');
|
|
});
|
|
|
|
it('sets the referer to the request origin when absent', async () => {
|
|
const wrappedFetch = await loadWrappedFetch();
|
|
await wrappedFetch('https://example.com/deep/page?q=1');
|
|
|
|
expect(lastRequest().headers.get('referer')).toBe('https://example.com');
|
|
});
|
|
|
|
it('keeps a caller-provided referer', async () => {
|
|
const wrappedFetch = await loadWrappedFetch();
|
|
await wrappedFetch('https://example.com/page', {
|
|
headers: {
|
|
referer: 'https://referrer.test/',
|
|
},
|
|
});
|
|
|
|
expect(lastRequest().headers.get('referer')).toBe('https://referrer.test/');
|
|
});
|
|
|
|
it('strips the x-prefer-proxy header', async () => {
|
|
const wrappedFetch = await loadWrappedFetch();
|
|
await wrappedFetch('https://example.com/page', {
|
|
headers: {
|
|
'x-prefer-proxy': '1',
|
|
},
|
|
});
|
|
|
|
expect(lastRequest().headers.has('x-prefer-proxy')).toBe(false);
|
|
});
|
|
});
|