Files
FRASA-CAS/apps/mi-dia/src/lib/mi-dia.test.ts

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)
})
})