Files
reformix-hackaton/mvp/b2c/tests/voice/retell.test.ts
Carlos Narro 372ad560bf Añade llamada saliente con Retell al funnel B2C
Integra el agente de voz de Retell (Arquitectura A para la demo): tras la
pre-llamada, el orquestador lanza una llamada saliente real con override de
agente y dynamic variables (empresa + cliente), mientras el render y el
presupuesto se siguen generando con los datos del formulario.

- src/lib/env.ts: esquema zod de RETELL_* (claves opcionales -> sin ellas el
  funnel sigue en modo simulado y el build no se rompe)
- src/lib/voice/retell.ts: cliente fino con fetch a create-phone-call
  (sin nueva dependencia), normalización E.164 y builder de variables
- orchestrator: dispara la llamada best-effort y guarda el callId
- tests del normalizador de teléfono y del builder de variables

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-02 21:55:29 +02:00

64 lines
2.3 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { normalizarTelefonoEs, construirVariablesLlamada } from '@/lib/voice/retell';
describe('normalizarTelefonoEs', () => {
it('añade prefijo +34 a un móvil nacional de 9 dígitos', () => {
expect(normalizarTelefonoEs('612345678')).toBe('+34612345678');
});
it('acepta fijos nacionales (empiezan por 8/9)', () => {
expect(normalizarTelefonoEs('912345678')).toBe('+34912345678');
});
it('limpia espacios, guiones y paréntesis', () => {
expect(normalizarTelefonoEs('612 34 56 78')).toBe('+34612345678');
expect(normalizarTelefonoEs('+34 612-345-678')).toBe('+34612345678');
});
it('respeta un E.164 ya formado', () => {
expect(normalizarTelefonoEs('+34612345678')).toBe('+34612345678');
});
it('normaliza los prefijos 0034 y 34 sin +', () => {
expect(normalizarTelefonoEs('0034612345678')).toBe('+34612345678');
expect(normalizarTelefonoEs('34612345678')).toBe('+34612345678');
});
it('devuelve null si no es un teléfono válido', () => {
expect(normalizarTelefonoEs('123')).toBeNull();
expect(normalizarTelefonoEs('hola')).toBeNull();
});
});
describe('construirVariablesLlamada', () => {
it('incluye siempre empresa_nombre y el nombre de pila del cliente', () => {
const vars = construirVariablesLlamada(
{ nombreEmpresa: 'Reformas Ejemplo' },
{ nombre: 'Ana Pérez', tipoReforma: 'cocina', provincia: 'Madrid' },
);
expect(vars.empresa_nombre).toBe('Reformas Ejemplo');
expect(vars.cliente_nombre).toBe('Ana');
expect(vars.tipo_reforma).toBe('cocina');
expect(vars.provincia).toBe('Madrid');
});
it('omite tipo_reforma y provincia cuando faltan', () => {
const vars = construirVariablesLlamada(
{ nombreEmpresa: 'Reformas Ejemplo' },
{ nombre: 'Luis', tipoReforma: null, provincia: null },
);
expect(vars.empresa_nombre).toBe('Reformas Ejemplo');
expect(vars.cliente_nombre).toBe('Luis');
expect('tipo_reforma' in vars).toBe(false);
expect('provincia' in vars).toBe(false);
});
it('usa la etiqueta en minúscula para tipo_reforma', () => {
const vars = construirVariablesLlamada(
{ nombreEmpresa: 'X' },
{ nombre: 'Eva', tipoReforma: 'integral', provincia: null },
);
expect(vars.tipo_reforma).toBe('reforma integral');
});
});