150 lines
5.1 KiB
TypeScript
150 lines
5.1 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
esActividadVencida,
|
|
esRolConEquipo,
|
|
formatoFechaCorta,
|
|
hoyLocal,
|
|
urlCotizadorParaOportunidad,
|
|
urlAfluenciaParaOportunidad,
|
|
DESARROLLOS_LEAD,
|
|
MOTIVOS_NO_COMPRA,
|
|
ORIGENES_LEAD,
|
|
textoDiasRestantes,
|
|
type OportunidadMiDia,
|
|
} from './mi-dia'
|
|
|
|
describe('catálogos', () => {
|
|
it('orígenes = vocabulario FRASA (captura ligera y afluencia)', () => {
|
|
expect([...ORIGENES_LEAD]).toEqual(['PASE', 'PROSPECCION ASESOR', 'ACTIVACION', 'FACEBOOK FRASA', 'REFERIDO', 'BROCKER', 'OTRO'])
|
|
})
|
|
|
|
it('desarrollos = labels reales de la columna Desarrollo del board Leads', () => {
|
|
expect([...DESARROLLOS_LEAD]).toEqual(['ATELIER', 'DIAGONAL', 'ESTANZA', 'SENDA', 'SOLANA', 'SOLE', 'MUTUO'])
|
|
})
|
|
|
|
it('motivos de descarte = vocabulario CRM (igual que el API)', () => {
|
|
expect(MOTIVOS_NO_COMPRA).toContain('Precio')
|
|
expect(MOTIVOS_NO_COMPRA).toContain('Timing')
|
|
expect(MOTIVOS_NO_COMPRA).toHaveLength(7)
|
|
})
|
|
})
|
|
|
|
describe('esRolConEquipo', () => {
|
|
it('coordinador, corporativo y admin ven equipo; vendedor no', () => {
|
|
expect(esRolConEquipo('coordinador')).toBe(true)
|
|
expect(esRolConEquipo('corporativo')).toBe(true)
|
|
expect(esRolConEquipo('admin')).toBe(true)
|
|
expect(esRolConEquipo('vendedor')).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('formatoFechaCorta', () => {
|
|
it('recorta el año', () => {
|
|
expect(formatoFechaCorta('2026-08-29')).toBe('29/08')
|
|
})
|
|
|
|
it('tolera cadenas mal formadas devolviéndolas tal cual', () => {
|
|
expect(formatoFechaCorta('sin-fecha')).toBe('sin-fecha')
|
|
})
|
|
})
|
|
|
|
describe('textoDiasRestantes', () => {
|
|
it('hoy, mañana y n días', () => {
|
|
expect(textoDiasRestantes(0)).toBe('Vence hoy')
|
|
expect(textoDiasRestantes(1)).toBe('Vence mañana')
|
|
expect(textoDiasRestantes(5)).toBe('Vence en 5 días')
|
|
})
|
|
})
|
|
|
|
describe('esActividadVencida', () => {
|
|
it('compara contra la fecha de hoy', () => {
|
|
expect(esActividadVencida('2026-08-27', '2026-08-28')).toBe(true)
|
|
expect(esActividadVencida('2026-08-28', '2026-08-28')).toBe(false)
|
|
expect(esActividadVencida('2026-08-29', '2026-08-28')).toBe(false)
|
|
expect(esActividadVencida('', '2026-08-28')).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('hoyLocal', () => {
|
|
it('devuelve YYYY-MM-DD', () => {
|
|
expect(hoyLocal()).toMatch(/^\d{4}-\d{2}-\d{2}$/)
|
|
})
|
|
})
|
|
|
|
describe('urlCotizadorParaOportunidad', () => {
|
|
const opBase: OportunidadMiDia = {
|
|
id: 'opp-1',
|
|
nombre: 'María Pérez',
|
|
telefono: '4771234567',
|
|
email: 'maria@correo.com',
|
|
etapa: 'Afluencia',
|
|
desarrollo: 'SENDA',
|
|
modeloInteres: 'SOHO',
|
|
vendedor: 'Martin Zavala',
|
|
unidadCodigo: 'U-9',
|
|
updatedAt: '2026-09-04T10:00:00Z',
|
|
ultimoCambio: null,
|
|
}
|
|
|
|
it('prellena cliente, contacto, desarrollo y unidad, y vincula la oportunidad', () => {
|
|
const url = urlCotizadorParaOportunidad(opBase)
|
|
const params = new URLSearchParams(url.replace('/quote/?', ''))
|
|
expect(url.startsWith('/quote/?')).toBe(true)
|
|
expect(params.get('cliente')).toBe('María Pérez')
|
|
expect(params.get('telefono')).toBe('4771234567')
|
|
expect(params.get('email')).toBe('maria@correo.com')
|
|
expect(params.get('desarrollo')).toBe('SENDA')
|
|
expect(params.get('unidad')).toBe('U-9')
|
|
expect(params.get('oportunidadId')).toBe('opp-1')
|
|
})
|
|
|
|
it('omite los campos vacíos', () => {
|
|
const url = urlCotizadorParaOportunidad({ ...opBase, telefono: '', email: '', desarrollo: '', unidadCodigo: '' })
|
|
const params = new URLSearchParams(url.replace('/quote/?', ''))
|
|
expect(params.get('cliente')).toBe('María Pérez')
|
|
expect(params.get('oportunidadId')).toBe('opp-1')
|
|
expect(params.has('telefono')).toBe(false)
|
|
expect(params.has('email')).toBe(false)
|
|
expect(params.has('desarrollo')).toBe(false)
|
|
expect(params.has('unidad')).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('urlAfluenciaParaOportunidad', () => {
|
|
const opBase: OportunidadMiDia = {
|
|
id: 'opp-7',
|
|
nombre: 'María Pérez',
|
|
telefono: '4771234567',
|
|
email: 'maria@correo.com',
|
|
etapa: 'Agendo Cita',
|
|
desarrollo: 'SENDA',
|
|
modeloInteres: 'SOHO',
|
|
vendedor: 'Martin Zavala',
|
|
unidadCodigo: '',
|
|
updatedAt: '2026-09-04T10:00:00Z',
|
|
ultimoCambio: null,
|
|
}
|
|
|
|
it('abre /client con el id de la oportunidad y los datos de prefill', () => {
|
|
const url = urlAfluenciaParaOportunidad(opBase)
|
|
const params = new URLSearchParams(url.replace('/client/?', ''))
|
|
expect(url.startsWith('/client/?')).toBe(true)
|
|
expect(params.get('afluencia')).toBe('opp-7')
|
|
expect(params.get('nombre')).toBe('María Pérez')
|
|
expect(params.get('telefono')).toBe('4771234567')
|
|
expect(params.get('email')).toBe('maria@correo.com')
|
|
expect(params.get('desarrollo')).toBe('SENDA')
|
|
expect(params.get('modelo')).toBe('SOHO')
|
|
})
|
|
|
|
it('omite los campos vacíos', () => {
|
|
const url = urlAfluenciaParaOportunidad({ ...opBase, telefono: '', email: '', desarrollo: '', modeloInteres: '' })
|
|
const params = new URLSearchParams(url.replace('/client/?', ''))
|
|
expect(params.get('afluencia')).toBe('opp-7')
|
|
expect(params.has('telefono')).toBe(false)
|
|
expect(params.has('email')).toBe(false)
|
|
expect(params.has('desarrollo')).toBe(false)
|
|
expect(params.has('modelo')).toBe(false)
|
|
})
|
|
})
|