import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest'; import { htmlToMarkdown, downloadMarkdownFile, SAMPLE_HTML } from '../htmlToMarkdown'; describe('htmlToMarkdown', () => { it('returns empty result for empty string', () => { const result = htmlToMarkdown(''); expect(result.markdown).toBe(''); expect(result.originalLength).toBe(0); expect(result.markdownLength).toBe(0); expect(result.hasError).toBe(false); }); it('returns empty result for whitespace-only string', () => { const result = htmlToMarkdown(' \n '); expect(result.markdown).toBe(''); expect(result.hasError).toBe(false); }); it('converts h1 heading', () => { const result = htmlToMarkdown('
This is a paragraph.
'); expect(result.markdown).toContain('This is a paragraph.'); }); it('converts strong and b tags', () => { const result = htmlToMarkdown('bold and also bold'); expect(result.markdown).toContain('**bold**'); expect(result.markdown).toContain('**also bold**'); }); it('converts em and i tags', () => { const result = htmlToMarkdown('italic and also italic'); expect(result.markdown).toContain('*italic*'); expect(result.markdown).toContain('*also italic*'); }); it('converts del and s tags', () => { const result = htmlToMarkdown('const x = 1;');
expect(result.markdown).toContain('`const x = 1;`');
});
it('converts pre code block', () => {
const result = htmlToMarkdown('line1\nline2');
expect(result.markdown).toContain('```');
expect(result.markdown).toContain('line1');
expect(result.markdown).toContain('line2');
});
it('converts pre code block with language', () => {
const result = htmlToMarkdown(
'const x = 1;',
);
expect(result.markdown).toContain('```javascript');
expect(result.markdown).toContain('const x = 1;');
});
it('converts anchor links', () => {
const result = htmlToMarkdown('Link text');
expect(result.markdown).toContain('[Link text](https://example.com)');
});
it('converts anchor links with title', () => {
const result = htmlToMarkdown('Link');
expect(result.markdown).toContain('[Link](https://example.com "Title")');
});
it('converts images', () => {
const result = htmlToMarkdown('
');
expect(result.markdown).toContain('');
});
it('converts images with title', () => {
const result = htmlToMarkdown('
');
expect(result.markdown).toContain('');
});
it('converts unordered list', () => {
const result = htmlToMarkdown(''); expect(result.markdown).toContain('> Quote text'); }); it('converts horizontal rule', () => { const result = htmlToMarkdown('Quote text
| Name | Type |
|---|---|
| John | User |
text
'); expect(result.markdown).not.toContain('alert'); expect(result.markdown).not.toContain('.x{}'); expect(result.markdown).toContain('text'); }); it('handles nested elements', () => { const result = htmlToMarkdown('bold and italic
'); expect(result.markdown).toContain('**bold**'); expect(result.markdown).toContain('*italic*'); }); it('returns hasError false for valid HTML', () => { const result = htmlToMarkdown('Valid
'); expect(result.hasError).toBe(false); expect(result.error).toBeUndefined(); }); it('returns correct length stats', () => { const html = 'Hello
'; const result = htmlToMarkdown(html); expect(result.originalLength).toBe(html.length); expect(result.markdownLength).toBe(result.markdown.length); }); it('handles full HTML document', () => { const result = htmlToMarkdown(SAMPLE_HTML); expect(result.hasError).toBe(false); expect(result.markdown).toContain('# 欢迎使用 HTML 转 Markdown'); expect(result.markdown).toContain('**HTML**'); expect(result.markdown).toContain('*Markdown*'); expect(result.markdown).toContain('```javascript'); expect(result.markdown).toContain('| 名称 | 类型 |'); expect(result.markdown).toContain('> 这是一段引用文本'); }); it('handles plain text without tags', () => { const result = htmlToMarkdown('Just plain text'); expect(result.markdown).toContain('Just plain text'); expect(result.hasError).toBe(false); }); it('handles task list items', () => { const result = htmlToMarkdown( 'Content