Skip to content

Latest commit

 

History

History
393 lines (295 loc) · 12 KB

File metadata and controls

393 lines (295 loc) · 12 KB

EventAI - Guía de Testing

🧪 Estrategia de Pruebas

EventAI utiliza un sistema de testing basado en reglas determinísticas sin dependencias de IA externa. Esto garantiza:

  • ✅ Comportamiento 100% predecible
  • ✅ Tests reproducibles
  • ✅ Sin costos de APIs externas
  • ✅ Velocidad de ejecución óptima

🚀 Ejecutar Tests

Tests Automatizados de Flujo Completo

cd server
npm run test:flow

Este comando ejecuta manualFlowTest.js que simula 3 conversaciones completas:

  1. Usuario Primerizo - Cumpleaños infantil con restricciones
  2. Usuario Experimentado - Graduación con preferencias específicas
  3. Presupuesto Ajustado - Reunión familiar con necesidades de accesibilidad

📋 Casos de Prueba Documentados

El script manualFlowTest.js ejecuta 6 casos de prueba completos:

CASO 1: Usuario Primerizo - Cumpleaños Infantil

Perfil: Persona sin experiencia organizando eventos, estresada, presupuesto ajustado

Conversación:

Usuario: "Hola, necesito ayuda. Tengo que organizar un cumpleaños pero no sé ni por dónde empezar"
Bot: Detecta "cumpleaños" → Pregunta por cantidad de invitados

Usuario: "Es el cumpleaños de mi hijo que cumple 6 años"
Bot: Ignora "6 años" (es edad, no cantidad) → Sigue esperando número de invitados

Usuario: "Serían unos 15 niños"
Bot: Detecta "15 niños" → Pregunta por fecha

Usuario: "Es el 22 de diciembre"
Bot: Parsea "22 de diciembre" → Pregunta por presupuesto

Usuario: "Tengo 60000 pesos"
Bot: Detecta "$60000" → Pregunta por ubicación

Usuario: "En mi casa en zona Centro"
Bot: Detecta "Centro" → Genera plan completo con 15 invitados

Usuario: "Temática de superhéroes y tenemos 2 celíacos"
Bot: Actualiza plan con restricción "celíaco" y temática

Validaciones:

  • ✅ Distingue edad de cantidad de invitados
  • ✅ Prioriza menciones explícitas ("serían unos 15")
  • ✅ Parsea fecha en español
  • ✅ Detecta restricciones alimentarias
  • ✅ Genera plan con 8 secciones

CASO 2: Usuario Experimentado - Graduación

Perfil: Experiencia previa organizando eventos, busca optimización

Conversación:

Usuario: "Hola"
Bot: Saludo inicial → Pregunta tipo de evento

Usuario: "Organizo varios eventos al año. Esta vez es una fiesta de graduación con mis compañeros"
Bot: Detecta "graduación" → Pregunta cantidad

Usuario: "Seremos 40 personas"
Bot: Detecta "40" → Pregunta fecha

Usuario: "Para el próximo viernes"
Bot: Calcula fecha del próximo viernes (10 de octubre) → Pregunta presupuesto

Usuario: "Tenemos 150000 pesos entre todos"
Bot: Detecta "$150000" → Pregunta ubicación

Usuario: "Nueva Córdoba preferentemente"
Bot: Detecta "Nueva Córdoba" → Genera plan

Usuario: "Algo relajado, nada muy formal. Fotos profesionales sí queremos"
Bot: Detecta preferencia de estilo "formal" (interpreta "nada muy formal")

Validaciones:

  • ✅ Parsea fechas relativas ("próximo viernes")
  • ✅ Calcula día de semana correcto
  • ✅ Detecta estilo en fase de personalización
  • ✅ Genera plan para eventos grandes (40 personas)

CASO 3: Presupuesto Ajustado - Reunión Familiar

Perfil: Restricción financiera, busca alternativas económicas

Conversación:

Usuario: "Hola"
Bot: Saludo → Pregunta tipo de evento

Usuario: "Quiero hacer algo lindo para una reunión familiar"
Bot: Detecta "reunión familiar" → Pregunta cantidad

Usuario: "Somos como 25 personas entre adultos y algunos chicos"
Bot: Detecta "25 personas" → Pregunta fecha

Usuario: "La semana que viene"
Bot: Detecta "próxima semana" → Pregunta presupuesto

Usuario: "Tengo muy poco, solo 30000 pesos"
Bot: Detecta "$30000" → Pregunta ubicación

Usuario: "En mi casa"
Bot: Detecta "en casa" → Genera plan

Usuario: "Mi abuela necesita rampa para silla de ruedas y tenemos un vegetariano"
Bot: Detecta accesibilidad "silla de ruedas" + restricción "vegetariano" → Actualiza plan

Validaciones:

  • ✅ Detecta presupuestos bajos
  • ✅ Reconoce ubicación "en casa"
  • ✅ Identifica necesidades de accesibilidad
  • ✅ Detecta múltiples restricciones en un mensaje

CASO 4: Boda Tradicional

Perfil: Pareja planificando matrimonio, presupuesto amplio

Conversación:

Usuario: "Buenos días, queremos organizar nuestra boda"
Bot: Detecta "boda" → Pregunta cantidad

Usuario: "Calculamos entre 80 y 100 invitados"
Bot: Detecta "80" (primer número del rango) → Pregunta fecha

Usuario: "Sería en marzo del año que viene"
Bot: Parsea "marzo" → Pregunta presupuesto

Usuario: "Tenemos 500000 pesos de presupuesto"
Bot: Detecta "$500000" → Pregunta ubicación

Usuario: "Nos gustaría en Cerro de las Rosas o Villa Allende"
Bot: Detecta "Cerro de las Rosas" → Genera plan

Usuario: "Queremos algo elegante pero no muy formal, con música en vivo"
Bot: Detecta preferencias de estilo → Actualiza plan

Validaciones:

  • ✅ Detecta tipo de evento "boda"
  • ✅ Maneja rangos de invitados ("entre 80 y 100")
  • ✅ Parsea fechas por mes y año
  • ✅ Reconoce presupuestos altos
  • ✅ Detecta múltiples ubicaciones opcionales

CASO 5: Evento Urgente - Despedida

Perfil: Organización de último momento, grupo de amigos

Conversación:

Usuario: "Hola! Necesito organizar algo urgente"
Bot: Saludo → Pregunta tipo de evento

Usuario: "Es una despedida de soltero, nuestro amigo se casa en 2 semanas"
Bot: Detecta "fiesta" (genérico) → Pregunta cantidad

Usuario: "Somos 12 personas, todos hombres"
Bot: Detecta "12 personas" → Pregunta fecha

Usuario: "Este sábado que viene"
Bot: Calcula próximo sábado → Pregunta presupuesto

Usuario: "Juntamos 80000 pesos entre todos"
Bot: Detecta "$80000" → Pregunta ubicación

Usuario: "Nueva Córdoba, algún lugar con parrilla"
Bot: Detecta "Nueva Córdoba" → Genera plan

Usuario: "Queremos algo tranquilo, sin mucho lío. Algunos toman cerveza nomás"
Bot: Detecta estilo casual → Actualiza plan

Validaciones:

  • ✅ Maneja eventos urgentes (poco tiempo de planificación)
  • ✅ Detecta "este sábado que viene" correctamente
  • ✅ Reconoce grupos pequeños (12 personas)
  • ✅ Identifica preferencias específicas (parrilla)
  • ✅ Adapta plan a estilo informal

CASO 6: Cumpleaños Adulto - Sorpresa

Perfil: Fiesta sorpresa para adulto de 50 años

Conversación:

Usuario: "Hola, quiero organizar una fiesta sorpresa"
Bot: Saludo → Pregunta tipo de evento

Usuario: "Es para el cumpleaños número 50 de mi mamá"
Bot: Detecta "cumpleaños" → Pregunta cantidad

Usuario: "Invitaríamos a 35 personas, familia y amigos cercanos"
Bot: Detecta "35 personas" → Pregunta fecha

Usuario: "El 15 de noviembre"
Bot: Parsea "15 de noviembre" → Pregunta presupuesto

Usuario: "Tenemos 120000 pesos"
Bot: Detecta "$120000" → Pregunta ubicación

Usuario: "Pensamos hacerlo en General Paz, en un salón"
Bot: Detecta "General Paz" → Genera plan

Usuario: "Ella es diabética y varios de la familia también. Nada muy extravagante, música de los 80s"
Bot: Detecta restricción "diabético" y preferencias → Actualiza plan

Validaciones:

  • ✅ Detecta cumpleaños de adultos
  • ✅ Reconoce cantidad media (35 personas)
  • ✅ Parsea fechas con día y mes específicos
  • ✅ Identifica restricciones médicas (diabético)
  • ✅ Captura preferencias temáticas (música de los 80s)

🎯 Patrones de Detección

Tipos de Eventos

cumpleaños: ["cumpleaños", "cumpleanos", "birthday", "cumple", "años del"]
graduación: ["graduacion", "graduación", "egresado", "fin de curso", "recibirse"]
reunión familiar: ["reunion", "reunión", "familiar", "familia", "juntada"]
boda: ["boda", "casamiento", "matrimonio", "casamos"]
fiesta: ["fiesta", "party", "festejo"]

Fechas Soportadas

  • Fechas absolutas: "22 de diciembre", "15/01/2026"
  • Fechas relativas: "mañana", "la semana que viene", "el próximo mes"
  • Días de semana: "el próximo viernes", "próximo sábado"
  • Contextuales: "hoy", "pasado mañana", "este fin de semana"

Cantidad de Invitados

  • Explícita: "15 niños", "40 personas", "seremos 25"
  • Rangos: "entre 20 y 30", "unos 50"
  • Aproximada: "pocos" (10-15), "muchos" (30-50)

Presupuesto

  • Con símbolo: "$60000", "60.000 pesos"
  • En texto: "sesenta mil pesos"
  • Rangos: "entre 50 y 100 mil"

Ubicación

  • Zonas: "Nueva Córdoba", "Centro", "Cerro de las Rosas"
  • Domicilio: "en mi casa", "en casa de mi abuela"
  • Tipo: "salón", "quincho", "club"

Restricciones Alimentarias

["celíaco", "gluten", "vegetariano", "vegano", "diabético", "alergia"]

Accesibilidad

["silla de ruedas", "rampa", "accesibilidad", "movilidad reducida"]

Experiencia

primerizo: ["primera vez", "nunca organicé", "no sé"]
experimentado: ["organizo", "ya organicé", "siempre hago"]

🔧 Agregar Nuevos Tests

1. Modificar manualFlowTest.js

async function testCase4() {
  console.log('CASO 4: [Título del caso]');
  const SESSION = 'test-case-4-' + Date.now();
  const steps = [
    'Mensaje 1 del usuario',
    'Mensaje 2 del usuario',
    // ... más mensajes
  ];

  for (const msg of steps) {
    log('Usuario', msg, colors.yellow);
    const reply = await post(msg, SESSION);
    log('Bot', reply, colors.cyan);
    await new Promise(r => setTimeout(r, 500));
  }

  console.log('✓ CASO 4 completado');
}

2. Agregar al main()

async function main() {
  await testCase1();
  await testCase2();
  await testCase3();
  await testCase4(); // Nuevo test
  // ...
}

📊 Cobertura de Tests

✅ Funcionalidades Testeadas

  • Detección de 5 tipos de eventos (cumpleaños, graduación, reunión familiar, boda, fiesta)
  • Extracción de cantidad de invitados (con priorización y manejo de rangos)
  • Parseo de fechas en múltiples formatos (absoluto, relativo, días de semana)
  • Detección de presupuesto (rangos bajos, medios, altos)
  • Detección de ubicación (zonas de Córdoba y domicilios)
  • Restricciones alimentarias (celíaco, vegetariano, diabético)
  • Necesidades de accesibilidad (silla de ruedas, rampa)
  • Nivel de experiencia del usuario (primerizo, experimentado)
  • Generación de plan completo (8 secciones)
  • Actualización de plan en fase de personalización
  • Eventos urgentes (poco tiempo de planificación)
  • Grupos pequeños, medianos y grandes (12-100 personas)
  • Preferencias temáticas y estilos específicos

🚧 Áreas para Mejorar Cobertura

  • Múltiples eventos en una conversación
  • Corrección de información previa
  • Validación de fechas pasadas
  • Manejo de presupuestos irreales
  • Detección de ubicaciones fuera de Córdoba
  • Combinaciones complejas de restricciones

🐛 Troubleshooting

"Backend no disponible"

# Verificar que el servidor esté corriendo
.\status.bat

# Si no está, iniciarlo
.\start.bat

"Test falla en detección de fecha"

  • Verificar que la fecha use formato español
  • Revisar logs de chrono-node en consola del servidor
  • Confirmar que el patrón está en detectEventDate()

"Cantidad de invitados incorrecta"

  • Verificar que el mensaje tenga palabras clave explícitas
  • Revisar lógica de priorización en getConversationState()
  • Confirmar que no haya números ambiguos (edad vs cantidad)

📚 Referencias

  • Documentación de tests: reference_docs/TEST_FLOWS_NO_OLLAMA.md
  • Script de tests: server/scripts/manualFlowTest.js
  • Controlador principal: server/src/controllers/chatController.js
  • Parseo de fechas: chrono-node documentation

🎓 Mejores Prácticas

  1. Ejecutar tests después de cada cambio en el controlador
  2. Agregar nuevos casos cuando se implemente nueva funcionalidad
  3. Documentar patrones de detección en este archivo
  4. Usar logs para debugging (console.log en chatController.js)
  5. Validar respuestas completas (no solo que no haya errores)
  6. Probar edge cases (fechas ambiguas, números conflictivos, etc.)