@case-contract-testing/case
Version:
Next-generation contract testing suite
49 lines (48 loc) • 2.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.traversals = void 0;
const entities_1 = require("../entities");
const context_1 = require("../entities/context");
const inferMatcher_1 = require("../diffmatch/inferMatcher");
const MatcherExecutors_1 = require("./MatcherExecutors");
const getExecutor = (matcherOrData, parentMatchContext) => {
const matcher = (0, inferMatcher_1.inferMatcher)(matcherOrData);
const matchContext = (0, context_1.foldIntoContext)(matcher, parentMatchContext);
const executor = MatcherExecutors_1.MatcherExecutors[matcher['case:matcher:type']];
if (!executor) {
throw new entities_1.CaseCoreError(`Missing executor for matcher type '${matcher['case:matcher:type']}'`);
}
return {
name: () => executor.describe(matcher, matchContext),
check: async (actual) => {
parentMatchContext.logger.deepMaintainerDebug(`Entering ${matcher['case:matcher:type']}, actual is:`, actual);
const result = await executor.check(matcher, matchContext, actual);
parentMatchContext.logger.deepMaintainerDebug(`Exiting ${matcher['case:matcher:type']}, with ${result.length} errors`);
return result;
},
strip: () => executor.strip(matcher, matchContext),
};
};
const descendAndCheck = (matcherOrData, parentMatchContext, actual) => getExecutor(matcherOrData, parentMatchContext).check(actual);
const descendAndDescribe = (matcherOrData, parentMatchContext) => getExecutor(matcherOrData, parentMatchContext).name();
const descendAndStrip = (matcherOrData, parentMatchContext) => {
if (typeof matcherOrData === 'object' &&
matcherOrData !== null &&
'case:matcher:example' in matcherOrData) {
parentMatchContext.logger.deepMaintainerDebug(`Executing strip with matcher type: ${matcherOrData['case:matcher:type']} and specific example`);
return getExecutor(matcherOrData['case:matcher:example'], parentMatchContext).strip();
}
parentMatchContext.logger.deepMaintainerDebug(`Executing strip with matcher ${typeof matcherOrData === 'object' &&
matcherOrData !== null &&
'case:matcher:type' in matcherOrData
? `type: ${matcherOrData['case:matcher:type']}`
: `inferred from ${typeof matcherOrData}`}`);
return getExecutor(matcherOrData, parentMatchContext).strip();
};
const selfVerify = (matcherOrData, parentMatchContext) => getExecutor(matcherOrData, parentMatchContext).check(descendAndStrip(matcherOrData, parentMatchContext));
exports.traversals = {
descendAndDescribe,
descendAndCheck,
descendAndStrip,
selfVerify,
};