import { describe, it, expect } from 'vitest' import { slugify, buildFileName } from '@/lib/export/slug' describe('slugify', () => { it('"Proceso de Compras" → "proceso-de-compras"', () => { expect(slugify('Proceso de Compras')).toBe('proceso-de-compras') }) it('"Análisis Año 2025" → "analisis-ano-2025"', () => { expect(slugify('Análisis Año 2025')).toBe('analisis-ano-2025') }) it('elimina la ñ → n', () => { expect(slugify('Gestión de Compañía')).toBe('gestion-de-compania') }) it('elimina acentos (á é í ó ú ü)', () => { expect(slugify('Ú ltimo Análisis Crítico')).toBe('u-ltimo-analisis-critico') }) it('caracteres especiales → guiones', () => { expect(slugify('Proceso #1 / Sub-proceso (test)')).toBe('proceso-1-sub-proceso-test') }) it('múltiples espacios → un solo guión', () => { expect(slugify('Proceso de ventas')).toBe('proceso-de-ventas') }) it('string vacío → string vacío', () => { expect(slugify('')).toBe('') }) it('solo números → se mantienen', () => { expect(slugify('2025')).toBe('2025') }) it('ya en minúsculas sin acentos → sin cambios relevantes', () => { expect(slugify('proceso-lineal')).toBe('proceso-lineal') }) it('limita a 60 caracteres', () => { const long = 'a'.repeat(100) expect(slugify(long)).toHaveLength(60) }) }) describe('buildFileName', () => { // new Date(año, mes0, día) → fecha local sin ambigüedad de timezone const date = new Date(2026, 4, 13) // 13 de mayo de 2026, local time it('genera filename con proceso + cliente + fecha', () => { const name = buildFileName('Proceso de Ventas', 'Banco ABC', date, 'pdf') expect(name).toBe('proceso-de-ventas_banco-abc_20260513.pdf') }) it('omite cliente si está vacío', () => { const name = buildFileName('Proceso de Ventas', '', date, 'csv') expect(name).toBe('proceso-de-ventas_20260513.csv') }) it('omite cliente si es undefined', () => { const name = buildFileName('Proceso', undefined, date, 'pdf') expect(name).toBe('proceso_20260513.pdf') }) it('extensión csv correcta', () => { const name = buildFileName('test', 'cliente', date, 'csv') expect(name).toMatch(/\.csv$/) }) it('extensión pdf correcta', () => { const name = buildFileName('test', 'cliente', date, 'pdf') expect(name).toMatch(/\.pdf$/) }) it('nombre con caracteres especiales queda limpio (sin #, paréntesis)', () => { const name = buildFileName('Análisis #1', 'Empresa S.A.', date, 'csv') // Verificar solo el slug (sin la extensión que tiene un punto legítimo) const slug = name.replace(/\.\w+$/, '') expect(slug).not.toMatch(/[#()]/) expect(name).toMatch(/analisis/) }) })