Files
gruperly/apps/backend/test/attendees.test.ts
2026-09-17 18:58:00 -03:00

83 lines
2.2 KiB
TypeScript

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' });
});
});