Muthu Kumar
6 years ago
4 changed files with 152 additions and 0 deletions
@ -0,0 +1,56 @@ |
|||
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); |
|||
}; |
@ -0,0 +1,14 @@ |
|||
const Gunner = require('@klenty/gunner'); |
|||
|
|||
const processUnit = require('./processUnit'); |
|||
|
|||
module.exports = instance => when => hook => { |
|||
|
|||
const GunnerConstant = when === 'before' |
|||
? Gunner.Start |
|||
: Gunner.End; |
|||
|
|||
return instance[when](GunnerConstant, state => |
|||
processUnit(hook, state)); |
|||
|
|||
}; |
@ -0,0 +1,43 @@ |
|||
const createAssertions = require('../createAssertions'); |
|||
const processUnit = require('./processUnit'); |
|||
|
|||
module.exports = instance => test => { |
|||
instance.test(test.description, async (expect, state) => { |
|||
const response = await processUnit(test, state); |
|||
|
|||
let expects = []; |
|||
const res = JSON.parse(response.res.text); |
|||
const responseData = { |
|||
status: response.status, |
|||
data: res.data, |
|||
errors: res.errors, |
|||
}; |
|||
|
|||
const awaitables = (test.expect || []).map(async ex => { |
|||
|
|||
if (ex.type === 'response') |
|||
Array.prototype.push.apply(expects, |
|||
await createAssertions( |
|||
ex, |
|||
expect, |
|||
[ responseData ], |
|||
)); |
|||
else if (ex.type === 'db') { |
|||
let data = await processUnit(ex, state); |
|||
if (Array.isArray(data)) |
|||
data = data.map(x => x._doc); |
|||
Array.prototype.push.apply(expects, |
|||
await createAssertions( |
|||
ex, |
|||
expect, |
|||
[ responseData, { doc: data } ] |
|||
)); |
|||
} else |
|||
return Promise.reject( |
|||
`${ex.type} is not a registered resource`); |
|||
}); |
|||
|
|||
await Promise.all(awaitables); |
|||
return expects; |
|||
}); |
|||
}; |
@ -0,0 +1,39 @@ |
|||
const requestor = async (unit, request) => { |
|||
switch (unit.method) { |
|||
|
|||
case 'get': |
|||
return await request[unit.method](unit.path); |
|||
case 'post': |
|||
return await (request[unit.method](unit.path) |
|||
.type(unit.reqType || 'json') |
|||
.send(unit.body)); |
|||
|
|||
} |
|||
}; |
|||
|
|||
const dbAction = async (unit, db) => { |
|||
if (!unit.hasOwnProperty('method')) unit.method = 'findOne'; |
|||
const exec = [ 'create', 'insertMany' ].indexOf(unit.method) === -1; |
|||
const action = db[unit.collection][unit.method]( |
|||
unit.query || unit.insert, |
|||
unit.update || unit.queryList, |
|||
); |
|||
|
|||
return !exec ? await action : action.exec(); |
|||
}; |
|||
|
|||
module.exports = async (unit, state) => { |
|||
const [ request, db ] = state['@start']; |
|||
switch (unit.type) { |
|||
|
|||
case 'request': |
|||
return await requestor(unit, request); |
|||
case 'db': |
|||
return await dbAction(unit, db); |
|||
default: |
|||
throw new Error( |
|||
`Unknown before hook type: ${unit.type}` |
|||
); |
|||
|
|||
} |
|||
}; |
Loading…
Reference in new issue