import { http, HttpResponse, delay } from 'msw';
import { setupServer } from 'msw/node';
// ============================================
// Mock Database
// ============================================
const users = [
{ id: 1, name: 'John Doe', email: 'john@example.com' },
{ id: 2, name: 'Jane Doe', email: 'jane@example.com' },
];
// ============================================
// Handlers
// ============================================
export const handlers = [
// GET Users
http.get('https://api.example.com/users', async () => {
// Simulate network delay
await delay(500);
return HttpResponse.json(users);
}),
// GET User by ID
http.get('https://api.example.com/users/:id', async ({ params }) => {
const { id } = params;
const user = users.find(u => u.id === Number(id));
if (!user) {
return new HttpResponse(null, { status: 404 });
}
return HttpResponse.json(user);
}),
// POST Create User
http.post('https://api.example.com/users', async ({ request }) => {
const newUser = (await request.json()) as any;
// Basic validation mock
if (!newUser.email) {
return HttpResponse.json(
{ error: 'Email required' },
{ status: 400 }
);
}
return HttpResponse.json(
{ id: 3, ...newUser },
{ status: 201 }
);
}),
// AUTH Login
http.post('https://api.example.com/login', async ({ request }) => {
const { email } = (await request.json()) as any;
if (email === 'admin@example.com') {
return HttpResponse.json({
token: 'mock-jwt-token',
user: { id: 1, role: 'admin' }
});
}
return HttpResponse.json(
{ message: 'Invalid credentials' },
{ status: 401 }
);
}),
];
// ============================================
// Server Setup (Node environment)
// ============================================
// Use this in your setupTests.ts
export const server = setupServer(...handlers);
/*
// In setupTests.ts:
beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());
*/
// ============================================
// Browser Setup (Client environment)
// ============================================
/*
import { setupWorker } from 'msw/browser';
const worker = setupWorker(...handlers);
// In main.tsx:
if (process.env.NODE_ENV === 'development') {
worker.start();
}
*/