feat(purga): Monday eliminado completamente del sistema

14 servicios eliminados, 7 controllers local-only, crons locales,
config sin MONDAY_*, frontend sin banners/avisos Monday.
552 tests API + 7 apps construidas.
This commit is contained in:
2026-09-11 11:47:17 +00:00
parent 64b01246d6
commit 89d95eb53b
130 changed files with 2018 additions and 14747 deletions

View File

@@ -1,7 +1,6 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { AppError } from '../utils/errors.js'
// ---------- Prisma y Monday mockeados (los tests no tocan BD ni red) ----------
// ---------- Prisma mockeado (los tests no tocan BD) ----------
const prismaMock = vi.hoisted(() => ({
unidad: {
@@ -10,23 +9,14 @@ const prismaMock = vi.hoisted(() => ({
},
}))
const mondayMock = vi.hoisted(() => ({
getUnidades: vi.fn(),
getUnidad: vi.fn(),
}))
vi.mock('../services/prisma.js', () => ({ prisma: prismaMock }))
vi.mock('../services/monday.service.js', () => ({ mondayService: mondayMock }))
import {
getUnidadesLocal,
getUnidadLocal,
listarUnidadesConFallback,
obtenerUnidadConFallback,
unidadLocalADto,
type FilaUnidad,
} from './unidades-local.service.js'
import { saludMonday } from './salud-monday.service.js'
function fila(parcial: Partial<FilaUnidad> & { codigo: string }): FilaUnidad {
return {
@@ -45,14 +35,12 @@ function fila(parcial: Partial<FilaUnidad> & { codigo: string }): FilaUnidad {
beforeEach(() => {
vi.clearAllMocks()
vi.restoreAllMocks() // restaura los spyOn(saludMonday, 'estaDisponible')
saludMonday.restablecer()
prismaMock.unidad.findMany.mockResolvedValue([])
prismaMock.unidad.findUnique.mockResolvedValue(null)
})
describe('unidadLocalADto', () => {
it('mapea la fila local al DTO Unidad (misma forma que Monday)', () => {
it('mapea la fila local al DTO Unidad', () => {
const dto = unidadLocalADto(fila({ codigo: 'SENDA-101' }))
expect(dto).toEqual({
codigo: 'SENDA-101',
@@ -70,7 +58,7 @@ describe('unidadLocalADto', () => {
})
})
it('etapa vacía → null (como el mapeo Monday)', () => {
it('etapa vacía → null', () => {
expect(unidadLocalADto(fila({ codigo: 'U-1', etapa: '' })).etapa).toBeNull()
})
})
@@ -100,42 +88,3 @@ describe('getUnidadesLocal / getUnidadLocal', () => {
expect(await getUnidadLocal('U-X')).toBeNull()
})
})
describe('fallbacks con circuit breaker', () => {
it('Monday caído (salud) → lee local sin llamar a Monday', async () => {
vi.spyOn(saludMonday, 'estaDisponible').mockReturnValue(false)
prismaMock.unidad.findMany.mockResolvedValue([fila({ codigo: 'U-1' })])
prismaMock.unidad.findUnique.mockResolvedValue(fila({ codigo: 'U-1' }))
const lista = await listarUnidadesConFallback()
expect(lista.map((u) => u.codigo)).toEqual(['U-1'])
expect(mondayMock.getUnidades).not.toHaveBeenCalled()
const unidad = await obtenerUnidadConFallback('U-1')
expect(unidad?.codigo).toBe('U-1')
expect(mondayMock.getUnidad).not.toHaveBeenCalled()
})
it('Monday vivo → camino normal (sin tocar local)', async () => {
mondayMock.getUnidades.mockResolvedValue([{ codigo: 'M-1' }])
mondayMock.getUnidad.mockResolvedValue({ codigo: 'M-1' })
expect(await listarUnidadesConFallback()).toEqual([{ codigo: 'M-1' }])
expect(await obtenerUnidadConFallback('M-1')).toEqual({ codigo: 'M-1' })
expect(prismaMock.unidad.findMany).not.toHaveBeenCalled()
})
it('Monday lanza AppError 502 → fallback local', async () => {
mondayMock.getUnidades.mockRejectedValue(new AppError(502, 'Monday no respondió'))
mondayMock.getUnidad.mockRejectedValue(new AppError(502, 'Monday no respondió'))
prismaMock.unidad.findMany.mockResolvedValue([fila({ codigo: 'U-1' })])
prismaMock.unidad.findUnique.mockResolvedValue(fila({ codigo: 'U-1' }))
expect((await listarUnidadesConFallback()).map((u) => u.codigo)).toEqual(['U-1'])
expect((await obtenerUnidadConFallback('U-1'))?.codigo).toBe('U-1')
})
it('otro error de Monday se propaga (no se traga nada)', async () => {
mondayMock.getUnidades.mockRejectedValue(new AppError(500, 'bug'))
await expect(listarUnidadesConFallback()).rejects.toThrow('bug')
})
})