const isEq = require('@codefeathers/iseq'); const { liftPromise, stringify, isPromise } = require('../../util/helpers'); const _assertPromise = require('./assertPromise'); const expectPromise = (pred, statement, options = {}) => toTest => (...testValues) => liftPromise( resolvedValue => _assertPromise( pred(toTest, ...testValues), statement(resolvedValue, ...testValues), ), toTest, ) .catch(rejectedValue => options.shouldCatch ? _assertPromise( pred(toTest, ...testValues), statement(rejectedValue, ...testValues), ) : Promise.reject(rejectedValue) ); const expect = thing => { return ({ done : () => Promise.resolve(), equal : expectPromise( (a, b) => a === b, (a, b) => `${a} is not equal to ${b}`, )(thing), deepEqual : expectPromise( (a, b) => isEq(a, b), (a, b) => `${stringify(a)} is not deeply equal to ${stringify(b)}`, )(thing), isTrue : expectPromise( a => a === true, a => `${a} is not true`, )(thing), hasProp : expectPromise( (a, b) => b in a, (a, b) => `Property ${b} does not exist in ${stringify(a)}`, )(thing), hasPair : expectPromise( (a, b, c) => a[b] === c, (a, b, c) => `Pair <${b}, ${c}> does not exist in ${stringify(a)}`, )(thing), resolvesTo : expectPromise( (a, b) => isPromise(a) ? a.then(x => x === b ? Promise.resolve() : Promise.reject()) : Promise.reject(`${a} was not a Promise`), (a, b) => `${a} does not resolve to ${b}`, )(thing), isPromise : expectPromise( a => isPromise(a) ? a.then(() => Promise.resolve()).catch(() => Promise.resolve()) : Promise.reject(), a => `${a} is not a Promise`, { shouldCatch: true }, )(thing), }); }; module.exports = expect;