/** * Unit Tests - Markdown Utility * Tests markdown conversion, TOC extraction, front matter parsing, and slug generation */ const { markdownToHtml, extractTOC, extractFrontMatter, generateSlug } = require('../../src/utils/markdown.util'); describe('Markdown Utility', () => { describe('markdownToHtml', () => { test('should return empty string for null input', () => { expect(markdownToHtml(null)).toBe(''); }); test('should return empty string for undefined input', () => { expect(markdownToHtml(undefined)).toBe(''); }); test('should return empty string for empty string', () => { expect(markdownToHtml('')).toBe(''); }); test('should convert basic paragraph', () => { const markdown = 'This is a paragraph.'; const html = markdownToHtml(markdown); expect(html).toContain('

This is a paragraph.

'); }); test('should convert headings with IDs', () => { const markdown = '# Test Heading'; const html = markdownToHtml(markdown); expect(html).toContain('

Test Heading

'); }); test('should convert multiple heading levels', () => { const markdown = `# Heading 1 ## Heading 2 ### Heading 3`; const html = markdownToHtml(markdown); expect(html).toContain('

Heading 1

'); expect(html).toContain('

Heading 2

'); expect(html).toContain('

Heading 3

'); }); test('should generate slugs from headings with special characters', () => { const markdown = '# Test: Special Characters!'; const html = markdownToHtml(markdown); expect(html).toContain('id="test-special-characters"'); }); test('should convert bold text', () => { const markdown = '**bold text**'; const html = markdownToHtml(markdown); expect(html).toContain('bold text'); }); test('should convert italic text', () => { const markdown = '*italic text*'; const html = markdownToHtml(markdown); expect(html).toContain('italic text'); }); test('should convert inline code', () => { const markdown = '`code snippet`'; const html = markdownToHtml(markdown); expect(html).toContain('code snippet'); }); test('should convert code blocks with language', () => { const markdown = '```javascript\nconst x = 1;\n```'; const html = markdownToHtml(markdown); expect(html).toContain(' { const markdown = '```\nplain code\n```'; const html = markdownToHtml(markdown); expect(html).toContain(' { const markdown = `- Item 1 - Item 2 - Item 3`; const html = markdownToHtml(markdown); expect(html).toContain(''); }); test('should convert ordered lists', () => { const markdown = `1. First 2. Second 3. Third`; const html = markdownToHtml(markdown); expect(html).toContain('
    '); expect(html).toContain('
  1. First
  2. '); expect(html).toContain('
  3. Second
  4. '); expect(html).toContain('
  5. Third
  6. '); expect(html).toContain('
'); }); test('should convert links', () => { const markdown = '[Link Text](https://example.com)'; const html = markdownToHtml(markdown); expect(html).toContain('Link Text'); }); test('should convert images', () => { const markdown = '![Alt Text](https://example.com/image.png)'; const html = markdownToHtml(markdown); expect(html).toContain(' { const markdown = '> This is a quote'; const html = markdownToHtml(markdown); expect(html).toContain('
'); expect(html).toContain('This is a quote'); expect(html).toContain('
'); }); test('should convert tables', () => { const markdown = `| Header 1 | Header 2 | |----------|----------| | Cell 1 | Cell 2 |`; const html = markdownToHtml(markdown); expect(html).toContain(''); expect(html).toContain(''); expect(html).toContain(''); expect(html).toContain(''); expect(html).toContain(''); }); test('should sanitize dangerous HTML (XSS protection)', () => { const markdown = ''; const html = markdownToHtml(markdown); // Script tags should be removed expect(html).not.toContain('
Header 1Cell 1