import { beforeEach, describe, expect, it, vi } from 'vitest' import type { Request, Response } from 'express' import { AppError } from '../utils/errors.js' // ---------- Prisma mockeado ---------- const prismaMock = vi.hoisted(() => ({ auditoriaLog: { findMany: vi.fn(), }, })) vi.mock('../services/prisma.js', () => ({ prisma: prismaMock })) import { listarAuditoriaEndpoint } from './auditoria.controller.js' function reqFake(query?: Record, token?: { sub: string; rol: string }): Request { return { query, usuarioToken: token } as unknown as Request } function resFake() { const json = vi.fn() const status = vi.fn().mockReturnValue({ json }) return { res: { json, status } as unknown as Response, status, json } } beforeEach(() => { vi.clearAllMocks() }) describe('listarAuditoriaEndpoint (GET /api/auditoria)', () => { it('retorna logs de auditoría para admin', async () => { const logsFake = [{ id: 'log-1', usuarioId: 'u1', accion: 'CREAR_LEAD', entidad: 'lead', entidadId: 'l1', detalle: null, createdAt: new Date() }] prismaMock.auditoriaLog.findMany.mockResolvedValue(logsFake) const { res, json } = resFake() await listarAuditoriaEndpoint(reqFake({}, { sub: 'admin1', rol: 'admin' }), res) expect(json).toHaveBeenCalledWith(logsFake) }) it('aplica filtros de entidad y usuarioId', async () => { prismaMock.auditoriaLog.findMany.mockResolvedValue([]) const { res } = resFake() await listarAuditoriaEndpoint( reqFake({ entidad: 'lead', usuarioId: 'u1' }, { sub: 'admin1', rol: 'admin' }), res, ) expect(prismaMock.auditoriaLog.findMany).toHaveBeenCalledWith( expect.objectContaining({ where: expect.objectContaining({ entidad: 'lead', usuarioId: 'u1' }), }), ) }) it('aplica filtro de fechas', async () => { prismaMock.auditoriaLog.findMany.mockResolvedValue([]) const { res } = resFake() await listarAuditoriaEndpoint( reqFake({ desde: '2026-09-01', hasta: '2026-09-07' }, { sub: 'admin1', rol: 'admin' }), res, ) expect(prismaMock.auditoriaLog.findMany).toHaveBeenCalledWith( expect.objectContaining({ where: expect.objectContaining({ createdAt: expect.objectContaining({ gte: expect.any(Date), lte: expect.any(Date) }), }), }), ) }) it('respeta el límite personalizado', async () => { prismaMock.auditoriaLog.findMany.mockResolvedValue([]) const { res } = resFake() await listarAuditoriaEndpoint( reqFake({ limite: '10' }, { sub: 'admin1', rol: 'admin' }), res, ) expect(prismaMock.auditoriaLog.findMany).toHaveBeenCalledWith( expect.objectContaining({ take: 10 }), ) }) it('retorna array vacío si no hay logs', async () => { prismaMock.auditoriaLog.findMany.mockResolvedValue([]) const { res, json } = resFake() await listarAuditoriaEndpoint(reqFake({}, { sub: 'admin1', rol: 'admin' }), res) expect(json).toHaveBeenCalledWith([]) }) })