import { describe, it, expect } from 'vitest'; import { buildInitialHtml, htmlToPlainText, rewriteInlineImages } from '../compose-html'; describe('buildInitialHtml', () => { it('returns empty paragraph for plain compose', () => { expect(buildInitialHtml('compose')).toBe('
line two'); }); it('falls back to the email address when the sender has no name', () => { const html = buildInitialHtml('reply', { from: { email: 'a@b.com' }, body: 'hi', receivedAt: '2026-04-27T10:00:00Z', }); expect(html).toContain('a@b.com wrote:'); }); it('uses HTML body when present, stripping dangerous tags', () => { const html = buildInitialHtml('reply', { from: { email: 'x@y.com' }, body: 'fallback', htmlBody: 'safe
', }); expect(html).toContain('safe
'); expect(html).not.toContain('', }); expect(html).not.toContain(''); expect(html).toContain('<script>x</script>'); }); }); describe('htmlToPlainText', () => { it('returns empty string for empty input', () => { expect(htmlToPlainText('')).toBe(''); }); it('strips tags and decodes entities', () => { expect(htmlToPlainText('hello & world
')).toBe('hello & world'); }); it('converts
to newline', () => { expect(htmlToPlainText('a
b
c')).toBe('a\nb\nc'); }); it('treats block boundaries as newlines', () => { expect(htmlToPlainText('a
b
')).toBe('a\n\nb'); }); it('renders list items with bullet prefix', () => { expect(htmlToPlainText('')).toBe('• one\n• two'); }); it('collapses excessive blank lines', () => { expect(htmlToPlainText('
- one
- two
a
b
')).toBe('a\n\nb'); }); it('decodes to space', () => { expect(htmlToPlainText('hello world')).toBe('hello world'); }); }); describe('rewriteInlineImages', () => { it('returns input unchanged when no data-cid is present', () => { const html = 'hi
'; const out = rewriteInlineImages(html); expect(out.html).toBe(html); expect(out.usedCids).toEqual([]); }); it('rewrites data-cid images to cid: src and reports the CID', () => { const html = ''; const out = rewriteInlineImages(html); expect(out.html).toContain('src="cid:abc@x"'); expect(out.html).not.toContain('data-cid'); expect(out.html).not.toContain('data:image/png'); expect(out.usedCids).toEqual(['abc@x']); }); it('handles single-quoted attributes', () => { const html = `
`; const out = rewriteInlineImages(html); expect(out.html).toContain('src="cid:zzz"'); expect(out.usedCids).toEqual(['zzz']); }); it('preserves alt attribute on rewritten images', () => { const html = '
'; const out = rewriteInlineImages(html); expect(out.html).toContain('alt="my pic"'); }); it('reports each cid only once even if image referenced multiple times', () => { const html = '
'; const out = rewriteInlineImages(html); expect(out.usedCids).toEqual(['dup']); }); });