/ src / api / __tests__ / client.test.ts
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  });