Files
FRASA-CAS/api-gateway/src/services/unidades-local.service.test.ts

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()
})
})