import { beforeEach, describe, expect, it, vi } from 'vitest' const prismaMock = vi.hoisted(() => ({ cliente: { findMany: vi.fn() }, leadCaptura: { findMany: vi.fn() }, })) vi.mock('../services/prisma.js', () => ({ prisma: prismaMock })) import { exportarCSV } from './contactos-local.service.js' beforeEach(() => { vi.clearAllMocks() prismaMock.cliente.findMany.mockResolvedValue([]) prismaMock.leadCaptura.findMany.mockResolvedValue([]) }) describe('exportarCSV', () => { it('genera CSV con encabezados cuando no hay contactos', async () => { const csv = await exportarCSV() expect(csv).toContain('Nombre,Teléfono,Email,Desarrollo,Estatus,Última actividad') }) it('incluye clientes y capturas en el CSV', async () => { prismaMock.cliente.findMany.mockResolvedValue([ { nombreCompleto: 'Juan Pérez', celular: '4771234567', email: 'juan@correo.mx', proyecto: 'SENDA', createdAt: new Date('2026-09-01'), }, ]) prismaMock.leadCaptura.findMany.mockResolvedValue([ { nombreLead: 'Ana López', telefono: '6649998877', email: 'ana@test.com', desarrollo: 'DIAGONAL', etapa: 'NUEVO', updatedAt: new Date('2026-09-05'), }, ]) const csv = await exportarCSV() const lineas = csv.split('\n') expect(lineas).toHaveLength(3) // header + 2 rows expect(lineas[1]).toContain('Juan Pérez') expect(lineas[1]).toContain('Cliente') expect(lineas[2]).toContain('Ana López') expect(lineas[2]).toContain('NUEVO') }) it('filtra por desarrollo', async () => { prismaMock.cliente.findMany.mockResolvedValue([ { nombreCompleto: 'A', celular: null, email: null, proyecto: 'SENDA', createdAt: new Date() }, { nombreCompleto: 'B', celular: null, email: null, proyecto: 'DIAGONAL', createdAt: new Date() }, ]) prismaMock.leadCaptura.findMany.mockResolvedValue([]) const csv = await exportarCSV({ desarrollo: 'SENDA' }) expect(csv).toContain('A') expect(csv).not.toContain('B') }) it('escapa comas y comillas en los campos', async () => { prismaMock.cliente.findMany.mockResolvedValue([ { nombreCompleto: 'Pérez, Juan', celular: null, email: null, proyecto: 'SENDA', createdAt: new Date(), }, ]) prismaMock.leadCaptura.findMany.mockResolvedValue([]) const csv = await exportarCSV() expect(csv).toContain('"Pérez, Juan"') }) })