112 lines
2.4 KiB
JavaScript
112 lines
2.4 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var _ = require('lodash');
|
||
|
var BpmnJS = require('../../');
|
||
|
|
||
|
var OPTIONS, BPMN_JS;
|
||
|
|
||
|
function options(opts) {
|
||
|
if (_.isFunction(opts)) {
|
||
|
opts = opts();
|
||
|
}
|
||
|
|
||
|
OPTIONS = opts;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Bootstrap BpmnJS given the specified options and a number of locals (i.e. services)
|
||
|
*
|
||
|
* @example
|
||
|
*
|
||
|
* describe(function() {
|
||
|
*
|
||
|
* var mockEvents;
|
||
|
*
|
||
|
* beforeEach(bootstrapBpmnJS(function() {
|
||
|
* mockEvents = new Events();
|
||
|
*
|
||
|
* return {
|
||
|
* events: mockEvents
|
||
|
* };
|
||
|
* }));
|
||
|
*
|
||
|
* });
|
||
|
*
|
||
|
* @param {Object} (options) optional options to be passed to the diagram upon instantiation
|
||
|
* @param {Object|Function} locals the local overrides to be used by the diagram or a function that produces them
|
||
|
* @return {Function} a function to be passed to beforeEach
|
||
|
*/
|
||
|
function bootstrapBpmnJS(diagram, options, locals) {
|
||
|
|
||
|
return function(done) {
|
||
|
|
||
|
var _diagram = diagram,
|
||
|
_options = options,
|
||
|
_locals = locals;
|
||
|
|
||
|
if (!_locals && _.isFunction(_options)) {
|
||
|
_locals = _options;
|
||
|
_options = null;
|
||
|
}
|
||
|
|
||
|
if (_.isFunction(_options)) {
|
||
|
_options = _options();
|
||
|
}
|
||
|
|
||
|
if (_.isFunction(_locals)) {
|
||
|
_locals = _locals();
|
||
|
}
|
||
|
|
||
|
_options = _.extend({}, OPTIONS || {}, _options || {});
|
||
|
|
||
|
var mockModule = {};
|
||
|
|
||
|
_.forEach(_locals, function(v, k) {
|
||
|
mockModule[k] = ['value', v];
|
||
|
});
|
||
|
|
||
|
_options.modules = _.unique([].concat(_options.modules || [], [ mockModule ]));
|
||
|
|
||
|
BPMN_JS = new BpmnJS(_options);
|
||
|
|
||
|
// import diagram
|
||
|
BPMN_JS.importXML(_diagram, done);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Injects services of an instantiated diagram into the argument.
|
||
|
*
|
||
|
* Use it in conjunction with {@link #bootstrapBpmnJS}.
|
||
|
*
|
||
|
* @example
|
||
|
*
|
||
|
* describe(function() {
|
||
|
*
|
||
|
* var mockEvents;
|
||
|
*
|
||
|
* beforeEach(bootstrapBpmnJS(...));
|
||
|
*
|
||
|
* it('should provide mocked events', inject(function(events) {
|
||
|
* expect(events).toBe(mockEvents);
|
||
|
* }));
|
||
|
*
|
||
|
* });
|
||
|
*
|
||
|
* @param {Function} fn the function to inject to
|
||
|
* @return {Function} a function that can be passed to it to carry out the injection
|
||
|
*/
|
||
|
function inject(fn) {
|
||
|
return function() {
|
||
|
|
||
|
if (!BPMN_JS) {
|
||
|
throw new Error('no bootstraped bpmn-js instance, ensure you created it via #bootstrapBpmnJS');
|
||
|
}
|
||
|
|
||
|
BPMN_JS.invoke(fn);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
|
||
|
module.exports.bootstrapBpmnJS = (window || global).bootstrapBpmnJS = bootstrapBpmnJS;
|
||
|
module.exports.inject = (window || global).inject = inject;
|