import { MarkdownNodeType } from '../common'; import { render, screen } from '../test-utils'; import Markdown from './Markdown'; const list = `* list * list`; const sublist = `- sublist - sublist`; const listOut = ``; const sublistOut = ``; describe('Markdown', () => { describe('default behaviour', () => { const input = { headingOne: '# Heading', headingTwo: '## Heading', headingThree: '### Heading', emph: '**Bold**', list, sublist, }; const output = { headingOne: '

Heading

', headingTwo: '

Heading

', headingThree: '

Heading

', emph: 'Bold', list: listOut, sublist: sublistOut, }; const nodeTypes = Object.keys(input) as (keyof typeof input)[]; nodeTypes.forEach((type) => { it('parses markdown content', () => { const { container } = render({input[type]}); expect(container).toContainHTML(output[type]); }); }); it('strips unsafe values', () => { const testValue = ``; const { container } = render({testValue}); expect(container).toContainHTML(''); }); }); describe('allowList', () => { let container; const allowList = [MarkdownNodeType.HEADING, MarkdownNodeType.STRONG]; it('marks up all types in the allowList', () => { ({ container } = render(# Heading)); expect(container).toContainHTML('

Heading

'); ({ container } = render(**Bold**)); expect(container).toContainHTML('Bold'); }); it('strips all markdown from types not in the allowList', () => { ({ container } = render({list})); expect(container).not.toContainHTML(listOut); expect(container).toContainHTML('listlist'); ({ container } = render({sublist})); expect(container).not.toContainHTML(sublistOut); expect(container).toContainHTML('sublistsublist'); }); }); describe('blockList', () => { let container; const blockList = [MarkdownNodeType.HEADING, MarkdownNodeType.STRONG]; it('strips all markdown from types in the blockList', () => { ({ container } = render(# Heading)); expect(container).not.toContainHTML('

Heading

'); expect(container).toContainHTML('Heading'); ({ container } = render(## Heading)); expect(container).not.toContainHTML('

Heading

'); expect(container).toContainHTML('Heading'); ({ container } = render(**Bold**)); expect(container).not.toContainHTML('Bold'); expect(container).toContainHTML('Bold'); }); it('marks up all types not the blockList', () => { ({ container } = render({list})); expect(container).toContainHTML(listOut); ({ container } = render({sublist})); expect(container).toContainHTML(sublistOut); }); }); describe('config.link.target', () => { it('adds a target=_blank attribute when specified', () => { render( {`# Heading - [first link](./first-link) - [second link](./second-link) `}, ); expect(screen.getByText('first link').closest('a')).toHaveAttribute('target', '_blank'); expect(screen.getByText('second link').closest('a')).toHaveAttribute('target', '_blank'); }); }); describe('config.paragraph.className', () => { it('adds a custom class when specified', () => { render( {`# Heading This is a paragraph `}, ); expect(screen.getByText('This is a paragraph').closest('p')).toHaveAttribute( 'class', 'm-b-0', ); }); }); it('adds a target=_self attribute when nothing specified', () => { render( {`# Heading - [first link](./first-link) - [second link](./second-link) `}, ); expect(screen.getByText('first link').closest('a')).toHaveAttribute('target', '_self'); expect(screen.getByText('second link').closest('a')).toHaveAttribute('target', '_self'); }); });