|
|
@ -11,7 +11,7 @@ describe('Workflow', () => { |
|
|
it('should create empty workflow', () => { |
|
|
it('should create empty workflow', () => { |
|
|
const workflow = new WorkflowDto(); |
|
|
const workflow = new WorkflowDto(); |
|
|
|
|
|
|
|
|
expect(workflow.name).toEqual('Default'); |
|
|
expect(workflow.initial); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
it('should add step to workflow', () => { |
|
|
it('should add step to workflow', () => { |
|
|
@ -19,51 +19,68 @@ describe('Workflow', () => { |
|
|
new WorkflowDto() |
|
|
new WorkflowDto() |
|
|
.setStep('1', { color: '#00ff00' }); |
|
|
.setStep('1', { color: '#00ff00' }); |
|
|
|
|
|
|
|
|
expect(simplify(workflow)).toEqual({ |
|
|
expect(workflow.serialize()).toEqual({ |
|
|
_links: {}, |
|
|
steps: { |
|
|
steps: [ |
|
|
'1': { transitions: {}, color: '#00ff00' } |
|
|
{ name: '1', color: '#00ff00' } |
|
|
}, |
|
|
], |
|
|
initial: '1' |
|
|
transitions: [], |
|
|
|
|
|
name: 'Default' |
|
|
|
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
it('should override settings if step already exists', () => { |
|
|
it('should override settings if step already exists', () => { |
|
|
const workflow = |
|
|
const workflow = |
|
|
new WorkflowDto() |
|
|
new WorkflowDto() |
|
|
.setStep('1', { color: '#00ff00' }) |
|
|
.setStep('1', { color: '#00ff00', noUpdate: true }) |
|
|
.setStep('1', { color: 'red' }); |
|
|
.setStep('1', { color: 'red' }); |
|
|
|
|
|
|
|
|
expect(simplify(workflow)).toEqual({ |
|
|
expect(workflow.serialize()).toEqual({ |
|
|
_links: {}, |
|
|
steps: { |
|
|
steps: [ |
|
|
'1': { transitions: {}, color: 'red', noUpdate: true } |
|
|
{ name: '1', color: 'red' } |
|
|
}, |
|
|
], |
|
|
initial: '1' |
|
|
transitions: [], |
|
|
|
|
|
name: 'Default' |
|
|
|
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
it('should not remove step if locked', () => { |
|
|
it('should return same workflow if step to update is locked', () => { |
|
|
const workflow = |
|
|
const workflow = |
|
|
new WorkflowDto() |
|
|
new WorkflowDto() |
|
|
.setStep('1', { color: '#00ff00', isLocked: true }) |
|
|
.setStep('1', { color: '#00ff00', isLocked: true }); |
|
|
.setStep('2', { color: '#ff0000' }) |
|
|
|
|
|
.setTransition('1', '2', { expression: '1 === 2' }) |
|
|
const updated = workflow.setStep('1', { color: 'red' }); |
|
|
.removeStep('1'); |
|
|
|
|
|
|
|
|
|
|
|
expect(simplify(workflow)).toEqual({ |
|
|
expect(updated).toBe(workflow); |
|
|
_links: {}, |
|
|
|
|
|
steps: [ |
|
|
|
|
|
{ name: '1', color: '#00ff00', isLocked: true }, |
|
|
|
|
|
{ name: '2', color: '#ff0000' } |
|
|
|
|
|
], |
|
|
|
|
|
transitions: [ |
|
|
|
|
|
{ from: '1', to: '2', expression: '1 === 2' } |
|
|
|
|
|
], |
|
|
|
|
|
name: 'Default' |
|
|
|
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
it('should sort steps case invariant', () => { |
|
|
|
|
|
const workflow = |
|
|
|
|
|
new WorkflowDto() |
|
|
|
|
|
.setStep('Z') |
|
|
|
|
|
.setStep('a'); |
|
|
|
|
|
|
|
|
|
|
|
expect(workflow.steps).toEqual([ |
|
|
|
|
|
{ name: 'a' }, |
|
|
|
|
|
{ name: 'Z' } |
|
|
|
|
|
]); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
it('should return same workflow if step to remove is locked', () => { |
|
|
|
|
|
const workflow = |
|
|
|
|
|
new WorkflowDto() |
|
|
|
|
|
.setStep('1', { color: '#00ff00', isLocked: true }); |
|
|
|
|
|
|
|
|
|
|
|
const updated = workflow.removeStep('1'); |
|
|
|
|
|
|
|
|
|
|
|
expect(updated).toBe(workflow); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
it('should return same workflow if step to remove not found', () => { |
|
|
|
|
|
const workflow = |
|
|
|
|
|
new WorkflowDto() |
|
|
|
|
|
.setStep('1'); |
|
|
|
|
|
|
|
|
|
|
|
const updated = workflow.removeStep('3'); |
|
|
|
|
|
|
|
|
|
|
|
expect(updated).toBe(workflow); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
it('should remove step', () => { |
|
|
it('should remove step', () => { |
|
|
@ -77,19 +94,46 @@ describe('Workflow', () => { |
|
|
.setTransition('2', '3', { expression: '2 === 3' }) |
|
|
.setTransition('2', '3', { expression: '2 === 3' }) |
|
|
.removeStep('1'); |
|
|
.removeStep('1'); |
|
|
|
|
|
|
|
|
expect(simplify(workflow)).toEqual({ |
|
|
expect(workflow.serialize()).toEqual({ |
|
|
_links: {}, |
|
|
steps: { |
|
|
steps: [ |
|
|
'2': { |
|
|
{ name: '2', color: '#ff0000' }, |
|
|
transitions: { |
|
|
{ name: '3', color: '#0000ff' } |
|
|
'3': { expression: '2 === 3' } |
|
|
], |
|
|
}, |
|
|
transitions: [ |
|
|
color: '#ff0000' |
|
|
{ from: '2', to: '3', expression: '2 === 3' } |
|
|
}, |
|
|
], |
|
|
'3': { transitions: {}, color: '#0000ff' } |
|
|
name: 'Default' |
|
|
}, |
|
|
|
|
|
initial: '2' |
|
|
|
|
|
}); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
it('should make first non-locked step the initial step if initial removed', () => { |
|
|
|
|
|
const workflow = |
|
|
|
|
|
new WorkflowDto() |
|
|
|
|
|
.setStep('1') |
|
|
|
|
|
.setStep('2', { isLocked: true }) |
|
|
|
|
|
.setStep('3') |
|
|
|
|
|
.removeStep('1'); |
|
|
|
|
|
|
|
|
|
|
|
expect(workflow.serialize()).toEqual({ |
|
|
|
|
|
steps: { |
|
|
|
|
|
'2': { transitions: {}, isLocked: true }, |
|
|
|
|
|
'3': { transitions: {} } |
|
|
|
|
|
}, |
|
|
|
|
|
initial: '3' |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
it('should unset initial step if initial removed', () => { |
|
|
|
|
|
const workflow = |
|
|
|
|
|
new WorkflowDto() |
|
|
|
|
|
.setStep('1') |
|
|
|
|
|
.removeStep('1'); |
|
|
|
|
|
|
|
|
|
|
|
expect(workflow.serialize()).toEqual({ steps: {}, initial: undefined }); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
it('should rename step', () => { |
|
|
it('should rename step', () => { |
|
|
const workflow = |
|
|
const workflow = |
|
|
new WorkflowDto() |
|
|
new WorkflowDto() |
|
|
@ -99,90 +143,157 @@ describe('Workflow', () => { |
|
|
.setTransition('1', '2', { expression: '1 === 2' }) |
|
|
.setTransition('1', '2', { expression: '1 === 2' }) |
|
|
.setTransition('2', '1', { expression: '2 === 1' }) |
|
|
.setTransition('2', '1', { expression: '2 === 1' }) |
|
|
.setTransition('2', '3', { expression: '2 === 3' }) |
|
|
.setTransition('2', '3', { expression: '2 === 3' }) |
|
|
.renameStep('1', '4'); |
|
|
.renameStep('1', 'a'); |
|
|
|
|
|
|
|
|
expect(simplify(workflow)).toEqual({ |
|
|
expect(workflow.serialize()).toEqual({ |
|
|
_links: {}, |
|
|
steps: { |
|
|
steps: [ |
|
|
'a': { |
|
|
{ name: '4', color: '#00ff00' }, |
|
|
transitions: { |
|
|
{ name: '2', color: '#ff0000' }, |
|
|
'2': { expression: '1 === 2' } |
|
|
{ name: '3', color: '#0000ff' } |
|
|
}, |
|
|
], |
|
|
color: '#00ff00' |
|
|
transitions: [ |
|
|
}, |
|
|
{ from: '4', to: '2', expression: '1 === 2' }, |
|
|
'2': { |
|
|
{ from: '2', to: '4', expression: '2 === 1' }, |
|
|
transitions: { |
|
|
{ from: '2', to: '3', expression: '2 === 3' } |
|
|
'a': { expression: '2 === 1' }, |
|
|
], |
|
|
'3': { expression: '2 === 3' } |
|
|
name: 'Default' |
|
|
}, |
|
|
|
|
|
color: '#ff0000' |
|
|
|
|
|
}, |
|
|
|
|
|
'3': { transitions: {}, color: '#0000ff' } |
|
|
|
|
|
}, |
|
|
|
|
|
initial: 'a' |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
it('should add transitions to workflow', () => { |
|
|
it('should add transitions to workflow', () => { |
|
|
const workflow = |
|
|
const workflow = |
|
|
new WorkflowDto() |
|
|
new WorkflowDto() |
|
|
.setStep('1', { color: '#00ff00' }) |
|
|
.setStep('1') |
|
|
.setStep('2', { color: '#ff0000' }) |
|
|
.setStep('2') |
|
|
.setTransition('1', '2', { expression: '1 === 2' }) |
|
|
.setTransition('1', '2', { expression: '1 === 2' }) |
|
|
.setTransition('2', '1', { expression: '2 === 1' }); |
|
|
.setTransition('2', '1', { expression: '2 === 1' }); |
|
|
|
|
|
|
|
|
expect(simplify(workflow)).toEqual({ |
|
|
expect(workflow.serialize()).toEqual({ |
|
|
_links: {}, |
|
|
steps: { |
|
|
steps: [ |
|
|
'1': { |
|
|
{ name: '1', color: '#00ff00' }, |
|
|
transitions: { |
|
|
{ name: '2', color: '#ff0000' } |
|
|
'2': { expression: '1 === 2' } |
|
|
], |
|
|
} |
|
|
transitions: [ |
|
|
}, |
|
|
{ from: '1', to: '2', expression: '1 === 2' }, |
|
|
'2': { |
|
|
{ from: '2', to: '1', expression: '2 === 1' } |
|
|
transitions: { |
|
|
], |
|
|
'1': { expression: '2 === 1' } |
|
|
name: 'Default' |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
initial: '1' |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
it('should add remove transition from workflow', () => { |
|
|
it('should remove transition from workflow', () => { |
|
|
const workflow = |
|
|
const workflow = |
|
|
new WorkflowDto() |
|
|
new WorkflowDto() |
|
|
.setStep('1', { color: '#00ff00' }) |
|
|
.setStep('1') |
|
|
.setStep('2', { color: '#ff0000' }) |
|
|
.setStep('2') |
|
|
.setTransition('1', '2', { expression: '1 === 1' }) |
|
|
.setTransition('1', '2', { expression: '1 === 2' }) |
|
|
.setTransition('2', '1', { expression: '2 === 1' }) |
|
|
.setTransition('2', '1', { expression: '2 === 1' }) |
|
|
.removeTransition('1', '2'); |
|
|
.removeTransition('1', '2'); |
|
|
|
|
|
|
|
|
expect(simplify(workflow)).toEqual({ |
|
|
expect(workflow.serialize()).toEqual({ |
|
|
_links: {}, |
|
|
steps: { |
|
|
steps: [ |
|
|
'1': { transitions: {}}, |
|
|
{ name: '1', color: '#00ff00' }, |
|
|
'2': { |
|
|
{ name: '2', color: '#ff0000' } |
|
|
transitions: { |
|
|
], |
|
|
'1': { expression: '2 === 1' } |
|
|
transitions: [ |
|
|
} |
|
|
{ from: '2', to: '1', expression: '2 === 1' } |
|
|
} |
|
|
], |
|
|
}, |
|
|
name: 'Default' |
|
|
initial: '1' |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
it('should override settings if transition already exists', () => { |
|
|
it('should override settings if transition already exists', () => { |
|
|
const workflow = |
|
|
const workflow = |
|
|
new WorkflowDto() |
|
|
new WorkflowDto() |
|
|
.setStep('1', { color: '#00ff00' }) |
|
|
.setStep('1') |
|
|
.setStep('2', { color: '#ff0000' }) |
|
|
.setStep('2') |
|
|
.setTransition('1', '2', { expression: '1 === 2' }) |
|
|
.setTransition('2', '1', { expression: '2 === 1', role: 'Role' }) |
|
|
.setTransition('1', '2', { expression: '1 !== 2' }); |
|
|
.setTransition('2', '1', { expression: '2 !== 1' }); |
|
|
|
|
|
|
|
|
expect(simplify(workflow)).toEqual({ |
|
|
expect(workflow.serialize()).toEqual({ |
|
|
_links: {}, |
|
|
steps: { |
|
|
steps: [ |
|
|
'1': { transitions: {} }, |
|
|
{ name: '1', color: '#00ff00' }, |
|
|
'2': { |
|
|
{ name: '2', color: '#ff0000' } |
|
|
transitions: { |
|
|
], |
|
|
'1': { expression: '2 !== 1', role: 'Role' } |
|
|
transitions: [ |
|
|
} |
|
|
{ from: '1', to: '2', expression: '1 !== 2' } |
|
|
} |
|
|
], |
|
|
}, |
|
|
name: 'Default' |
|
|
initial: '1' |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
function simplify(value: any) { |
|
|
it('should return same workflow if transition to update not found by from step', () => { |
|
|
return JSON.parse(JSON.stringify(value)); |
|
|
const workflow = |
|
|
} |
|
|
new WorkflowDto() |
|
|
|
|
|
.setStep('1') |
|
|
|
|
|
.setStep('2') |
|
|
|
|
|
.setTransition('1', '2'); |
|
|
|
|
|
|
|
|
|
|
|
const updated = workflow.setTransition('3', '2', { role: 'Role' }); |
|
|
|
|
|
|
|
|
|
|
|
expect(updated).toBe(workflow); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
it('should return same workflow if transition to update not found by to step', () => { |
|
|
|
|
|
const workflow = |
|
|
|
|
|
new WorkflowDto() |
|
|
|
|
|
.setStep('1') |
|
|
|
|
|
.setStep('2') |
|
|
|
|
|
.setTransition('1', '2'); |
|
|
|
|
|
|
|
|
|
|
|
const updated = workflow.setTransition('1', '3', { role: 'Role' }); |
|
|
|
|
|
|
|
|
|
|
|
expect(updated).toBe(workflow); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
it('should return same workflow if transition to remove not', () => { |
|
|
|
|
|
const workflow = |
|
|
|
|
|
new WorkflowDto() |
|
|
|
|
|
.setStep('1') |
|
|
|
|
|
.setStep('2') |
|
|
|
|
|
.setTransition('1', '2'); |
|
|
|
|
|
|
|
|
|
|
|
const updated = workflow.removeTransition('1', '3'); |
|
|
|
|
|
|
|
|
|
|
|
expect(updated).toBe(workflow); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
it('should return same workflow if step to make initial is locked', () => { |
|
|
|
|
|
const workflow = |
|
|
|
|
|
new WorkflowDto() |
|
|
|
|
|
.setStep('1') |
|
|
|
|
|
.setStep('2', { color: '#00ff00', isLocked: true }); |
|
|
|
|
|
|
|
|
|
|
|
const updated = workflow.setInitial('2'); |
|
|
|
|
|
|
|
|
|
|
|
expect(updated).toBe(workflow); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
it('should set initial step', () => { |
|
|
|
|
|
const workflow = |
|
|
|
|
|
new WorkflowDto() |
|
|
|
|
|
.setStep('1') |
|
|
|
|
|
.setStep('2') |
|
|
|
|
|
.setInitial('2'); |
|
|
|
|
|
|
|
|
|
|
|
expect(workflow.serialize()).toEqual({ |
|
|
|
|
|
steps: { |
|
|
|
|
|
'1': { transitions: {} }, |
|
|
|
|
|
'2': { transitions: {} } |
|
|
|
|
|
}, |
|
|
|
|
|
initial: '2' |
|
|
|
|
|
}); |
|
|
|
|
|
}); |
|
|
|
|
|
}); |