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>
This commit is contained in:
63
mvp/b2c/tests/voice/retell.test.ts
Normal file
63
mvp/b2c/tests/voice/retell.test.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
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');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user