bpmn-js/test/spec/features/modeling/behavior/AttachEventBehaviorSpec.js

284 lines
8.5 KiB
JavaScript

/* global sinon */
import {
bootstrapModeler,
inject
} from 'test/TestHelper';
import coreModule from 'lib/core';
import modelingModule from 'lib/features/modeling';
import { getBusinessObject } from '../../../../../lib/util/ModelUtil';
describe('features/modeling/behavior - attach events', function() {
var testModules = [
coreModule,
modelingModule
];
var attachEventBehaviorXML = require('./AttachEventBehavior.bpmn');
beforeEach(bootstrapModeler(attachEventBehaviorXML, { modules: testModules }));
describe('basics', function() {
describe('create', function() {
it('should replace', inject(function(elementFactory, elementRegistry, modeling) {
// given
var task = elementRegistry.get('Task_1'),
taskBo = getBusinessObject(task),
intermediateEvent = elementFactory.createShape({ type: 'bpmn:IntermediateThrowEvent' });
// when
var boundaryEvent = modeling.createElements(
[ intermediateEvent ], { x: 300, y: 140 }, task, { attach: true }
)[0];
// then
var boundaryEventBo = getBusinessObject(boundaryEvent);
expect(boundaryEventBo.$type).to.equal('bpmn:BoundaryEvent');
expect(boundaryEventBo.attachedToRef).to.equal(taskBo);
}));
it('should NOT replace', inject(function(elementFactory, elementRegistry, modeling) {
// given
var process = elementRegistry.get('Process_1'),
intermediateEvent = elementFactory.createShape({ type: 'bpmn:IntermediateThrowEvent' });
// when
intermediateEvent = modeling.createElements([ intermediateEvent ], { x: 300, y: 240 }, process)[0];
// then
var intermediateEventBo = getBusinessObject(intermediateEvent);
expect(intermediateEventBo.$type).to.equal('bpmn:IntermediateThrowEvent');
expect(intermediateEventBo.attachedToRef).not.to.exist;
}));
it('should copy properties', inject(
function(bpmnFactory, elementFactory, elementRegistry, modeling) {
// given
var task = elementRegistry.get('Task_1');
var intermediateThrowEventBo = bpmnFactory.create('bpmn:IntermediateThrowEvent', {
name: 'foo'
});
var documentation = bpmnFactory.create('bpmn:Documentation', {
text: 'bar'
});
intermediateThrowEventBo.documentation = [ documentation ];
documentation.$parent = intermediateThrowEventBo;
var intermediateThrowEvent = elementFactory.createShape({
type: 'bpmn:IntermediateThrowEvent',
businessObject: intermediateThrowEventBo
});
// when
var boundaryEvent = modeling.createElements(
[ intermediateThrowEvent ], { x: 300, y: 140 }, task, { attach: true }
)[0];
// then
var boundaryEventBo = getBusinessObject(boundaryEvent);
expect(boundaryEventBo.name).to.equal('foo');
expect(boundaryEventBo.documentation).to.have.lengthOf(1);
expect(boundaryEventBo.documentation[0].text).to.equal('bar');
}
));
});
describe('move', function() {
it('should replace', inject(function(elementRegistry, modeling) {
// given
var task = elementRegistry.get('Task_1'),
taskBo = getBusinessObject(task),
intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_1');
// when
modeling.moveElements([ intermediateThrowEvent ], { x: 100, y: 40 }, task, { attach: true });
// then
var boundaryEvent = elementRegistry.get('IntermediateThrowEvent_1'),
boundaryEventBo = getBusinessObject(boundaryEvent);
expect(boundaryEvent).to.exist;
expect(boundaryEventBo.$type).to.equal('bpmn:BoundaryEvent');
expect(boundaryEventBo.attachedToRef).to.equal(taskBo);
}));
it('should NOT replace', inject(function(elementRegistry, modeling) {
// given
var process = elementRegistry.get('Process_1'),
intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_1'),
intermediateThrowEventBo = getBusinessObject(intermediateThrowEvent);
// when
modeling.moveElements([ intermediateThrowEvent ], { x: 100, y: 100 }, process);
// then
expect(intermediateThrowEvent).to.exist;
expect(intermediateThrowEventBo.$type).to.equal('bpmn:IntermediateThrowEvent');
expect(intermediateThrowEventBo.attachedToRef).not.to.exist;
}));
describe('properties', function() {
it('should copy properties', inject(function(elementRegistry, modeling) {
// given
var task = elementRegistry.get('Task_1'),
intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_1');
// when
modeling.moveElements([ intermediateThrowEvent ], { x: 100, y: 40 }, task, { attach: true });
// then
var boundaryEvent = elementRegistry.get('IntermediateThrowEvent_1'),
boundaryEventBo = getBusinessObject(boundaryEvent);
expect(boundaryEventBo.name).to.equal('foo');
expect(boundaryEventBo.documentation).to.have.lengthOf(1);
expect(boundaryEventBo.documentation[0].text).to.equal('bar');
}));
describe('event definitions', function() {
var ids = [
'ConditionalCatchEvent',
'IntermediateThrowEvent_1',
'MessageCatchEvent',
'SignalCatchEvent',
'TimerCatchEvent',
];
function getDelta(element, task) {
return {
x: task.x + task.width / 2 - element.x - element.width / 2,
y: task.y + task.height - element.y - element.height / 2
};
}
ids.forEach(function(id) {
it('should copy event definition', inject(function(elementRegistry, modeling) {
// given
var element = elementRegistry.get(id),
elementBo = getBusinessObject(element),
eventDefinitions = elementBo.eventDefinitions,
task = elementRegistry.get('Task_1');
// when
modeling.moveElements([ element ], getDelta(element, task), task, { attach: true });
// then
var boundaryEvent = elementRegistry.get(id),
boundaryEventBo = getBusinessObject(boundaryEvent);
expect(boundaryEventBo.$type).to.equal('bpmn:BoundaryEvent');
expect(boundaryEventBo.eventDefinitions).to.jsonEqual(eventDefinitions, skipId);
}));
});
});
});
});
});
describe('connections', function() {
it('should remove incoming connection', inject(function(elementRegistry, modeling) {
// given
var intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_1'),
startEvent = elementRegistry.get('StartEvent_1'),
task = elementRegistry.get('Task_1');
// when
modeling.moveElements([ intermediateThrowEvent ], { x: 100, y: 40 }, task, { attach: true });
// then
var boundaryEvent = elementRegistry.get('IntermediateThrowEvent_1');
expect(boundaryEvent.incoming).to.have.lengthOf(0);
expect(startEvent.outgoing).to.have.lengthOf(0);
}));
it('should NOT remove outgoing connection', inject(function(elementRegistry, modeling) {
// given
var intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_1'),
task = elementRegistry.get('Task_1');
// when
modeling.moveElements([ intermediateThrowEvent ], { x: 100, y: 40 }, task, { attach: true });
// then
var boundaryEvent = elementRegistry.get('IntermediateThrowEvent_1');
expect(boundaryEvent.outgoing).to.have.lengthOf(1);
expect(task.incoming).to.have.lengthOf(1);
}));
it('should lay out connection once', inject(function(elementRegistry, eventBus, modeling) {
// given
var intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_1'),
task = elementRegistry.get('Task_1');
var layoutSpy = sinon.spy();
eventBus.on('commandStack.connection.layout.execute', layoutSpy);
// when
modeling.moveElements([ intermediateThrowEvent ], { x: 100, y: 40 }, task, { attach: true });
// then
expect(layoutSpy).to.be.calledOnce;
}));
});
});
// helpers //////////
function skipId(key, value) {
if (key === 'id') {
return;
}
return value;
}