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');
});
});