Files
SRCmail/lib/__tests__/html-to-text.test.ts

58 lines
2.1 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { htmlToPlainText } from '../html-to-text';
describe('htmlToPlainText', () => {
it('preserves line breaks from <br> within a paragraph', () => {
expect(htmlToPlainText('<p>Line 1.<br>Line 2.</p>')).toBe('Line 1.\nLine 2.');
});
it('separates block elements with newlines instead of running them together (#421)', () => {
// The previous textContent-based implementation produced "Line 1.Line 2.Paragraph 2."
expect(htmlToPlainText('<div>Line 1.</div><div>Line 2.</div><div>Paragraph 2.</div>')).toBe(
'Line 1.\nLine 2.\nParagraph 2.'
);
});
it('with paragraphSpacing, separates paragraphs with a blank line', () => {
expect(
htmlToPlainText('<p>Line 1.<br>Line 2.</p><p>Paragraph 2.</p>', { paragraphSpacing: true })
).toBe('Line 1.\nLine 2.\n\nParagraph 2.');
});
it('without paragraphSpacing, separates paragraphs with a single newline', () => {
expect(htmlToPlainText('<p>A</p><p>B</p>')).toBe('A\nB');
});
it('renders links as text when the text equals the href', () => {
expect(
htmlToPlainText('<p><a href="mailto:alice@example.com">alice@example.com</a></p>')
).toBe('alice@example.com');
});
it('renders links as "text <href>" when they differ', () => {
expect(htmlToPlainText('<p>Visit <a href="https://example.com">our site</a></p>')).toBe(
'Visit our site <https://example.com>'
);
});
it('collapses excess whitespace and trims the result', () => {
expect(htmlToPlainText(' <p> Hello world </p> ')).toBe('Hello world');
});
it('caps consecutive blank lines at one', () => {
expect(htmlToPlainText('<p>A</p><br><br><br><p>B</p>', { paragraphSpacing: true })).toBe(
'A\n\nB'
);
});
it('returns an empty string for empty or whitespace-only HTML', () => {
expect(htmlToPlainText('')).toBe('');
expect(htmlToPlainText(' <p> </p> ')).toBe('');
});
it('handles nested lists as separate lines', () => {
expect(htmlToPlainText('<ul><li>One</li><li>Two</li></ul>')).toBe('One\nTwo');
});
});