You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.4 KiB
4.4 KiB
Plan de cobertura de tests (pendientes y prioritarios)
Este documento recoge huecos relevantes de cobertura detectados al revisar la suite actual. La intención es prevenir regresiones en flujos críticos, no añadir tests por añadir.
Áreas de mejora propuestas
1) Comandos y asignaciones
- Creación con menciones en grupos: si el mensaje incluye @menciones (contextInfo.mentionedJid), asignar a esos usuarios:
- Normalizar IDs a dígitos.
- Evitar duplicados.
- Crear usuarios inexistentes (ensureUserExists).
- Verificar ACK de creación refleja destinatarios asignados.
- “Tomar” cuando ya hay otro responsable:
- Definir contrato: ¿multi-asignación permitida o bloqueo con mensaje (“ya tiene responsable”)? Añadir test y ajustar si aplica.
- “Soltar” con varios responsables:
- Verificar que al soltar uno, la tarea no queda “sin responsable” si siguen existiendo otros asignados.
2) WebhookServer
- Integración de menciones: extraer contextInfo.mentionedJid y pasar “mentions” normalizadas a CommandService (end-to-end).
- getMessageText: cubrir videoMessage.caption además de conversation/extendedText/image caption.
- Cuerpo JSON inválido con Content-Type: application/json:
- Devolver 400 sin lanzar excepción no controlada.
- /metrics con METRICS_ENABLED=false:
- Debe devolver 404 (ya hay test para enabled=true).
- Eventos desconocidos:
- Debe responder 200 (o el comportamiento esperado) sin efectos colaterales.
3) TaskService
- ON DELETE CASCADE: borrar una tarea elimina sus asignaciones (task_assignments).
- FK en createTask con group_id inexistente:
- Debe fallar por FK (asegura integridad y que las FKs siguen activas).
- Descripciones con caracteres especiales/SQL:
- Asegurar persistencia literal usando parámetros (no concatenación) y sin truncado.
- padTaskId:
- Formateo con ancho y no truncar IDs largos.
4) GroupSyncService
- fetchGroupMembersFromAPI:
- Fallo de red o JSON corrupto ⇒ snapshot vacío y sin romper flujo superior.
- syncGroups:
- 200 con contenido no-JSON o estructura inesperada ⇒ error claro y log.
- Caché de grupos activos:
- Si hay vencimiento/actualización, test de refresco para evitar caché desfasado.
5) RemindersService
- start/stop:
- No arranca en test (ya lo respeta), y cuando retentionDays <= 0 no programa.
- Bordes de horario/TZ:
- Exactamente a la hora configurada (p. ej., 08:30 exacto).
- Transición fin de día (23:59 → 00:00) en la TZ configurada.
- Fija el comportamiento de ymdInTZ/hmInTZ.
6) ResponseQueue
- Concurrencia de claimNextBatch:
- Dos llamadas simultáneas no deben reclamar el mismo ítem.
- markSent (si existe):
- Marca “sent”, actualiza updated_at y deja de ser reclamable.
7) MaintenanceService
- retentionDays = 0 o < 0:
- No debe borrar nada.
- Sin inactivos:
- cleanupInactiveMembersOnce devuelve 0 y no toca filas activas.
8) Metrics
- enabled():
- Cubrir combinaciones: true/1/yes, false/0/no, undefined en test/prod.
- Evitar emisión accidental en entornos no deseados.
9) DB/Pragmas y utilidades
- getDb:
- Crea directorio data (manejar EEXIST) y aplica PRAGMAs por defecto.
- tableHasColumn (migraciones condicionales):
- Comportamiento correcto con tablas parciales.
10) Salud y endpoints
- /health sin ?full=1:
- Respuesta básica “ok” sin suponer tablas opcionales.
Priorización sugerida
- Asignaciones por menciones (grupo) e integración desde WebhookServer.
- Concurrencia de claimNextBatch en ResponseQueue.
- Integridad referencial: cascada en task_assignments y FK de createTask con group inexistente.
- Robustez WebhookServer: JSON inválido y /metrics disabled.
- GroupSync: errores en fetchGroupMembersFromAPI y contenidos inesperados en syncGroups.
- Reminders: bordes de horario exacto y retención desactivada.
- “Tomar/soltar” con múltiples responsables.
Notas de implementación
- Preferir tests end-to-end donde aporten valor (WebhookServer → CommandService → ResponseQueue/DB).
- Aislar concurrencia con transacciones/estados consistentes; si procede, usar transacciones en claimNextBatch.
- Mantener NODE_ENV y banderas (METRICS_ENABLED, TZ) explícitas por test.
- Reutilizar DB en memoria con initializeDatabase y limpiar tablas entre casos.
- Usar factories/helpers (p. ej., ensureUserExists) para preparar datos evitando duplicación.