import { describe, it, expect } from 'vitest'; import { agruparPorZona } from '@/lib/funnel/fotos'; import type { LeadFoto, LeadNota } from '@/db/schema'; function foto(p: Partial): LeadFoto { return { id: Math.random().toString(36).slice(2), leadId: 'lead-1', url: 'data:img', momento: 'antes', zona: null, orden: 0, createdAt: new Date(), ...p, } as LeadFoto; } function nota(p: Partial): LeadNota { return { id: Math.random().toString(36).slice(2), leadId: 'lead-1', zona: null, texto: 'x', origen: 'ep', createdAt: new Date(), ...p, } as LeadNota; } describe('agruparPorZona', () => { it('separa antes y después dentro de cada zona', () => { const grupos = agruparPorZona( [ foto({ zona: 'bano', momento: 'antes' }), foto({ zona: 'bano', momento: 'despues' }), foto({ zona: 'bano', momento: 'antes' }), ], [], 'otro', ); expect(grupos).toHaveLength(1); expect(grupos[0].zona).toBe('bano'); expect(grupos[0].antes).toHaveLength(2); expect(grupos[0].despues).toHaveLength(1); }); it('agrupa por zona distintas y mantiene el orden de aparición', () => { const grupos = agruparPorZona( [foto({ zona: 'cocina' }), foto({ zona: 'bano' }), foto({ zona: 'cocina' })], [], 'otro', ); expect(grupos.map((g) => g.zona)).toEqual(['cocina', 'bano']); expect(grupos[0].antes).toHaveLength(2); }); it('usa el tipo del lead como fallback cuando la zona es null', () => { const grupos = agruparPorZona([foto({ zona: null })], [nota({ zona: null })], 'salon'); expect(grupos).toHaveLength(1); expect(grupos[0].zona).toBe('salon'); expect(grupos[0].antes).toHaveLength(1); expect(grupos[0].notas).toHaveLength(1); }); it('asocia las notas a su zona', () => { const grupos = agruparPorZona( [foto({ zona: 'cocina' })], [nota({ zona: 'cocina', texto: 'encimera de cuarzo' }), nota({ zona: 'bano', texto: 'ducha' })], 'otro', ); const cocina = grupos.find((g) => g.zona === 'cocina'); const bano = grupos.find((g) => g.zona === 'bano'); expect(cocina?.notas.map((n) => n.texto)).toEqual(['encimera de cuarzo']); expect(bano?.notas.map((n) => n.texto)).toEqual(['ducha']); expect(bano?.antes).toHaveLength(0); }); it('devuelve vacío sin fotos ni notas', () => { expect(agruparPorZona([], [], 'cocina')).toEqual([]); }); });