client.test.ts
1 // Copyright (c) 2026 VPL Solutions. All rights reserved. 2 // Licensed under the MIT License. See LICENSE for details. 3 4 import { describe, it, expect, beforeAll, afterAll, afterEach } from 'vitest'; 5 import { http, HttpResponse, delay } from 'msw'; 6 import { setupServer } from 'msw/node'; 7 import { api, ApiError } from '../client'; 8 9 const server = setupServer(); 10 11 beforeAll(() => server.listen({ onUnhandledRequest: 'error' })); 12 afterEach(() => server.resetHandlers()); 13 afterAll(() => server.close()); 14 15 describe('api client timeout', () => { 16 it('throws ApiError when request exceeds timeoutMs', async () => { 17 server.use( 18 http.get('http://localhost:8000/slow', async () => { 19 await delay(5000); 20 return HttpResponse.json({ ok: true }); 21 }), 22 ); 23 24 await expect( 25 api.get('/slow', { timeoutMs: 100 }), 26 ).rejects.toThrow(ApiError); 27 28 await expect( 29 api.get('/slow', { timeoutMs: 100 }), 30 ).rejects.toThrow(/timed out/); 31 }); 32 33 it('succeeds when response arrives before timeout', async () => { 34 server.use( 35 http.get('http://localhost:8000/fast', async () => { 36 return HttpResponse.json({ ok: true }); 37 }), 38 ); 39 40 const result = await api.get('/fast', { timeoutMs: 5000 }); 41 expect(result).toEqual({ ok: true }); 42 }); 43 });