const fs = require('fs'); const path = require('path'); const utils = require('./test_utils'); const dataDir = 'test_data'; const file = path.join(dataDir, 'test.md'); const config = { 'test': true, 'modules': { 'prism': true, 'mathjax': true, 'plantuml': true, 'fa-diagrams': true, }, 'showdown': { 'simplifiedAutoLink': true, 'smartIndentationFix': true }, 'mathjax': { 'output_format': 'html', 'speak_text': false }, 'plantuml': { 'output_format': 'svg' } }; const renderer = require('../src/renderer')(config); beforeEach(() => { config['modules']['prism'] = true; config['modules']['mathjax'] = true; config['modules']['plantuml'] = true; config['modules']['fa-diagrams'] = true; utils.deleteFolderSync(dataDir); fs.mkdirSync(dataDir); }); afterAll(() => { if (fs.existsSync(dataDir)) { utils.deleteFolderSync(dataDir); } }); describe('get parts', () => { test('normal', () => { const data = 'Hello\nthere\ngeneral\nkenobi'; const parts = renderer.getParts(data); expect(parts.map(p => p.text)).toEqual([ 'Hello\nthere\ngeneral\nkenobi' ]); }); test('lot of stuff', () => { const data = 'Hello\nthere\n```code```\ngeneral\n\n``````kenobi'; const parts = renderer.getParts(data); expect(parts).toEqual([ { index: 0, end: 12, text: 'Hello\nthere\n' }, { index: 22, end: 30, text: '\ngeneral' }, { index: 53, end: 54, text: '\n' }, { index: 78, end: 79, text: '\n' }, { index: 109, end: 115, text: 'kenobi' }, ]); }); }); describe('Test Showdown', () => { test('normal', (done) => { renderer.renderShowDown('# Hello', (html) => { expect(html).toBe('

Hello

'); done(); }); }); test('custom rules', (done) => { renderer.renderShowDown('www.google.com', (html) => { expect(html).toBe('

www.google.com

'); done(); }); }); test('code format', (done) => { renderer.renderShowDown('```python\nprint("hello")\n```\n\n```python\nprint("hello")\n```', (html) => { expect(html).toBe('
print("hello")\n
\n
print("hello")\n
'); done(); }); }); }); describe('Test Prism', () => { test('no prism', (done) => { config['modules']['prism'] = false; renderer.renderPrism('```python\nprint("hello")\n```\n\n```python\nprint("hello")\n```', (data) => { expect(data).toBe('```python\nprint("hello")\n```\n\n```python\nprint("hello")\n```'); done(); }); }); test('prism correct', (done) => { renderer.renderPrism('```python\nprint("hello")\n```', (data) => { expect(data).not.toBe('
print("hello")\n
'); expect(data.indexOf('
')).toBe(0);
            done();
        });
    });

    test('prism invalid lang', (done) => {
        renderer.renderPrism('```pythdon\nprint("hello")\n```', (data) => {
            expect(data).not.toBe('
print("hello")\n
'); expect(data.indexOf('
')).toBe(0);
            done();
        });
    });

    test('prism mutliple code blocks', (done) => {
        renderer.renderPrism('```python\n\n```\n```python\n\n```', (data) => {
            expect(data).toBe('
\n
'); done(); }); }); }); describe('Test PlantUML', () => { test('no plantuml', (done) => { config['modules']['plantuml'] = false; renderer.renderPlantUML('@startuml\nBob -> Alice : hello\n@enduml', (data) => { expect(data).toBe('@startuml\nBob -> Alice : hello\n@enduml'); done(); }); }); test('plantuml correct', (done) => { renderer.renderPlantUML('@startuml\nBob -> Alice : hello\n@enduml', (data) => { expect(data).toBe('generated PlantUML diagram'); done(); }); }); test('plantuml ignored in code', (done) => { renderer.renderPlantUML('code:\n```@startuml\nBob -> Alice : hello\n@enduml```\n ```@startuml``` @enduml', (data) => { expect(data).toBe('code:\n```@startuml\nBob -> Alice : hello\n@enduml```\n ```@startuml``` @enduml'); done(); }); }); test('plantuml multiple uml', (done) => { renderer.renderPlantUML('@startuml\nBob -> Alice : hello\n@enduml\n@startuml\nBob -> Alice : hello\n@enduml', (data) => { expect(data).toBe('generated PlantUML diagram\ngenerated PlantUML diagram'); done(); }); }); }); describe('Test MathJax', () => { test('no mathjax', (done) => { config['modules']['mathjax'] = false; renderer.renderMathJax('$$\nhello\n$$\ntest$test$', (data) => { expect(data).toBe('$$\nhello\n$$\ntest$test$'); done(); }); }); test('full eq', (done) => { renderer.renderMathJax('$$\n\nA\n\n$$', (data) => { expect(data).toBe('' + '' + '' + 'A' + ''); done(); }); }); test('inline eq', (done) => { renderer.renderMathJax('start $a$ end', (data) => { expect(data).toBe('start ' + '' + '' + '' + 'a' + '' + ' end'); done(); }); }); test('fake inline eq', (done) => { renderer.renderMathJax('i have $6\nyou have $5', (data) => { expect(data).toBe('i have $6\nyou have $5'); done(); }); }); test('no eq in code / script', (done) => { renderer.renderMathJax('this code is ```start $a$ end $$hello$$``` beautiful \n```$no eq$```', (data) => { expect(data).toBe('this code is ```start $a$ end $$hello$$``` beautiful \n```$no eq$```'); done(); }); }); test('multiple eq', (done) => { renderer.renderMathJax('$$\n\nA\n\n$$\nstart $a$ end\n$$\n\nA\n\n$$', (data) => { expect(data).toBe('' + '' + '' + '' + 'A' + '\n' + 'start ' + '' + '' + '' + 'a' + '' + ' end\n' + '' + '' + '' + 'A' + ''); done(); }); }); }); describe('Test fa-diagrams', () => { test('no fa-diagrams', (done) => { config['modules']['fa-diagrams'] = false; renderer.renderFaDiagrams('@startfad\noptions.rendering.color=\'red\'\n@endfad', (data) => { expect(data).toBe('@startfad\noptions.rendering.color=\'red\'\n@endfad'); done(); }); }); test('no fa-diagrams in code', (done) => { renderer.renderFaDiagrams('code:\n```\n@startfad\noptions.rendering.color=\'red\'\n@endfad\n```', (data) => { expect(data).toBe('code:\n```\n@startfad\noptions.rendering.color=\'red\'\n@endfad\n```'); done(); }); }); test('valid fa-diagrams', (done) => { renderer.renderFaDiagrams('before\n@startfad\noptions.rendering.color=\'red\'\n@endfad\nafter', (data) => { expect(data).toBe('before\n\nafter'); done(); }); }); test('invalid toml', (done) => { renderer.renderFaDiagrams('before\n@startfad\noptions.rendering.color=red\n@endfad\nafter', (data) => { expect(data).toBe('before\nTomlError: Unexpected character, expecting string, number, datetime, boolean, inline array or inline table at row 1, col 26, pos 25:\n' + '1> options.rendering.color=red\n' + ' ^\n' + '\n\nafter'); done(); }); }); }); describe('Test render', () => { test('invalid file', (done) => { renderer.render('invalid file', (err, html) => { expect(err).not.toBeNull(); expect(html).not.toBeDefined(); done(); }); }); test('normal file', (done) => { fs.writeFileSync(file, '# Hello'); renderer.render(file, (err, html) => { expect(err).toBeNull(); expect(html).toBe('

Hello

'); done(); }); }); });