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