import { describe, it, expect } from 'vitest' import { useMarkdown } from '../../../app/composables/useMarkdown.js' describe('useMarkdown', () => { const { render } = useMarkdown() describe('XSS prevention', () => { it('strips script tags', () => { const result = render('Hello world') expect(result).not.toContain('') expect(result).toContain('Hello') expect(result).toContain('world') }) it('strips onerror attributes', () => { const result = render('') expect(result).not.toContain('onerror') }) it('strips onclick attributes', () => { const result = render('click') expect(result).not.toContain('onclick') }) it('strips iframe tags', () => { const result = render('') expect(result).not.toContain(' { const result = render('') expect(result).not.toContain(' { const result = render('') expect(result).not.toContain(' { const result = render('[click me](javascript:alert(1))') expect(result).not.toContain('javascript:') }) it('strips img tags (not in allowed list)', () => { const result = render('') expect(result).not.toContain(' { it('renders bold and italic', () => { const result = render('**bold** and *italic*') expect(result).toContain('bold') expect(result).toContain('italic') }) it('renders links with href', () => { const result = render('[Ghost Guild](https://ghostguild.org)') expect(result).toContain(' { for (let i = 1; i <= 6; i++) { const hashes = '#'.repeat(i) const result = render(`${hashes} Heading ${i}`) expect(result).toContain(``) } }) it('preserves code blocks', () => { const result = render('`inline code` and\n\n```\nblock code\n```') expect(result).toContain('') expect(result).toContain('') }) it('preserves blockquotes', () => { const result = render('> This is a quote') expect(result).toContain('') }) it('preserves lists', () => { const result = render('- item 1\n- item 2') expect(result).toContain('') expect(result).toContain('') }) it('preserves allowed attributes: href, target, rel, class', () => { // DOMPurify allows href on tags const result = render('[link](https://example.com)') expect(result).toContain('href=') }) }) describe('edge cases', () => { it('returns empty string for null', () => { expect(render(null)).toBe('') }) it('returns empty string for undefined', () => { expect(render(undefined)).toBe('') }) it('returns empty string for empty string', () => { expect(render('')).toBe('') }) }) })
') expect(result).toContain('') }) it('preserves blockquotes', () => { const result = render('> This is a quote') expect(result).toContain('') }) it('preserves lists', () => { const result = render('- item 1\n- item 2') expect(result).toContain('') expect(result).toContain('') }) it('preserves allowed attributes: href, target, rel, class', () => { // DOMPurify allows href on tags const result = render('[link](https://example.com)') expect(result).toContain('href=') }) }) describe('edge cases', () => { it('returns empty string for null', () => { expect(render(null)).toBe('') }) it('returns empty string for undefined', () => { expect(render(undefined)).toBe('') }) it('returns empty string for empty string', () => { expect(render('')).toBe('') }) }) })
') }) it('preserves blockquotes', () => { const result = render('> This is a quote') expect(result).toContain('') }) it('preserves lists', () => { const result = render('- item 1\n- item 2') expect(result).toContain('') expect(result).toContain('') }) it('preserves allowed attributes: href, target, rel, class', () => { // DOMPurify allows href on tags const result = render('[link](https://example.com)') expect(result).toContain('href=') }) }) describe('edge cases', () => { it('returns empty string for null', () => { expect(render(null)).toBe('') }) it('returns empty string for undefined', () => { expect(render(undefined)).toBe('') }) it('returns empty string for empty string', () => { expect(render('')).toBe('') }) }) })
') }) it('preserves lists', () => { const result = render('- item 1\n- item 2') expect(result).toContain('') expect(result).toContain('') }) it('preserves allowed attributes: href, target, rel, class', () => { // DOMPurify allows href on tags const result = render('[link](https://example.com)') expect(result).toContain('href=') }) }) describe('edge cases', () => { it('returns empty string for null', () => { expect(render(null)).toBe('') }) it('returns empty string for undefined', () => { expect(render(undefined)).toBe('') }) it('returns empty string for empty string', () => { expect(render('')).toBe('') }) }) })