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