Files
FRASA-CAS/api-gateway/src/controllers/auditoria.controller.test.ts
Consult AS Technology c77b4c0628 feat(mejoras): 14 mejoras al CRM Frasa
Fase 1 - UI: dark mode, skeletons, toasts
Fase 2 - Filtros: avanzados Mi día, búsqueda global Ctrl+K
Fase 3 - Datos: export Excel, notas apartados, auditoría
Fase 4 - Dashboard: gráficas vendedor + métricas uso
Fase 5 - Responsive: tablets optimizadas
Fase 6 - PWA: IndexedDB offline, push notifications

Backend: 3 tablas nuevas, 6 services, 6 endpoints nuevos
721 API tests + fronts verdes.
2026-09-07 06:04:49 +00:00

94 lines
3.0 KiB
TypeScript

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<string, string>, 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([])
})
})