diff --git a/lib/createAssertions.js b/lib/createAssertions.js index d34f9e9..b045625 100644 --- a/lib/createAssertions.js +++ b/lib/createAssertions.js @@ -1,55 +1,19 @@ -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 Shotgun = require('shotgun-query'); -const parsePath = obj => pathString => { +module.exports = (expectable, expect, docs) => { + const unitExpects = []; - const paths = []; + if (expectable.checks) { - const normalised = pathString - .trim() - .replace(/^(res|unit)::/, '') - .split('::'); + unitExpects.push(expect(expectable.checks).isArray()); - 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)); - } + expectable.checks.forEach(check => - return paths; + unitExpects.push( + new Shotgun(check).eval(docs).call(expect)) -}; + ); -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); diff --git a/lib/units/convertTest.js b/lib/units/convertTest.js index 8dbc04e..2da0576 100644 --- a/lib/units/convertTest.js +++ b/lib/units/convertTest.js @@ -20,7 +20,7 @@ module.exports = instance => test => { await createAssertions( ex, expect, - [ responseData ], + { res: responseData }, )); else if (ex.type === 'db') { let data = await processUnit(ex, state); @@ -30,7 +30,7 @@ module.exports = instance => test => { await createAssertions( ex, expect, - [ responseData, { doc: data } ] + { res: responseData, unit: { doc: data } }, )); } else return Promise.reject( diff --git a/package.json b/package.json index 35534ec..a6290bd 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "@klenty/gunner": "^0.6.7", "chai": "^4.1.2", "chai-http": "^4.0.0", - "mongoose": "^5.2.6" + "mongoose": "^5.2.6", + "shotgun-query": "^0.1.0" } } diff --git a/shrinkwrap.yaml b/shrinkwrap.yaml index 26f1730..b059755 100644 --- a/shrinkwrap.yaml +++ b/shrinkwrap.yaml @@ -3,6 +3,7 @@ dependencies: chai: 4.1.2 chai-http: 4.0.0 mongoose: 5.2.6 + shotgun-query: 0.1.0 packages: /@babel/code-frame/7.0.0: dependencies: @@ -196,6 +197,10 @@ packages: dev: false resolution: integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + /bracket-split/1.1.4: + dev: false + resolution: + integrity: sha512-O0FV/j4y/1Rzp/FlUZNy+AdNVfvPpBNRHe+8bpN5T4n7vm5N286TaT9Jvgvp0oEvNHTFU9dZIEpjvT/K7fKrqw== /bson/1.0.9: dev: false engines: @@ -1324,6 +1329,12 @@ packages: node: '>=0.10.0' resolution: integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + /shotgun-query/0.1.0: + dependencies: + bracket-split: 1.1.4 + dev: false + resolution: + integrity: sha512-lKr0K5jG/d2L6500vvNNuN5qH82p7A1T6N2ySPXU4d6Qqjz4zj1K/pwIPg0psqOFmnPSl6+5q241C2Uuu/ACAQ== /signal-exit/3.0.2: dev: false resolution: @@ -1509,3 +1520,4 @@ specifiers: chai: ^4.1.2 chai-http: ^4.0.0 mongoose: ^5.2.6 + shotgun-query: ^0.1.0