@reportfy/tester
Version:
Lib para teste de integração usando serviço do reportfy
165 lines (147 loc) • 4.44 kB
JavaScript
/**
* @function
* @param x
* @param y
* @returns {boolean|this is string[]|boolean}
*/
const objectEqual = (x, y) => {
if (x === null || x === undefined || y === null || y === undefined) { return x === y }
if (x.constructor !== y.constructor) { return false }
if (x instanceof Function) { return x === y }
if (x instanceof RegExp) { return x === y }
if (x === y || x.valueOf() === y.valueOf()) { return true }
if (Array.isArray(x) && x.length !== y.length) { return false }
if (x instanceof Date) { return false }
if (!(x instanceof Object)) { return false }
if (!(y instanceof Object)) { return false }
const p = Object.keys(x)
return Object.keys(y).every(function (i) { return p.indexOf(i) !== -1 }) &&
p.every(function (i) { return objectEqual(x[i], y[i]) })
}
/**
* @function
* @param equalStatus
* @param responseStatus
* @returns {boolean}
*/
const getStatusEqual = (equalStatus, responseStatus) => Number(equalStatus) === Number(responseStatus)
/**
* @function
* @param equalBody
* @param responseBody
* @returns {*|boolean}
*/
const getBodyEqual = (equalBody, responseBody) => objectEqual(equalBody, responseBody)
/**
* @function
* @param rules
* @param response
* @param statusCode
* @returns {{responseStatusCode: *, responseBody: *, passedBody: (*|boolean), passedStatusCode: boolean}}
*/
exports.getPassed = ({ rules, response, statusCode }) => {
const passedStatusCode = getStatusEqual(statusCode, response.status)
const passedBody = mountedRules(rules, rules.equal, response.data)
return { passedBody, passedStatusCode, responseStatusCode: response.status, responseBody: response.data }
}
/**
* @function
* @param obj
* @param keyValue
* @returns {string}
*/
const getElementByKey = (obj, keyValue) => {
let valueReturn = ''
JSON.stringify(obj, (key, value) => {
if (key === keyValue) valueReturn = value
return value
})
return valueReturn
}
//
// /**
// * @function
// * @param obj
// * @param keyValue
// * @returns {string}
// */
// const getElementByValue = (obj, keyValue) => {
// let valueReturn = ''
// JSON.stringify(obj, (key, value) => {
// if (value === keyValue) valueReturn = value
// return value
// })
//
// return valueReturn
// }
/**
* @function
* @param responseBody
* @param keys
* @returns {boolean|*}
*/
const getKeysContains = (responseBody, keys) =>
!keys || !Array.isArray(keys) || keys.length === 0
? true
: keys.every(val => getElementByKey(responseBody, val).length > 0)
// /**
// * @function
// * @param responseBody
// * @param values
// * @returns {boolean|*}
// */
// const getValueContains = (responseBody, values) =>
// !values || !Array.isArray(values) || values.length === 0
// ? true
// : values.every(val => getElementByValue(responseBody, val).length > 2)
/**
* @function
* @param responseBody
* @param keys
* @param values
*/
const getContains = (responseBody, keys, values) => {
const validateKeys = getKeysContains(responseBody, values)
// const validateValues = getValueContains(responseBody, values)
// return validateKeys !== false && validateValues !== false
return validateKeys !== false
}
/**
* @function
* @param rules
* @param equalBody
* @param responseBody
* @returns {boolean|*}
*/
const mountedRules = (rules, equalBody, responseBody) => {
switch (rules.options) {
case 'equal':
return getBodyEqual(equalBody, responseBody || {})
case 'contain':
return getContains(responseBody || {}, rules.keys || [], rules.values || [])
}
return true
}
/**
* @function
* @param passedStatusCode
* @param passedBody
* @returns {boolean}
*/
const isPassed = ({ passedStatusCode, passedBody }) => (passedStatusCode === true && passedBody === true)
/**
* @function
* @param passedStatusCode
* @param passedBody
* @returns {boolean}
*/
const isReproved = ({ passedStatusCode, passedBody }) => (passedStatusCode === false || passedBody === false)
/**
* @function
* @param array
* @returns {{approved, reproved}}
*/
exports.listTestCase = (array) => ({
approved: array.filter(({ report: { passedStatusCode, passedBody } }) => isPassed({ passedStatusCode, passedBody })),
reproved: array.filter(({ report: { passedStatusCode, passedBody } }) => isReproved({ passedStatusCode, passedBody }))
})