import mermaid from './mermaid'; import { mermaidAPI } from './mermaidAPI'; import flowDb from './diagrams/flowchart/flowDb'; import flowParser from './diagrams/flowchart/parser/flow'; const spyOn = jest.spyOn; // mocks the mermaidAPI.render function (see `./__mocks__/mermaidAPI`) jest.mock('./mermaidAPI'); afterEach(() => { jest.restoreAllMocks(); }); describe('when using mermaid and ', function () { describe('when detecting chart type ', function () { it('should not start rendering with mermaid.startOnLoad set to false', function () { mermaid.startOnLoad = false; document.body.innerHTML = '
graph TD;\na;
'; spyOn(mermaid, 'init'); mermaid.contentLoaded(); expect(mermaid.init).not.toHaveBeenCalled(); }); it('should start rendering with both startOnLoad set', function () { mermaid.startOnLoad = true; document.body.innerHTML = '
graph TD;\na;
'; spyOn(mermaid, 'init'); mermaid.contentLoaded(); expect(mermaid.init).toHaveBeenCalled(); }); it('should start rendering with mermaid.startOnLoad', function () { mermaid.startOnLoad = true; document.body.innerHTML = '
graph TD;\na;
'; spyOn(mermaid, 'init'); mermaid.contentLoaded(); expect(mermaid.init).toHaveBeenCalled(); }); it('should start rendering as a default with no changes performed', function () { document.body.innerHTML = '
graph TD;\na;
'; spyOn(mermaid, 'init'); mermaid.contentLoaded(); expect(mermaid.init).toHaveBeenCalled(); }); }); describe('when using #initThrowsErrors', function () { it('should accept single node', async () => { const node = document.createElement('div'); node.appendChild(document.createTextNode('graph TD;\na;')); mermaid.initThrowsErrors(undefined, node); expect(mermaidAPI.render).toHaveBeenCalled(); }); }); describe('checking validity of input ', function () { beforeEach(function () { flowParser.parser.yy = flowDb; flowDb.clear(); flowDb.setGen('gen-2'); }); it('should throw for an invalid definition', function () { expect(() => mermaid.parse('this is not a mermaid diagram definition')).toThrow(); }); it('should not throw for a valid flow definition', function () { expect(() => mermaid.parse('graph TD;A--x|text including URL space|B;')).not.toThrow(); }); it('should throw for an invalid flow definition', function () { expect(() => mermaid.parse('graph TQ;A--x|text including URL space|B;')).toThrow(); }); it('should not throw for a valid sequenceDiagram definition', function () { const text = 'sequenceDiagram\n' + 'Alice->Bob: Hello Bob, how are you?\n\n' + '%% Comment\n' + 'Note right of Bob: Bob thinks\n' + 'alt isWell\n\n' + 'Bob-->Alice: I am good thanks!\n' + 'else isSick\n' + 'Bob-->Alice: Feel sick...\n' + 'end'; expect(() => mermaid.parse(text)).not.toThrow(); }); it('should throw for an invalid sequenceDiagram definition', function () { const text = 'sequenceDiagram\n' + 'Alice:->Bob: Hello Bob, how are you?\n\n' + '%% Comment\n' + 'Note right of Bob: Bob thinks\n' + 'alt isWell\n\n' + 'Bob-->Alice: I am good thanks!\n' + 'else isSick\n' + 'Bob-->Alice: Feel sick...\n' + 'end'; expect(() => mermaid.parse(text)).toThrow(); }); it('should return false for invalid definition WITH a parseError() callback defined', function () { let parseErrorWasCalled = false; mermaid.setParseErrorHandler(() => { parseErrorWasCalled = true; }); expect(mermaid.parse('this is not a mermaid diagram definition')).toEqual(false); expect(parseErrorWasCalled).toEqual(true); }); }); });