shlink-web-client/test/common/services/HttpClient.test.ts

73 lines
2.2 KiB
TypeScript
Raw Normal View History

2023-08-27 19:22:04 +03:00
import type { RequestOptions } from '../../../src/common/services/HttpClient';
2022-11-17 23:30:42 +03:00
import { HttpClient } from '../../../src/common/services/HttpClient';
describe('HttpClient', () => {
2023-05-27 12:57:26 +03:00
const fetch = vi.fn();
2022-11-17 23:30:42 +03:00
const httpClient = new HttpClient(fetch);
2023-08-27 19:22:04 +03:00
const requestOptions = (options: Omit<RequestOptions, 'method'>): RequestOptions => ({
method: 'GET',
...options,
});
2022-11-17 23:30:42 +03:00
describe('fetchJson', () => {
2022-11-20 14:54:06 +03:00
it('throws json on success', async () => {
2022-11-17 23:30:42 +03:00
const theError = { error: true, foo: 'bar' };
fetch.mockResolvedValue({ json: () => theError, ok: false });
await expect(httpClient.fetchJson('')).rejects.toEqual(theError);
});
it.each([
[undefined],
2023-08-27 19:22:04 +03:00
[requestOptions({})],
[requestOptions({ body: undefined })],
[requestOptions({ body: '' })],
])('return json on failure', async (options) => {
2022-11-17 23:30:42 +03:00
const theJson = { foo: 'bar' };
fetch.mockResolvedValue({ json: () => theJson, ok: true });
const result = await httpClient.fetchJson('the_url', options);
2022-11-17 23:30:42 +03:00
expect(result).toEqual(theJson);
expect(fetch).toHaveBeenCalledWith('the_url', options);
});
it.each([
2023-08-27 19:22:04 +03:00
[requestOptions({ body: 'the_body' })],
[requestOptions({
body: 'the_body',
headers: {
'Content-Type': 'text/plain',
},
2023-08-27 19:22:04 +03:00
})],
])('forwards JSON content-type when appropriate', async (options) => {
const theJson = { foo: 'bar' };
fetch.mockResolvedValue({ json: () => theJson, ok: true });
const result = await httpClient.fetchJson('the_url', options);
expect(result).toEqual(theJson);
expect(fetch).toHaveBeenCalledWith('the_url', expect.objectContaining({
headers: { 'Content-Type': 'application/json' },
}));
2022-11-17 23:30:42 +03:00
});
});
2022-11-20 14:54:06 +03:00
describe('fetchEmpty', () => {
it('returns empty on success', async () => {
fetch.mockResolvedValue({ ok: true });
const result = await httpClient.fetchEmpty('');
expect(result).not.toBeDefined();
});
it('throws error on failure', async () => {
const theError = { error: true, foo: 'bar' };
fetch.mockResolvedValue({ json: () => theError, ok: false });
2023-08-08 00:06:29 +03:00
await expect(httpClient.fetchEmpty('')).rejects.toEqual(theError);
2022-11-20 14:54:06 +03:00
});
});
2022-11-17 23:30:42 +03:00
});