import { describe, it, expect } from 'vitest'; import { renderMarkdown } from '../utils/markdown-lite'; describe('renderMarkdown', () => { it('returns empty string for empty input', () => { expect(renderMarkdown('')).toBe(''); }); it('wraps plain text in

', () => { expect(renderMarkdown('Hello world')).toBe('

Hello world

'); }); it('creates separate paragraphs on blank lines', () => { const result = renderMarkdown('First\n\nSecond'); expect(result).toContain('

First

'); expect(result).toContain('

Second

'); }); it('renders headings (level + 1, h1 reserved)', () => { expect(renderMarkdown('## Heading 2')).toContain('

Heading 2

'); expect(renderMarkdown('### Heading 3')).toContain('

Heading 3

'); expect(renderMarkdown('#### Heading 4')).toContain('
Heading 4
'); }); it('renders bold text', () => { expect(renderMarkdown('some **bold** text')).toContain('bold'); }); it('renders italic text', () => { expect(renderMarkdown('some *italic* text')).toContain('italic'); }); it('renders inline code', () => { expect(renderMarkdown('use `code` here')).toContain('code'); }); it('renders markdown links', () => { const result = renderMarkdown('[label](https://example.com)'); expect(result).toContain('label'); }); it('strips dangerous schemes from markdown links (XSS defense)', () => { const out1 = renderMarkdown('[click](javascript:alert(1))'); expect(out1).not.toContain('javascript:'); expect(out1).not.toContain('alert(1))'); expect(out2).not.toContain('data:'); expect(out2).not.toContain(' { const out = renderMarkdown('[link](https://example.com)'); expect(out).toContain('rel="noopener"'); expect(out).toContain('target="_blank"'); }); it('renders unordered lists', () => { const result = renderMarkdown('- one\n- two'); expect(result).toContain('