import { render } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; import { MarkdownMessage } from './MarkdownMessage'; import React from 'react'; describe('MarkdownMessage', () => { it('renders bold text correctly', () => { const { container } = render(); const strong = container.querySelector('strong'); expect(strong).toBeInTheDocument(); expect(strong?.textContent).toBe('bold'); }); it('renders links correctly', () => { const { container } = render(); const link = container.querySelector('a'); expect(link).toBeInTheDocument(); expect(link).toHaveAttribute('href', 'https://google.com'); expect(link?.textContent).toBe('Google'); }); it('renders h1 headers correctly', () => { const { container } = render(); console.log('H1 HTML Output:', container.innerHTML); expect(container.querySelector('h1')).toBeInTheDocument(); }); it('renders h2 headers correctly', () => { const { container } = render(); console.log('H2 HTML Output:', container.innerHTML); expect(container.querySelector('h2')).toBeInTheDocument(); }); it('renders h4 headers correctly', () => { const { container } = render(); expect(container.querySelector('h4')).toBeInTheDocument(); }); it('renders a fenced code block via CodeBlock, without leaking stray backticks', () => { const { container } = render( ); expect(container.textContent).not.toContain('`'); // react-syntax-highlighter splits the string across many spans, so match // on textContent rather than a single node's text. expect(container.textContent).toContain('def greet():'); }); it('does not mangle special markdown characters inside a fenced code block', () => { const { container } = render(); expect(container.querySelector('strong')).not.toBeInTheDocument(); expect(container.querySelector('em')).not.toBeInTheDocument(); expect(container.textContent).toContain('x = a**2 + _b_'); }); it('renders text before and after a fenced code block as separate segments', () => { const { container } = render( ); expect(container.textContent).toContain('Before'); expect(container.textContent).toContain('const x = 1;'); expect(container.textContent).toContain('After'); }); it('renders blockquotes correctly', () => { const { container } = render(); const quote = container.querySelector('blockquote'); expect(quote).toBeInTheDocument(); expect(quote?.textContent).toBe('A quoted line'); }); it('renders multi-line blockquotes as a single element', () => { const { container } = render(); const quotes = container.querySelectorAll('blockquote'); expect(quotes).toHaveLength(1); expect(quotes[0].innerHTML).toContain('Line one'); expect(quotes[0].innerHTML).toContain('Line two'); }); it('renders strikethrough correctly', () => { const { container } = render(); const del = container.querySelector('del'); expect(del).toBeInTheDocument(); expect(del?.textContent).toBe('deleted'); }); it('renders a GFM table correctly', () => { const { container } = render( ); expect(container.querySelector('table')).toBeInTheDocument(); expect(container.querySelectorAll('th')).toHaveLength(2); expect(container.querySelectorAll('td')).toHaveLength(2); }); it('renders a "*"-marker bullet list correctly, not as literal asterisks', () => { const { container } = render( ); const items = container.querySelectorAll('ul > li'); expect(items).toHaveLength(3); expect(items[0].textContent).toBe('Primeiro item'); expect(container.textContent).not.toContain('*'); }); it('renders bold terms inside a "*"-marker bullet list without leaking the leading asterisk', () => { const { container } = render( = 18.' } /> ); const items = container.querySelectorAll('ul > li'); expect(items).toHaveLength(2); expect(items[0].querySelector('strong')?.textContent).toBe('Abrangência'); expect(items[0].textContent).toBe('Abrangência: Cobre desde primitivas de UI até temas.'); expect(container.textContent).not.toMatch(/^\*|[^*]\*[^*]/); }); it('does not let a bullet list\'s leading "*" pair up with real italics later in the item', () => { const { container } = render( ); const items = container.querySelectorAll('ul > li'); expect(items).toHaveLength(1); expect(items[0].querySelector('em')?.textContent).toBe('real italic'); expect(items[0].textContent).toBe('Item with real italic text inside it'); }); });