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
cd server
npm run test:flowEste comando ejecuta manualFlowTest.js que simula 3 conversaciones completas:
- Usuario Primerizo - Cumpleaños infantil con restricciones
- Usuario Experimentado - Graduación con preferencias específicas
- Presupuesto Ajustado - Reunión familiar con necesidades de accesibilidad
El script manualFlowTest.js ejecuta 6 casos de prueba completos:
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
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)
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
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
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
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)
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 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"
- Explícita: "15 niños", "40 personas", "seremos 25"
- Rangos: "entre 20 y 30", "unos 50"
- Aproximada: "pocos" (10-15), "muchos" (30-50)
- Con símbolo: "$60000", "60.000 pesos"
- En texto: "sesenta mil pesos"
- Rangos: "entre 50 y 100 mil"
- Zonas: "Nueva Córdoba", "Centro", "Cerro de las Rosas"
- Domicilio: "en mi casa", "en casa de mi abuela"
- Tipo: "salón", "quincho", "club"
["celíaco", "gluten", "vegetariano", "vegano", "diabético", "alergia"]["silla de ruedas", "rampa", "accesibilidad", "movilidad reducida"]primerizo: ["primera vez", "nunca organicé", "no sé"]
experimentado: ["organizo", "ya organicé", "siempre hago"]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');
}async function main() {
await testCase1();
await testCase2();
await testCase3();
await testCase4(); // Nuevo test
// ...
}- 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
- 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
# Verificar que el servidor esté corriendo
.\status.bat
# Si no está, iniciarlo
.\start.bat- 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()
- 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)
- 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
- Ejecutar tests después de cada cambio en el controlador
- Agregar nuevos casos cuando se implemente nueva funcionalidad
- Documentar patrones de detección en este archivo
- Usar logs para debugging (
console.logen chatController.js) - Validar respuestas completas (no solo que no haya errores)
- Probar edge cases (fechas ambiguas, números conflictivos, etc.)