Skip to content

Commit 75edbf3

Browse files
committed
test: add variableInclude matcher
* verifies a variable matching an expectation is in a list of variables test: correct `variableEquals` to strictly match all variables chore: move assertions to utility
1 parent 2d3ba40 commit 75edbf3

File tree

3 files changed

+112
-49
lines changed

3 files changed

+112
-49
lines changed

test/assertions.js

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
const { expect } = require('chai');
2+
3+
4+
function isDefined(value) {
5+
return typeof value !== 'undefined';
6+
}
7+
8+
function findVariable(variables, expectedVariable) {
9+
const {
10+
name,
11+
scope
12+
} = expectedVariable;
13+
14+
const variable = variables.find(
15+
v => (!isDefined(name) || v.name === name) && (!isDefined(scope) || v.scope?.id === scope)
16+
);
17+
18+
expect(variable, `variable[name=${name}, scope=${scope}]`).to.exist;
19+
20+
return variable;
21+
}
22+
23+
function assertVariableMatches(variable, expectedVariable) {
24+
const {
25+
name,
26+
type,
27+
detail,
28+
info,
29+
scope,
30+
isList,
31+
origin,
32+
entries
33+
} = expectedVariable;
34+
35+
isDefined(type) && expect(variable.type, `variable[name=${name}].type`).to.eql(type);
36+
isDefined(info) && expect(variable.info, `variable[name=${name}].info`).to.eql(info);
37+
isDefined(detail) && expect(variable.detail, `variable[name=${name}].detail`).to.eql(detail);
38+
isDefined(scope) && expect(variable.scope.id, `variable[name=${name}].scope.id`).to.eql(scope);
39+
isDefined(isList) && expect(!!variable.isList, `variable[name=${name}].isList`).to.eql(!!isList);
40+
isDefined(entries) && expect(variable.entries, `variable[name=${name}].entries`).to.variableEqual(entries);
41+
42+
isDefined(origin) && origin.forEach((expectedOrigin) => {
43+
const foundOrigin = variable.origin.find(o => o.id === expectedOrigin);
44+
expect(foundOrigin, `origin[name=${expectedOrigin}]`).to.exist;
45+
});
46+
47+
isDefined(origin) && expect(variable.origin.length, `variable[name=${name}].origin.length`).to.eql(origin.length);
48+
}
49+
50+
/**
51+
* Match variables against expected patterns,
52+
* return variables that were not matched.
53+
*/
54+
function assertVariablesMatch(variables, expectedVariables) {
55+
56+
let remainingVariables = variables.slice();
57+
58+
for (const expectedVariable of expectedVariables) {
59+
const variable = findVariable(remainingVariables, expectedVariable);
60+
61+
remainingVariables = remainingVariables.filter(v => v !== variable);
62+
63+
assertVariableMatches(variable, expectedVariable);
64+
}
65+
66+
return remainingVariables;
67+
}
68+
69+
function variableAssertions(chai, utils) {
70+
71+
// use to verify that a list of variables
72+
// is complete, i.e. includes exactly the variables matched
73+
utils.addMethod(chai.Assertion.prototype, 'variableEqual', function(expectedVariables) {
74+
const variables = this._obj;
75+
76+
const remainingVariables = assertVariablesMatch(variables, expectedVariables);
77+
78+
expect(remainingVariables.length, 'unmatched variables').to.eql(0);
79+
});
80+
81+
// use to verify that a list of variables
82+
// includes a single or a list of variables (by pattern)
83+
utils.addMethod(chai.Assertion.prototype, 'variableInclude', function(expectedVariables) {
84+
const variables = this._obj;
85+
86+
if (!Array.isArray(expectedVariables)) {
87+
expectedVariables = [ expectedVariables ];
88+
}
89+
90+
assertVariablesMatch(variables, expectedVariables);
91+
});
92+
}
93+
94+
module.exports = {
95+
variableAssertions
96+
};

test/globals.js

Lines changed: 3 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,7 @@
1-
const { use, expect } = require('chai');
1+
const { use } = require('chai');
22
const { default: sinonChai } = require('sinon-chai');
33

4+
const { variableAssertions } = require('./assertions');
45

5-
function isDefined(value) {
6-
return typeof value !== 'undefined';
7-
}
8-
9-
function VariableEqual(chai, utils) {
10-
11-
utils.addMethod(chai.Assertion.prototype, 'variableEqual', function(comparison) {
12-
var variables = this._obj;
13-
var expectedVariables = comparison;
14-
15-
expectedVariables.forEach((expectedVariable) => {
16-
const {
17-
name,
18-
type,
19-
detail,
20-
info,
21-
scope,
22-
isList,
23-
origin,
24-
entries
25-
} = expectedVariable;
26-
27-
const actualVariable = variables.find(
28-
v => (!isDefined(name) || v.name === name) && (!isDefined(scope) || v.scope?.id === scope)
29-
);
30-
31-
expect(actualVariable, `variable[name=${name}, scope=${scope}]`).to.exist;
32-
33-
isDefined(type) && expect(actualVariable.type, `variable[name=${name}].type`).to.eql(type);
34-
isDefined(info) && expect(actualVariable.info, `variable[name=${name}].info`).to.eql(info);
35-
isDefined(detail) && expect(actualVariable.detail, `variable[name=${name}].detail`).to.eql(detail);
36-
isDefined(scope) && expect(actualVariable.scope.id, `variable[name=${name}].scope.id`).to.eql(scope);
37-
isDefined(isList) && expect(!!actualVariable.isList, `variable[name=${name}].isList`).to.eql(!!isList);
38-
isDefined(entries) && expect(actualVariable.entries, `variable[name=${name}].entries`).to.variableEqual(entries);
39-
40-
isDefined(origin) && origin.forEach((expectedOrigin) => {
41-
const foundOrigin = actualVariable.origin.find(o => o.id === expectedOrigin);
42-
expect(foundOrigin, `origin[name=${expectedOrigin}]`).to.exist;
43-
});
44-
45-
isDefined(origin) && expect(actualVariable.origin.length, `variable[name=${name}].origin.length`).to.eql(origin.length);
46-
});
47-
48-
expect(variables.length, 'variables.length').to.eql(expectedVariables.length);
49-
});
50-
}
51-
52-
use(VariableEqual);
6+
use(variableAssertions);
537
use(sinonChai);

test/spec/zeebe/ZeebeVariableResolver.spec.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,6 +1332,19 @@ describe('ZeebeVariableResolver', function() {
13321332
expect(variables).to.variableEqual([
13331333
{ name: 'outputCollection', origin: [ 'AdHocSubProcess_1' ], scope: 'Process_1' }
13341334
]);
1335+
1336+
// and given
1337+
const root = elementRegistry.get('Process_1');
1338+
1339+
// when
1340+
const rootVariables = await variableResolver.getVariablesForElement(root);
1341+
1342+
// then
1343+
expect(rootVariables).to.variableInclude({
1344+
name: 'outputCollection',
1345+
origin: [ 'AdHocSubProcess_1' ],
1346+
scope: 'Process_1'
1347+
});
13351348
}));
13361349

13371350
});

0 commit comments

Comments
 (0)