2022-06-21 17:19:12 +05:30
|
|
|
import { render } from '~/lib/gfm';
|
|
|
|
|
|
|
|
describe('gfm', () => {
|
2022-08-13 15:12:31 +05:30
|
|
|
const markdownToAST = async (markdown, skipRendering = []) => {
|
2022-07-23 23:45:48 +05:30
|
|
|
let result;
|
|
|
|
|
|
|
|
await render({
|
|
|
|
markdown,
|
2022-08-13 15:12:31 +05:30
|
|
|
skipRendering,
|
2022-07-23 23:45:48 +05:30
|
|
|
renderer: (tree) => {
|
|
|
|
result = tree;
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
return result;
|
|
|
|
};
|
|
|
|
|
|
|
|
const expectInRoot = (result, ...nodes) => {
|
|
|
|
expect(result).toEqual(
|
|
|
|
expect.objectContaining({
|
|
|
|
children: expect.arrayContaining(nodes),
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
2022-06-21 17:19:12 +05:30
|
|
|
describe('render', () => {
|
|
|
|
it('processes Commonmark and provides an ast to the renderer function', async () => {
|
2022-07-23 23:45:48 +05:30
|
|
|
const result = await markdownToAST('This is text');
|
2022-06-21 17:19:12 +05:30
|
|
|
|
|
|
|
expect(result.type).toBe('root');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('transforms raw HTML into individual nodes in the AST', async () => {
|
2022-07-23 23:45:48 +05:30
|
|
|
const result = await markdownToAST('<strong>This is bold text</strong>');
|
2022-06-21 17:19:12 +05:30
|
|
|
|
2022-07-23 23:45:48 +05:30
|
|
|
expectInRoot(
|
|
|
|
result,
|
|
|
|
expect.objectContaining({
|
|
|
|
children: expect.arrayContaining([
|
|
|
|
expect.objectContaining({
|
|
|
|
type: 'element',
|
|
|
|
tagName: 'strong',
|
|
|
|
}),
|
|
|
|
]),
|
|
|
|
}),
|
|
|
|
);
|
2022-06-21 17:19:12 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
it('returns the result of executing the renderer function', async () => {
|
2022-07-16 23:28:13 +05:30
|
|
|
const rendered = { value: 'rendered tree' };
|
|
|
|
|
2022-06-21 17:19:12 +05:30
|
|
|
const result = await render({
|
|
|
|
markdown: '<strong>This is bold text</strong>',
|
|
|
|
renderer: () => {
|
2022-07-16 23:28:13 +05:30
|
|
|
return rendered;
|
2022-06-21 17:19:12 +05:30
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2022-07-16 23:28:13 +05:30
|
|
|
expect(result).toEqual(rendered);
|
2022-06-21 17:19:12 +05:30
|
|
|
});
|
2022-07-23 23:45:48 +05:30
|
|
|
|
2022-08-13 15:12:31 +05:30
|
|
|
describe('when skipping the rendering of footnote reference and definition nodes', () => {
|
|
|
|
it('transforms footnotes into footnotedefinition and footnotereference tags', async () => {
|
|
|
|
const result = await markdownToAST(
|
|
|
|
`footnote reference [^footnote]
|
2022-07-23 23:45:48 +05:30
|
|
|
|
|
|
|
[^footnote]: Footnote definition`,
|
2022-08-13 15:12:31 +05:30
|
|
|
['footnoteReference', 'footnoteDefinition'],
|
|
|
|
);
|
2022-07-23 23:45:48 +05:30
|
|
|
|
2022-08-13 15:12:31 +05:30
|
|
|
expectInRoot(
|
|
|
|
result,
|
|
|
|
expect.objectContaining({
|
|
|
|
children: expect.arrayContaining([
|
|
|
|
expect.objectContaining({
|
|
|
|
type: 'element',
|
|
|
|
tagName: 'footnotereference',
|
|
|
|
properties: {
|
|
|
|
identifier: 'footnote',
|
|
|
|
label: 'footnote',
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
]),
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
|
|
|
|
expectInRoot(
|
|
|
|
result,
|
|
|
|
expect.objectContaining({
|
|
|
|
tagName: 'footnotedefinition',
|
|
|
|
properties: {
|
|
|
|
identifier: 'footnote',
|
|
|
|
label: 'footnote',
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('when skipping the rendering of code blocks', () => {
|
|
|
|
it('transforms code nodes into codeblock html tags', async () => {
|
|
|
|
const result = await markdownToAST(
|
|
|
|
`
|
|
|
|
\`\`\`javascript
|
|
|
|
console.log('Hola');
|
|
|
|
\`\`\`\
|
|
|
|
`,
|
|
|
|
['code'],
|
2022-07-23 23:45:48 +05:30
|
|
|
);
|
|
|
|
|
|
|
|
expectInRoot(
|
|
|
|
result,
|
|
|
|
expect.objectContaining({
|
2022-08-13 15:12:31 +05:30
|
|
|
tagName: 'codeblock',
|
2022-07-23 23:45:48 +05:30
|
|
|
properties: {
|
2022-08-13 15:12:31 +05:30
|
|
|
language: 'javascript',
|
2022-07-23 23:45:48 +05:30
|
|
|
},
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
});
|
2022-06-21 17:19:12 +05:30
|
|
|
});
|
|
|
|
});
|