Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/Davidmallega/Gastos-App/llms.txt

Use this file to discover all available pages before exploring further.

GastosApp cuenta con una suite de 42 tests unitarios ejecutados con Vitest que cubren exclusivamente funciones de lógica pura de los módulos format.js y compromisos.js. Al no depender de DOM, red ni estado global, los tests se ejecutan en entorno node y completan en aproximadamente 350ms. La configuración de Vitest vive en vite.config.js mediante la clave test, lo que evita un archivo de configuración adicional.

Ejecutar los tests

# Ejecuta toda la suite una vez y muestra el resumen final
# Tiempo aproximado: ~350ms
npm test

Archivos de test

ArchivoTestsFunciones cubiertas
tests/format.test.js24formatCLP, formatDate, getPendienteHealth, buildNCMap, calcTotals, parseSIIDate, parseNumber
tests/compromisos.test.js18getCompromisoStatus — todos los estados, todas las frecuencias y casos borde del bug semanal corregido

Helper localStr

Los tests de getPendienteHealth en format.test.js trabajan con fechas relativas al día actual y deben generar cadenas 'YYYY-MM-DD' que representen el día en hora local, no en UTC. El método estándar d.toISOString().slice(0, 10) convierte primero a UTC, lo que en zonas UTC-4 o UTC-5 puede retroceder la fecha un día completo y hacer que el test falle. Para evitar este problema, el describe de getPendienteHealth en format.test.js define el helper localStr de forma local:
// Helper local dentro de describe('getPendienteHealth') en format.test.js
const localStr = (d) => {
  const y   = d.getFullYear()
  const m   = String(d.getMonth() + 1).padStart(2, '0')
  const day = String(d.getDate()).padStart(2, '0')
  return `${y}-${m}-${day}`
}

// Uso en getPendienteHealth:
const hoy     = new Date()
const maniana = new Date(hoy); maniana.setDate(hoy.getDate() + 1)

getPendienteHealth(localStr(maniana))
// { label: 'Programado', color: 'blue' }  ← correcto en cualquier zona horaria
Los tests de compromisos.test.js no necesitan este helper porque usan fechas fijas (new Date(2026, 5, 8)) o el helper daysFromNow basado en setDate, que opera en tiempo local de forma nativa. Este mismo patrón de evitar UTC es el que usa parseLocalDate en el código de producción, asegurando consistencia entre tests y runtime.

Casos borde documentados

Bug semanal: daysForward === 0 cuando hoy ES el día objetivo

En los compromisos semanales, el cálculo usa (target - dow + 7) % 7 para obtener los días hasta la próxima ocurrencia. Cuando hoy es exactamente el día objetivo, este resultado es 0. El código debe reconocer que daysForward === 0 significa que el vencimiento es hoy (→ 'proximo', con threshold de 2 días para semanales) y no recalcular el estado incorrectamente. Este caso está cubierto explícitamente en tests/compromisos.test.js con una fecha fija (lunes 8 de junio de 2026):
it('hoy ES el día objetivo → proximo', () => {
  const lunes = new Date(2026, 5, 8)  // lunes
  const comp  = semanal(1)            // objetivo: lunes (diaSemana: 1)
  expect(getCompromisoStatus(comp, lunes)).toBe('proximo')
})
Usar fechas fijas (no relativas al día de ejecución) garantiza que estos tests sean deterministas y no dependan del día de la semana en que corre el CI o el desarrollador.

Casos borde adicionales cubiertos en format.test.js

  • formatCLP(null) y formatCLP(undefined)'$0' (sin excepción)
  • formatDate('no-es-fecha')'—' (manejo silencioso de fecha inválida)
  • buildNCMap con NC sin facturaRefId → el mapa queda vacío (no se acumula ruido)
  • calcTotals con NC vinculada a factura pagada → el monto pagado se reduce, no el pendiente
  • parseSIIDate(null)'' (sin excepción)
  • parseNumber('') y parseNumber(null)0
Los tests solo cubren funciones de lógica pura. No hay tests E2E de UI. Para flujos completos se recomienda Playwright (ver deuda técnica).

Build docs developers (and LLMs) love