const renderMarkdownFactory = require('./renderMarkdown'); describe('remark: renderMarkdown service', () => { let renderMarkdown; beforeEach(() => { renderMarkdown = renderMarkdownFactory(); }); it('should convert markdown to HTML', () => { const content = '# heading 1\n' + '\n' + 'A paragraph with **bold** and _italic_.\n' + '\n' + '* List item 1\n' + '* List item 2'; const output = renderMarkdown(content); expect(output).toEqual( '

heading 1

\n' + '

A paragraph with bold and italic.

\n' + '\n'); }); it('should not process markdown inside inline tags', () => { const content = '* list item {@link some_url_path}'; const output = renderMarkdown(content); expect(output).toEqual('\n'); }); it('should not put block level inline tags inside paragraphs', () => { const content = 'A paragraph.\n' + '\n' + '{@example blah **blah** blah }\n' + '\n' + 'Another paragraph {@link _containing_ } an inline tag'; const output = renderMarkdown(content); expect(output).toEqual( '

A paragraph.

\n' + '{@example blah **blah** blah }\n' + '

Another paragraph {@link _containing_ } an inline tag

\n'); }); it('should not format the contents of tags marked as unformatted ', () => { const content = '\n\n **abc**\n\n def\n\n\n\n\n **abc**\n\n def\n'; const output = renderMarkdown(content); expect(output).toEqual('\n\n **abc**\n\n def\n\n\n\n **abc**\n\n def\n\n'); }); it('should handle recursive tags marked as unformatted', () => { const content = '\n\n \n\n **abc**\n\n def\n\n\n\n\n\nhij\n\n\n\nklm'; const output = renderMarkdown(content); expect(output).toEqual('\n\n \n\n **abc**\n\n def\n\n\n\n\n

hij

\n\n\nklm\n'); }); it('should raise an error if a tag marked as unformatted is not closed', () => { const content = '\n\n **abc**\n\n def\n\n\n\n\n **abc**\n\n def\n'; expect(() => renderMarkdown(content)).toThrowError('Unmatched plain HTML block tag '); }); it('should not remove spaces after anchor tags', () => { var input = 'A aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa aaaaaaaaaaa\n' + '[foo](path/to/foo) bbb.'; var output = '

' + 'A aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa aaaaaaaaaaa\n' + 'foo bbb.' + '

\n'; expect(renderMarkdown(input)).toEqual(output); }); it('should not format indented text as code', () => { const content = 'some text\n\n indented text\n\nother text'; const output = renderMarkdown(content); expect(output).toEqual('

some text

\n

indented text

\n

other text

\n'); }); it('should format triple backtick code blocks as `code-example` tags', () => { const content = '```ts\n' + ' class MyClass {\n' + ' method1() { ... }\n' + ' }\n' + '```'; const output = renderMarkdown(content); expect(output).toEqual( '\n' + ' class MyClass {\n' + ' method1() { ... }\n' + ' }\n' + '\n' ); }); it('should map heading levels as specified', () => { const content = '# heading 1\n' + '\n' + 'some paragraph\n' + '\n' + '## heading 2a\n' + '\n' + 'some paragraph\n' + '\n' + '### heading 3\n' + '\n' + 'some paragraph\n' + '\n' + '## heading 2b\n' + '\n' + 'some paragraph\n' + '\n'; const headingMappings = { h2: 'h3', h3: 'h5' }; const output = renderMarkdown(content, headingMappings); expect(output).toEqual( '

heading 1

\n' + '

some paragraph

\n' + '

heading 2a

\n' + '

some paragraph

\n' + '
heading 3
\n' + '

some paragraph

\n' + '

heading 2b

\n' + '

some paragraph

\n' ); }); });