58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
import { api } from './api';
|
|
|
|
describe('api', () => {
|
|
afterEach(() => {
|
|
vi.unstubAllGlobals();
|
|
});
|
|
|
|
it('fetches the supplied relative path with credentials and a JSON body', async () => {
|
|
const fetchMock = vi.fn<typeof fetch>();
|
|
fetchMock.mockResolvedValue(
|
|
new Response(JSON.stringify({ ok: true }), {
|
|
status: 200,
|
|
headers: { 'Content-Type': 'application/json' },
|
|
}),
|
|
);
|
|
vi.stubGlobal('fetch', fetchMock);
|
|
|
|
await expect(
|
|
api<{ ok: boolean }>('/api/projects', {
|
|
method: 'POST',
|
|
body: { name: 'Mosaic' },
|
|
}),
|
|
).resolves.toEqual({ ok: true });
|
|
|
|
expect(fetchMock).toHaveBeenCalledOnce();
|
|
expect(fetchMock).toHaveBeenCalledWith(
|
|
'/api/projects',
|
|
expect.objectContaining({
|
|
method: 'POST',
|
|
credentials: 'include',
|
|
body: JSON.stringify({ name: 'Mosaic' }),
|
|
headers: expect.objectContaining({
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
}),
|
|
}),
|
|
);
|
|
});
|
|
|
|
it('throws the gateway JSON error with its statusCode', async () => {
|
|
const fetchMock = vi.fn<typeof fetch>();
|
|
fetchMock.mockResolvedValue(
|
|
new Response(JSON.stringify({ statusCode: 403, message: 'Forbidden' }), {
|
|
status: 403,
|
|
headers: { 'Content-Type': 'application/json' },
|
|
}),
|
|
);
|
|
vi.stubGlobal('fetch', fetchMock);
|
|
|
|
await expect(api('/api/admin/users')).rejects.toMatchObject({
|
|
name: 'Error',
|
|
message: 'Forbidden',
|
|
statusCode: 403,
|
|
});
|
|
});
|
|
});
|