Testing Route Handlers

+15 Mana ✨

Route Handlers export standard functions that can be called directly in tests.

Example Route Handler

typescript
// app/api/users/route.ts
import { prisma } from '@/lib/prisma';

export async function GET() {
  const users = await prisma.user.findMany();
  return Response.json(users);
}

export async function POST(request: Request) {
  const data = await request.json();
  const user = await prisma.user.create({ data });
  return Response.json(user, { status: 201 });
}

Testing

typescript
// app/api/users/route.test.ts
import { GET, POST } from './route';

jest.mock('@/lib/prisma', () => ({
  prisma: {
    user: {
      findMany: jest.fn().mockResolvedValue([{ id: 1, name: 'John' }]),
      create: jest.fn().mockImplementation((args) => ({ id: 2, ...args.data })),
    },
  },
}));

describe('Users API', () => {
  it('GET returns users', async () => {
    const response = await GET();
    const data = await response.json();

    expect(response.status).toBe(200);
    expect(data).toHaveLength(1);
    expect(data[0].name).toBe('John');
  });

  it('POST creates a user', async () => {
    const request = new Request('http://localhost/api/users', {
      method: 'POST',
      body: JSON.stringify({ name: 'Jane', email: 'jane@example.com' }),
    });

    const response = await POST(request);

    expect(response.status).toBe(201);
  });
});
✓ Completed