'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('