UNPKG

@case-contract-testing/case

Version:

Next-generation contract testing suite

49 lines (48 loc) 2.67 kB
"use strict"; 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, };