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.
94 lines
3.0 KiB
TypeScript
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([])
|
|
})
|
|
})
|