UNPKG

fancy-test

Version:

extendable utilities for testing

131 lines 4.06 kB
"use strict"; // tslint:disable callable-types // tslint:disable no-unused Object.defineProperty(exports, "__esModule", { value: true }); const _ = require("lodash"); const context = { test: it, plugins: {}, chain: [], }; const base = (context) => { const end = (arg1, cb) => { context = assignWithProps({}, context); if (_.isFunction(arg1)) { cb = arg1; arg1 = undefined; } if (!arg1) arg1 = context.expectation || 'test'; if (cb) { context.chain = [...context.chain, { run: async (input) => { await cb(input); } }]; } return context.test(arg1, async function () { for (let i = 0; i < context.chain.length; i++) { const handleError = async (err) => { context.error = err; i++; const handler = context.chain[i]; if (!handler || !handler.catch) return false; try { await handler.catch(context); delete context.error; return true; } catch (err) { return handleError(err); } }; const next = context.chain[i]; try { if (next.run) await next.run(context); } catch (err) { if (!await handleError(err)) break; } } for (let p of context.chain.reverse()) { if (p.finally) await p.finally(context); } if (context.error) throw context.error; }); }; return { ...Object.entries(context.plugins) .reduce((plugins, [k, v]) => { plugins[k] = (...args) => { const plugin = v(...args); if (plugin.init) plugin.init(context); return base({ ...context, chain: [...context.chain, plugin], }); }; return plugins; }, {}), register(k, v) { return base({ ...context, plugins: { ...context.plugins, [k]: v, }, }); }, do(cb) { return base({ ...context, chain: [...context.chain, { run: (input) => cb(input) }] }); }, add(key, cb) { return base({ ...context, chain: [...context.chain, { run: async (ctx) => { ctx[key] = await cb(ctx); } }] }); }, end, it: end, }; }; function assignWithProps(target, ...sources) { sources.forEach(source => { if (!source) return; let descriptors = Object.keys(source).reduce((descriptors, key) => { descriptors[key] = Object.getOwnPropertyDescriptor(source, key); return descriptors; }, {}); // by default, Object.assign copies enumerable Symbols too Object.getOwnPropertySymbols(source).forEach(sym => { let descriptor = Object.getOwnPropertyDescriptor(source, sym); if (descriptor.enumerable) { descriptors[sym] = descriptor; } }); Object.defineProperties(target, descriptors); }); return target; } exports.default = base(context) .register('skip', () => ({ init: ctx => { ctx.test = it.skip; } })) .register('only', () => ({ init: ctx => { ctx.test = it.only; } })); //# sourceMappingURL=base.js.map