mirror of
https://github.com/movie-web/providers.git
synced 2025-09-13 14:53:24 +00:00
150 lines
3.7 KiB
TypeScript
150 lines
3.7 KiB
TypeScript
import { makeStandardFetcher } from '@/fetchers/standardFetch';
|
|
import { DefaultedFetcherOptions } from '@/fetchers/types';
|
|
import { Headers } from 'node-fetch';
|
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
|
|
describe('makeStandardFetcher()', () => {
|
|
const fetch = vi.fn();
|
|
const fetcher = makeStandardFetcher(fetch);
|
|
|
|
afterEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
function setResult(type: 'text' | 'json', value: any) {
|
|
if (type === 'text')
|
|
return fetch.mockResolvedValueOnce({
|
|
headers: new Headers({
|
|
'content-type': 'text/plain',
|
|
}),
|
|
status: 204,
|
|
url: 'test123',
|
|
text() {
|
|
return Promise.resolve(value);
|
|
},
|
|
});
|
|
if (type === 'json')
|
|
return fetch.mockResolvedValueOnce({
|
|
headers: new Headers({
|
|
'content-type': 'application/json',
|
|
}),
|
|
status: 204,
|
|
url: 'test123',
|
|
json() {
|
|
return Promise.resolve(value);
|
|
},
|
|
});
|
|
}
|
|
|
|
function expectFetchCall(ops: {
|
|
inputUrl: string;
|
|
input: DefaultedFetcherOptions;
|
|
outputUrl?: string;
|
|
output: any;
|
|
outputBody: any;
|
|
}) {
|
|
const prom = fetcher(ops.inputUrl, ops.input);
|
|
expect((async () => (await prom).body)()).resolves.toEqual(ops.outputBody);
|
|
expect((async () => Array.from((await prom).headers.entries()))()).resolves.toEqual(
|
|
Array.from(new Headers().entries()),
|
|
);
|
|
expect((async () => (await prom).statusCode)()).resolves.toEqual(204);
|
|
expect((async () => (await prom).finalUrl)()).resolves.toEqual('test123');
|
|
expect(fetch).toBeCalledWith(ops.outputUrl ?? ops.inputUrl, ops.output);
|
|
vi.clearAllMocks();
|
|
}
|
|
|
|
it('should pass options through', () => {
|
|
setResult('text', 'hello world');
|
|
expectFetchCall({
|
|
inputUrl: 'https://google.com',
|
|
input: {
|
|
method: 'GET',
|
|
query: {},
|
|
readHeaders: [],
|
|
headers: {
|
|
'X-Hello': 'world',
|
|
},
|
|
},
|
|
outputUrl: 'https://google.com/',
|
|
output: {
|
|
method: 'GET',
|
|
headers: {
|
|
'X-Hello': 'world',
|
|
},
|
|
body: undefined,
|
|
},
|
|
outputBody: 'hello world',
|
|
});
|
|
setResult('text', 'hello world');
|
|
expectFetchCall({
|
|
inputUrl: 'https://google.com',
|
|
input: {
|
|
method: 'GET',
|
|
headers: {},
|
|
readHeaders: [],
|
|
query: {
|
|
a: 'b',
|
|
},
|
|
},
|
|
outputUrl: 'https://google.com/?a=b',
|
|
output: {
|
|
method: 'GET',
|
|
headers: {},
|
|
},
|
|
outputBody: 'hello world',
|
|
});
|
|
setResult('text', 'hello world');
|
|
expectFetchCall({
|
|
inputUrl: 'https://google.com',
|
|
input: {
|
|
query: {},
|
|
headers: {},
|
|
readHeaders: [],
|
|
method: 'GET',
|
|
},
|
|
outputUrl: 'https://google.com/',
|
|
output: {
|
|
method: 'GET',
|
|
headers: {},
|
|
},
|
|
outputBody: 'hello world',
|
|
});
|
|
});
|
|
|
|
it('should parse response correctly', () => {
|
|
setResult('text', 'hello world');
|
|
expectFetchCall({
|
|
inputUrl: 'https://google.com/',
|
|
input: {
|
|
query: {},
|
|
headers: {},
|
|
readHeaders: [],
|
|
method: 'POST',
|
|
},
|
|
outputUrl: 'https://google.com/',
|
|
output: {
|
|
method: 'POST',
|
|
headers: {},
|
|
},
|
|
outputBody: 'hello world',
|
|
});
|
|
setResult('json', { hello: 42 });
|
|
expectFetchCall({
|
|
inputUrl: 'https://google.com/',
|
|
input: {
|
|
query: {},
|
|
headers: {},
|
|
readHeaders: [],
|
|
method: 'POST',
|
|
},
|
|
outputUrl: 'https://google.com/',
|
|
output: {
|
|
method: 'POST',
|
|
headers: {},
|
|
},
|
|
outputBody: { hello: 42 },
|
|
});
|
|
});
|
|
});
|