/** * Tests for MarkdownContent component. */ import { describe, it, expect } from 'vitest' import { render, screen } from '@testing-library/react' import { axe } from 'vitest-axe' import { MarkdownContent } from './markdown-content' describe('MarkdownContent', () => { it('renders plain text', () => { render() expect(screen.getByText('Hello world')).toBeInTheDocument() }) it('renders bold text', () => { const { container } = render() const strong = container.querySelector('strong') expect(strong).toBeInTheDocument() expect(strong).toHaveTextContent('bold') }) it('renders italic text', () => { const { container } = render() const em = container.querySelector('em') expect(em).toBeInTheDocument() expect(em).toHaveTextContent('italic') }) it('renders links with target and rel attributes', () => { render() const link = screen.getByRole('link', { name: 'Example' }) expect(link).toHaveAttribute('href', 'https://example.com') expect(link).toHaveAttribute('rel', expect.stringContaining('noopener')) }) it('renders code blocks', () => { const { container } = render() const code = container.querySelector('code') expect(code).toBeInTheDocument() expect(code).toHaveTextContent('const x = 1;') }) it('renders inline code', () => { const { container } = render() const code = container.querySelector('code') expect(code).toBeInTheDocument() expect(code).toHaveTextContent('npm install') }) it('renders unordered lists', () => { const { container } = render() const list = container.querySelector('ul') expect(list).toBeInTheDocument() const items = container.querySelectorAll('li') expect(items.length).toBe(3) }) it('strips dangerous HTML (XSS prevention)', () => { const { container } = render( ) expect(container.querySelector('script')).not.toBeInTheDocument() expect(screen.getByText('Safe content')).toBeInTheDocument() }) it('strips event handler attributes', () => { const { container } = render( ) const img = container.querySelector('img') if (img) { expect(img.getAttribute('onerror')).toBeNull() } }) it('applies prose styling class', () => { const { container } = render() const wrapper = container.firstChild as HTMLElement expect(wrapper.className).toContain('prose') }) it('passes axe accessibility check', async () => { const { container } = render( ) const results = await axe(container) expect(results).toHaveNoViolations() }) })