import { describe, expect, it } from 'vitest'; import { summarizeEntry } from '../src/services/videoSummary.js'; const base = { id: 'abc', title: 'Titre', url: 'https://www.youtube.com/watch?v=abc' }; describe('summarizeEntry', () => { it('extrait les champs connus et met null pour les champs absents', () => { expect(summarizeEntry(base)).toEqual({ ...base, thumbnailUrl: null, durationSeconds: null, uploadDate: null, }); }); it('lit durée et date de mise en ligne quand elles sont bien typées', () => { const summary = summarizeEntry({ ...base, duration: 120, upload_date: '20260101' }); expect(summary?.durationSeconds).toBe(120); expect(summary?.uploadDate).toBe('20260101'); }); it('ignore une durée ou une date de mauvais type', () => { const summary = summarizeEntry({ ...base, duration: '120', upload_date: 20260101 }); expect(summary?.durationSeconds).toBeNull(); expect(summary?.uploadDate).toBeNull(); }); it('préfère le champ singulier thumbnail au tableau thumbnails', () => { const summary = summarizeEntry({ ...base, thumbnail: 'https://x/single.jpg', thumbnails: [{ url: 'https://x/array.jpg' }], }); expect(summary?.thumbnailUrl).toBe('https://x/single.jpg'); }); it('retombe sur la dernière miniature du tableau thumbnails', () => { const summary = summarizeEntry({ ...base, thumbnails: [{ url: 'https://x/small.jpg' }, { url: 'https://x/large.jpg' }], }); expect(summary?.thumbnailUrl).toBe('https://x/large.jpg'); }); it('ignore un tableau thumbnails vide ou mal formé', () => { expect(summarizeEntry({ ...base, thumbnails: [] })?.thumbnailUrl).toBeNull(); expect(summarizeEntry({ ...base, thumbnails: [{ width: 10 }] })?.thumbnailUrl).toBeNull(); expect(summarizeEntry({ ...base, thumbnails: [null] })?.thumbnailUrl).toBeNull(); }); it.each([ ['sans id', { title: 'T', url: 'https://x' }], ['sans titre', { id: 'a', url: 'https://x' }], ['sans url', { id: 'a', title: 'T' }], ['avec un id non textuel', { id: 42, title: 'T', url: 'https://x' }], ])('retourne null pour une entrée %s', (_label, entry) => { expect(summarizeEntry(entry)).toBeNull(); }); it.each([null, undefined, 'texte', 42, [], [base]])( 'retourne null pour une valeur qui n’est pas un objet (%j)', (value) => { expect(summarizeEntry(value)).toBeNull(); }, ); });