diagram-js
Version:
A toolbox for displaying and modifying diagrams on the web
163 lines (132 loc) • 3.52 kB
JavaScript
import {
isFunction,
forEach,
merge
} from 'min-dash';
import TestContainer from 'mocha-test-container-support';
import Diagram from '../../lib/Diagram';
var OPTIONS, DIAGRAM_JS;
/**
* Bootstrap the diagram given the specified options and a number of locals (i.e. services)
*
* @example
*
* ```javascript
* describe(function() {
*
* var mockEvents;
*
* beforeEach(bootstrapDiagram(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
*/
export function bootstrapDiagram(options, locals) {
return function() {
var testContainer;
// Make sure the test container is an optional dependency and we fall back
// to an empty <div> if it does not exist.
//
// This is needed if other libraries rely on this helper for testing
// while not adding the mocha-test-container-support as a dependency.
try {
testContainer = TestContainer.get(this);
} catch (e) {
testContainer = document.createElement('div');
testContainer.classList.add('test-content-container');
document.body.appendChild(testContainer);
}
var _options = options,
_locals = locals;
if (!_locals && isFunction(_options)) {
_locals = _options;
_options = null;
}
if (isFunction(_options)) {
_options = _options();
}
if (isFunction(_locals)) {
_locals = _locals();
}
_options = merge({
canvas: {
container: testContainer,
deferUpdate: false
}
}, OPTIONS, _options);
var mockModule = {};
forEach(_locals, function(v, k) {
mockModule[k] = [ 'value', v ];
});
_options.modules = [].concat(_options.modules || [], [ mockModule ]);
// remove previous instance
cleanup();
DIAGRAM_JS = new Diagram(_options);
};
}
/**
* Injects services of an instantiated diagram into the argument.
*
* Use it in conjunction with {@link #bootstrapDiagram}.
*
* @example
*
* ```javascript
* describe(function() {
*
* var mockEvents;
*
* beforeEach(bootstrapDiagram(...));
*
* 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
*/
export function inject(fn) {
return function() {
if (!DIAGRAM_JS) {
throw new Error('no bootstraped diagram, ensure you created it via #bootstrapDiagram');
}
return DIAGRAM_JS.invoke(fn);
};
}
function cleanup() {
if (!DIAGRAM_JS) {
return;
}
DIAGRAM_JS.destroy();
}
export function insertCSS(name, css) {
if (document.querySelector('[data-css-file="' + name + '"]')) {
return;
}
var head = document.head || document.getElementsByTagName('head')[0],
style = document.createElement('style');
style.setAttribute('data-css-file', name);
style.type = 'text/css';
if (style.styleSheet) {
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
head.appendChild(style);
}
export function getDiagramJS() {
return DIAGRAM_JS;
}