import { beforeEach, describe, expect, it, vi } from 'vitest' // ---------- Prisma mockeado (los tests no tocan BD) ---------- const prismaMock = vi.hoisted(() => ({ unidad: { findMany: vi.fn(), findUnique: vi.fn(), }, capturaDepartamento: { findMany: vi.fn(), }, })) vi.mock('../services/prisma.js', () => ({ prisma: prismaMock })) import { CAMPOS_FECHA_ENTREGA, getUnidadesLocal, getUnidadLocal, unidadLocalADto, type FilaUnidad, } from './unidades-local.service.js' function fila(parcial: Partial & { codigo: string }): FilaUnidad { return { desarrollo: 'SENDA', modelo: '1R', supConstruccion: 69.5, supExcedente: 0, supEstacionamiento: 12.5, precioLista: 4_415_000, precioAcabados: 4_579_000, status: 'DISPONIBLE', etapa: 'Entrega inmediata', ...parcial, } } beforeEach(() => { vi.clearAllMocks() prismaMock.unidad.findMany.mockResolvedValue([]) prismaMock.unidad.findUnique.mockResolvedValue(null) prismaMock.capturaDepartamento.findMany.mockResolvedValue([]) }) describe('unidadLocalADto', () => { it('mapea la fila local al DTO Unidad (sin fecha de entrega por defecto)', () => { const dto = unidadLocalADto(fila({ codigo: 'SENDA-101' })) expect(dto).toEqual({ codigo: 'SENDA-101', modelo: '1R', fechaEntrega: null, supEstacionamiento: 12.5, supConstruccion: 69.5, supExcedente: 0, precioSinAcabados: 4_415_000, precioConAcabados: 4_579_000, status: 'DISPONIBLE', desarrollo: 'SENDA', mesesParaFirma: null, etapa: 'Entrega inmediata', }) }) it('con fecha de entrega (captura de departamentos) la deja en el DTO', () => { expect(unidadLocalADto(fila({ codigo: 'U-101' }), '2027-10-08').fechaEntrega).toBe('2027-10-08') }) it('etapa vacía → null', () => { expect(unidadLocalADto(fila({ codigo: 'U-1', etapa: '' })).etapa).toBeNull() }) }) describe('getUnidadesLocal / getUnidadLocal', () => { it('devuelve las filas mapeadas; soloDisponibles y desarrollo filtran', async () => { prismaMock.unidad.findMany.mockResolvedValue([ fila({ codigo: 'U-1', desarrollo: 'DIAGONAL' }), fila({ codigo: 'U-2', desarrollo: 'SENDA', status: 'APARTADO' }), fila({ codigo: 'U-3', desarrollo: 'senda' }), ]) const todas = await getUnidadesLocal() expect(todas.map((u) => u.codigo)).toEqual(['U-1', 'U-2', 'U-3']) const disponibles = await getUnidadesLocal({ soloDisponibles: true }) expect(disponibles.map((u) => u.codigo)).toEqual(['U-1', 'U-3']) const senda = await getUnidadesLocal({ desarrollo: 'SENDA' }) expect(senda.map((u) => u.codigo)).toEqual(['U-2', 'U-3']) }) it('completa fechaEntrega desde la captura: reprogramada > programada > habitabilidad > inicio de obra', async () => { prismaMock.unidad.findMany.mockResolvedValue([ fila({ codigo: 'U-1', desarrollo: 'DIAGONAL' }), fila({ codigo: 'U-2', desarrollo: 'DIAGONAL' }), fila({ codigo: 'S-1', desarrollo: 'SENDA' }), fila({ codigo: 'S-2', desarrollo: 'SENDA' }), fila({ codigo: 'S-3', desarrollo: 'SENDA' }), ]) prismaMock.capturaDepartamento.findMany.mockResolvedValue([ { unidadCodigo: 'U-1', campo: 'inicio_obra_fecha', valor: '2026-01-01' }, { unidadCodigo: 'U-1', campo: 'habitabilidad', valor: '2027-10-08' }, { unidadCodigo: 'U-1', campo: 'entrega_programada_fecha', valor: '2027-11-20' }, { unidadCodigo: 'S-1', campo: 'habitabilidad', valor: '2027-05-05' }, // Valor vacío / no-fecha: no cuenta como dato { unidadCodigo: 'S-1', campo: 'entrega_programada_fecha', valor: '' }, { unidadCodigo: 'S-2', campo: 'entrega_programada_fecha', valor: 'pendiente' }, // Reprogramada: manda sobre la programada cuando existe { unidadCodigo: 'U-1', campo: 'entrega_reprogramada_fecha', valor: '2028-02-15' }, // Reprogramada vacía: se ignora y gana la programada { unidadCodigo: 'S-3', campo: 'entrega_reprogramada_fecha', valor: '' }, { unidadCodigo: 'S-3', campo: 'entrega_programada_fecha', valor: '2027-07-01' }, ]) const todas = await getUnidadesLocal() expect(todas.map((u) => u.fechaEntrega)).toEqual(['2028-02-15', null, '2027-05-05', null, '2027-07-01']) expect(prismaMock.capturaDepartamento.findMany).toHaveBeenCalledWith( expect.objectContaining({ where: { campo: { in: [...CAMPOS_FECHA_ENTREGA] } } }), ) }) it('getUnidadLocal: null si no existe; trae la fecha de su captura', async () => { prismaMock.unidad.findUnique.mockImplementation(async ({ where }) => where.codigo === 'U-9' ? fila({ codigo: 'U-9' }) : null, ) prismaMock.capturaDepartamento.findMany.mockResolvedValue([ { unidadCodigo: 'U-9', campo: 'habitabilidad', valor: '2027-10-08' }, ]) const dto = await getUnidadLocal('U-9') expect(dto?.codigo).toBe('U-9') expect(dto?.fechaEntrega).toBe('2027-10-08') expect(await getUnidadLocal('U-X')).toBeNull() }) })