import { describe, expect, it } from 'vitest'; import { chunkForSpeech, cleanForSpeech, extractSentences, isTranscriptNoise, preprocessMedia } from '../src/lib/text'; describe('text', () => { it('cleans markdown for speech', () => { const out = cleanForSpeech('**Bonjour** ! Voir [le site](https://x.io) et `npm` 😀\n\n```js\nconsole.log(1)\n```\n- item un\n- item deux'); expect(out).not.toMatch(/\*|https|```|😀/); expect(out).toContain('Bonjour'); expect(out).toContain('item un'); }); it('extracts complete sentences from a stream buffer', () => { const { sentences, rest } = extractSentences('Première phrase complète. Deuxième phrase aussi ! Troisième en cours'); expect(sentences).toEqual(['Première phrase complète.', 'Deuxième phrase aussi !']); expect(rest).toBe(' Troisième en cours'); }); it('does not split inside an open code fence', () => { expect(extractSentences('Voici. ```js\nfoo(). bar\n').sentences).toEqual([]); }); it('chunks long text', () => { const chunks = chunkForSpeech('mot '.repeat(200), 100); expect(chunks.every((c) => c.length <= 100)).toBe(true); expect(preprocessMedia('MEDIA:/tmp/a.png')).toContain('![image](/tmp/a.png)'); }); }); describe('isTranscriptNoise', () => { it('drops Whisper hallucinations on silence', () => { expect(isTranscriptNoise('(cliquant)')).toBe(true); expect(isTranscriptNoise('*Claire*')).toBe(true); expect(isTranscriptNoise('[Musique]')).toBe(true); expect(isTranscriptNoise('...')).toBe(true); expect(isTranscriptNoise("Sous-titres réalisés par la communauté d'Amara.org")).toBe(true); }); it('keeps real sentences', () => { expect(isTranscriptNoise('Jarvis, allume la lumière du salon.')).toBe(false); expect(isTranscriptNoise('(Jarvis) quelle heure est-il maintenant ?')).toBe(false); expect(isTranscriptNoise('Oui')).toBe(false); }); });