136 lines
4.9 KiB
TypeScript
136 lines
4.9 KiB
TypeScript
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<FilaUnidad> & { 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()
|
|
})
|
|
})
|