import { delay, http, HttpResponse, HttpResponseResolver } from 'msw'; // Higher order function to add delay to a response if present in search params function withDelay(resolver: HttpResponseResolver) { return async (info: Parameters[0]) => { const delayVal = new URL(info.request.url).searchParams.get('delay'); if (delayVal) { await delay(Number(delayVal)); } return resolver(info); }; } interface LogEntry { message?: string; } export const handlers = [ // Get auth token set to :username http.get( '/refresh_token/:username', withDelay(({ params }) => { const { username } = params; return HttpResponse.text(String(username)); }) ), http.get( '/user', withDelay(({ request }) => { const token = request.headers.get('Authorization')?.split(' ')[1] ?? ''; if (!token) { // If not authenticated, respond with a 401 error return HttpResponse.json( { errorMessage: 'Unauthorized', }, { status: 401 } ); } // If authenticated, return a mocked user details return HttpResponse.json({ username: token, }); }) ), http.get( '/public', withDelay(() => { return HttpResponse.text('200'); }) ), http.get('/broken', () => { return HttpResponse.error(); }), http.get('/unauthorized', () => { return HttpResponse.text('401 Unauthorized', { status: 401 }); }), http.get('/date', () => { return HttpResponse.text(new Date().toISOString()); }), http.post('/Log/Send', async ({ request }) => { dumpLogEntries(request.url, await request.json()); return HttpResponse.json(undefined, { status: 200 }); }), http.post('/Log/SendLocal', async ({ request }) => { dumpLogEntries(request.url, await request.json()); return HttpResponse.json(undefined, { status: 200 }); }), ]; function dumpLogEntries(source: string, entries: LogEntry[]) { // eslint-disable-next-line no-console entries.forEach(({ message }) => console.info(`${source}: ${message}`)); }