import { beforeEach, describe, expect, it, mock, vi } from 'bun:test'; import { Hono } from 'hono'; mock.module('@/lib/prisma', () => ({ default: { attendee: { findMany: mock(), count: mock(), }, }, getPrismaClient: mock(), UnitOfWork: class {}, })); import prisma from '@/lib/prisma'; import { attendeesRoutes } from '@/modules/attendees'; const app = new Hono(); app.route('/attendees', attendeesRoutes); const attendee = { id: 'attendee-1', groupId: 'group-1', fullName: 'Ana Pérez', email: 'ana@example.com', phone: null, guardianName: 'Luis Pérez', guardianPhone: null, notes: null, createdAt: new Date('2026-08-01T10:00:00.000Z'), updatedAt: new Date('2026-08-01T10:00:00.000Z'), }; describe('attendees routes', () => { beforeEach(() => { vi.clearAllMocks(); }); it('lists attendees with pagination', async () => { prisma.attendee.findMany.mockResolvedValue([attendee]); prisma.attendee.count.mockResolvedValue(21); const res = await app.request('/attendees?page=2&pageSize=10'); expect(res.status).toBe(200); expect(await res.json()).toEqual({ data: [ { ...attendee, createdAt: attendee.createdAt.toISOString(), updatedAt: attendee.updatedAt.toISOString(), }, ], pagination: { page: 2, pageSize: 10, total: 21, totalPages: 3 }, }); expect(prisma.attendee.findMany).toHaveBeenCalledWith({ skip: 10, take: 10, orderBy: { createdAt: 'desc' }, }); expect(prisma.attendee.count).toHaveBeenCalledWith(); }); it('uses default pagination', async () => { prisma.attendee.findMany.mockResolvedValue([]); prisma.attendee.count.mockResolvedValue(0); const res = await app.request('/attendees'); expect(res.status).toBe(200); expect(await res.json()).toEqual({ data: [], pagination: { page: 1, pageSize: 10, total: 0, totalPages: 0 }, }); }); it('rejects invalid pagination query parameters', async () => { const res = await app.request('/attendees?page=0&pageSize=25'); expect(res.status).toBe(400); expect(await res.json()).toMatchObject({ status: 400, title: 'Bad Request' }); }); });