@case-contract-testing/case
Version:
Next-generation contract testing suite
98 lines (97 loc) • 3.91 kB
JavaScript
;
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;