'use strict'; var TestContainer = require('mocha-test-container-support'); var Diagram = require('diagram-js/lib/Diagram'); var Viewer = require('../../lib/Viewer'); var inherits = require('inherits'); describe('Viewer', function() { var container; beforeEach(function() { container = TestContainer.get(this); }); function createViewer(xml, done) { var viewer = new Viewer({ container: container }); viewer.importXML(xml, function(err, warnings) { done(err, warnings, viewer); }); } it('should import simple process', function(done) { var xml = require('../fixtures/bpmn/simple.bpmn'); createViewer(xml, done); }); it('should re-import simple process', function(done) { var xml = require('../fixtures/bpmn/simple.bpmn'); // given createViewer(xml, function(err, warnings, viewer) { if (err) { return done(err); } // when // mimic re-import of same diagram viewer.importXML(xml, function(err, warnings) { if (err) { return done(err); } // then expect(warnings.length).to.equal(0); done(); }); }); }); it('should be instance of Diagram', function() { // when var viewer = new Viewer({ container: container }); // then expect(viewer).to.be.instanceof(Diagram); }); describe('defaults', function() { it('should use as default parent', function(done) { var xml = require('../fixtures/bpmn/simple.bpmn'); var viewer = new Viewer(); viewer.importXML(xml, function(err, warnings) { expect(viewer.container.parentNode).to.equal(document.body); done(err, warnings); }); }); }); describe('import events', function() { it('should fire events', function(done) { // given var viewer = new Viewer({ container: container }); var xml = require('../fixtures/bpmn/simple.bpmn'); var events = []; viewer.on('import.start', function() { events.push('import.start'); }); viewer.on('import.success', function() { events.push('import.success'); }); viewer.on('import.error', function() { events.push('import.error'); }); // when viewer.importXML(xml, function(err) { // then expect(events).to.eql([ 'import.start', 'import.success' ]); done(err); }); }); }); describe('overlay support', function() { it('should allow to add overlays', function(done) { var xml = require('../fixtures/bpmn/simple.bpmn'); createViewer(xml, function(err, warnings, viewer) { // when var overlays = viewer.get('overlays'), elementRegistry = viewer.get('elementRegistry'); // then expect(overlays).to.exist; expect(elementRegistry).to.exist; // when overlays.add('SubProcess_1', { position: { bottom: 0, right: 0 }, html: '
YUP GREAT STUFF!
' }); // then expect(overlays.get({ element: 'SubProcess_1' }).length).to.equal(1); done(err); }); }); }); describe('error handling', function() { function expectMessage(e, expectedMessage) { expect(e).to.exist; if (expectedMessage instanceof RegExp) { expect(e.message).to.match(expectedMessage); } else { expect(e.message).to.equal(expectedMessage); } } function expectWarnings(warnings, expected) { expect(warnings.length).to.equal(expected.length); warnings.forEach(function(w, idx) { expectMessage(w, expected[idx]); }); } it('should handle non-bpmn input', function(done) { var xml = 'invalid stuff'; createViewer(xml, function(err) { expect(err).to.exist; expectMessage(err, /Text data outside of root node./); done(); }); }); it('should handle invalid BPMNPlane#bpmnElement', function(done) { var xml = require('../fixtures/bpmn/error/di-plane-no-bpmn-element.bpmn'); // when createViewer(xml, function(err, warnings) { // then expect(err).not.to.exist; expectWarnings(warnings, [ 'unresolved reference ', 'no bpmnElement referenced in ', 'correcting missing bpmnElement ' + 'on ' + 'to ' ]); done(); }); }); it('should handle invalid namespaced element', function(done) { var xml = require('../fixtures/bpmn/error/categoryValue.bpmn'); // when createViewer(xml, function(err, warnings) { // then expect(err).not.to.exist; expectWarnings(warnings, [ /unparsable content detected/, 'unresolved reference ' ]); done(); }); }); it('should handle missing namespace', function(done) { var xml = require('../fixtures/bpmn/error/missing-namespace.bpmn'); // when createViewer(xml, function(err, warnings) { // then expect(err).to.exist; expect(err.message).to.eql('no process or collaboration to display'); expectWarnings(warnings, [ /unparsable content detected/, 'unresolved reference ', 'no bpmnElement referenced in ', 'no bpmnElement referenced in ' ]); done(); }); }); }); describe('dependency injection', function() { it('should provide self as ', function(done) { var xml = require('../fixtures/bpmn/simple.bpmn'); createViewer(xml, function(err, warnings, viewer) { expect(viewer.get('bpmnjs')).to.equal(viewer); done(err); }); }); it('should allow Diagram#get before import', function() { // when var viewer = new Viewer({ container: container }); // then var eventBus = viewer.get('eventBus'); expect(eventBus).to.exist; }); it('should keep references to services across re-import', function(done) { // given var someXML = require('../fixtures/bpmn/simple.bpmn'), otherXML = require('../fixtures/bpmn/basic.bpmn'); var viewer = new Viewer({ container: container }); var eventBus = viewer.get('eventBus'), canvas = viewer.get('canvas'); // when viewer.importXML(someXML, function() { // then expect(viewer.get('canvas')).to.equal(canvas); expect(viewer.get('eventBus')).to.equal(eventBus); viewer.importXML(otherXML, function() { // then expect(viewer.get('canvas')).to.equal(canvas); expect(viewer.get('eventBus')).to.equal(eventBus); done(); }); }); }); }); describe('export', function() { function currentTime() { return new Date().getTime(); } function isValid(svg) { var expectedStart = ''; var expectedEnd = ''; expect(svg.indexOf(expectedStart)).to.equal(0); expect(svg.indexOf(expectedEnd)).to.equal(svg.length - expectedEnd.length); // ensure correct rendering of SVG contents expect(svg.indexOf('undefined')).to.equal(-1); // expect header to be written only once expect(svg.indexOf('')).to.equal(-1); expect(svg.indexOf(''); expect(xml).to.contain('