import { describe, expect, it } from 'vitest'; import { htmlComposeBodyToPlainText, initialPlainTextMode, plainComposeBodyToHtml, plainTextToComposerHtml, } from '../compose-format'; import { QUOTED_BLOCK_START } from '../compose-html'; import { appendPlainTextSignature, buildEmbeddedSignatureHtml, containsEmbeddedSignature, plainTextBodyHasSignature, } from '../signature-utils'; const identity = { textSignature: 'Jane Doe\nACME' }; const opts = { separator: true }; describe('initialPlainTextMode', () => { it('keeps a reopened draft in the format it was written in', () => { expect(initialPlainTextMode({ htmlBody: '

Hi

', textBody: 'Hi' }, true)).toBe(false); expect(initialPlainTextMode({ textBody: 'Hi' }, false)).toBe(true); }); it('follows the setting for an empty draft and a new message', () => { expect(initialPlainTextMode({}, true)).toBe(true); expect(initialPlainTextMode(undefined, false)).toBe(false); }); }); describe('plainTextToComposerHtml', () => { it('makes paragraphs and line breaks and escapes markup', () => { expect(plainTextToComposerHtml('a \nline\n\nnext')).toBe('

a <b>
line

next

'); expect(plainTextToComposerHtml('')).toBe(''); }); }); describe('htmlComposeBodyToPlainText', () => { it('drops formatting', () => { expect(htmlComposeBodyToPlainText('

Hello there

', identity, opts)).toBe('Hello there'); }); it('turns a trailing embedded signature into the plain-text signature', () => { const html = `

Hello

${buildEmbeddedSignatureHtml(identity, opts)}`; const text = htmlComposeBodyToPlainText(html, identity, opts); expect(text).toBe(appendPlainTextSignature('Hello', identity, opts)); expect(plainTextBodyHasSignature(text, identity)).toBe(true); }); it('keeps a signature placed above the quote above the quote', () => { const html = `

Hello

${buildEmbeddedSignatureHtml(identity, opts)}${QUOTED_BLOCK_START}

On Monday, Bob wrote:

Old
`; expect(htmlComposeBodyToPlainText(html, identity, opts)) .toBe('Hello\n\n-- \nJane Doe\nACME\n\nOn Monday, Bob wrote:\n\nOld'); }); }); describe('plainComposeBodyToHtml', () => { it('turns a trailing plain-text signature into the embedded one', () => { const html = plainComposeBodyToHtml(appendPlainTextSignature('Hello', identity, opts), identity, opts); expect(html).toBe(`

Hello

${buildEmbeddedSignatureHtml(identity, opts)}`); expect(containsEmbeddedSignature(html)).toBe(true); }); it('keeps a signature above the quote in place', () => { const text = 'Hello\n\n-- \nJane Doe\nACME\n\nOn Monday, Bob wrote:\n> Old'; expect(plainComposeBodyToHtml(text, identity, opts)) .toBe(`

Hello

${buildEmbeddedSignatureHtml(identity, opts)}

On Monday, Bob wrote:
> Old

`); }); it('gives a signature-only body an empty first paragraph to type into', () => { const html = plainComposeBodyToHtml(appendPlainTextSignature('', identity, opts), identity, opts); expect(html).toBe(`


${buildEmbeddedSignatureHtml(identity, opts)}`); }); it('converts a body without a signature as plain paragraphs', () => { expect(plainComposeBodyToHtml('Hi', null, opts)).toBe('

Hi

'); expect(plainComposeBodyToHtml('', identity, opts)).toBe('


'); }); it('round-trips the signature without doubling it', () => { const start = `

Hello

${buildEmbeddedSignatureHtml(identity, opts)}`; const back = plainComposeBodyToHtml(htmlComposeBodyToPlainText(start, identity, opts), identity, opts); expect(back).toBe(start); }); });