UNPKG

@case-contract-testing/case

Version:

Next-generation contract testing suite

98 lines (97 loc) 3.91 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.locationString = exports.addLocation = exports.applyNodeToContext = exports.constructMatchContext = exports.constructDataContext = exports.foldIntoContext = void 0; const types_1 = require("../../entities/nodes/mocks/types"); const types_2 = require("../../entities/nodes/matchers/types"); const shouldLog_1 = require("../../entities/logger/shouldLog"); /** * `case:currentRun:context:*` is not clobberable by child matchers * (with the exception of case:currentRun:context:logLevel). * `case:context:*` is clobberable by child matchers */ const DEFAULT_CONTEXT = { 'case:currentRun:context:location': [], 'case:currentRun:context:contractMode': 'write', 'case:currentRun:context:logLevel': 'warn', 'case:currentRun:context:printResults': true, 'case:context:matchBy': 'exact', 'case:context:serialisableTo': 'json', }; const contextProperties = (caseNode) => Object.entries(caseNode) .filter(([k]) => k.startsWith('case:context') || k === 'case:currentRun:context:logLevel') .reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {}); const updateFunctions = (context) => { const logger = context.makeLogger(context); const nextContext = { ...context, logger }; return { ...nextContext, ...nextContext.makeLookup(nextContext), }; }; const foldIntoContext = (caseNode, context) => ({ ...context, ...contextProperties(caseNode), }); exports.foldIntoContext = foldIntoContext; let exampleId = 0; const combineWithRoot = (caseNodeOrData, context, runConfig) => { const newContext = { ...((0, types_2.isCaseNode)(caseNodeOrData) || (0, types_1.isCaseMock)(caseNodeOrData) ? (0, exports.foldIntoContext)(caseNodeOrData, context) : context), ...runConfig, 'case:currentRun:context:location': [ ...context['case:currentRun:context:location'], `Example[${exampleId}]`, ], }; exampleId += 1; return updateFunctions(newContext); }; const constructDataContext = (makeLogger, resultPrinter, runConfig, defaults) => { const context = { makeLogger, ...DEFAULT_CONTEXT, 'case:currentRun:context:defaultConfig': defaults, 'case:currentRun:context:location': [], 'case:currentRun:context:testName': 'OUTSIDE_TESTS', 'case:currentRun:context:variables': {}, ...runConfig, }; const logContext = { ...context, logger: makeLogger(context), resultPrinter, }; return { ...logContext, }; }; exports.constructDataContext = constructDataContext; const constructMatchContext = (traversals, makeLogger, makeLookup, resultPrinter, runConfig, defaults) => { const context = { ...traversals, ...(0, exports.constructDataContext)(makeLogger, resultPrinter, runConfig, defaults), makeLookup, }; return { ...context, ...makeLookup(context), }; }; exports.constructMatchContext = constructMatchContext; const applyNodeToContext = (caseNodeOrData, context, runConfig = {}) => combineWithRoot(caseNodeOrData, context, runConfig); exports.applyNodeToContext = applyNodeToContext; const addLocation = (location, context) => updateFunctions({ ...context, 'case:currentRun:context:location': context['case:currentRun:context:location'].concat([location]), }); exports.addLocation = addLocation; const locationString = (matchContext) => matchContext['case:currentRun:context:location'] .filter((locationItem) => (locationItem.startsWith(':') && (0, shouldLog_1.shouldLog)(matchContext, 'maintainerDebug')) || !locationItem.startsWith(':')) .reduce((acc, curr) => curr.startsWith('[') || curr.startsWith(':') || acc === '' ? `${acc}${curr}` : `${acc}.${curr}`, ''); exports.locationString = locationString;