RSSHub/lib/utils/request-rewriter/fetch.worker.test.ts

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);
});
});