Sample Gunner Strategy implementation
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

56 lines
1.3 KiB

const path = obj => path =>
path.reduce((result, segment) => result && result[segment], obj);
const pickSelector = path => {
const match = path.match(/^(res|unit)(::|$)/)[0];
if (match === 'res::') return 0;
if (match === 'unit::') return 1;
return -1;
};
const parsePath = obj => pathString => {
const paths = [];
const normalised = pathString
.trim()
.replace(/^(res|unit)::/, '')
.split('::');
if (normalised[normalised.length - 1] === '&*') {
const push = path(obj)(normalised.slice(0, normalised.length - 1));
if (Array.isArray(push)) Array.prototype.push.apply(paths, push);
else return Promise.reject(
`${push} is not an array. Cannot run '&*' operator!`);
} else {
paths.push(path(obj)(normalised));
}
return paths;
};
const obj = {
doc: {
a:
{ b: [5, 10] }
}
};
module.exports = (expectable, expect, docs) => {
const unitExpects = [];
if (expectable.checks) {
unitExpects.push(expect(expectable.checks).isArray());
expectable.checks.forEach(check => {
const [ pathToCheck, method, ...args ] = check;
const selector = pickSelector(pathToCheck);
const toChecks = parsePath(docs[selector])(pathToCheck);
toChecks.forEach(toCheck =>
unitExpects.push(
expect(toCheck)[method](...args)));
});
}
return Promise.all(unitExpects);
};