fancy-test
Version:
extendable utilities for testing
131 lines • 4.06 kB
JavaScript
;
// 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