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