in apps/mountebank-mock/mountebank-source/src/models/predicates.js [255:299]
function predicateSatisfied (expected, actual, predicateConfig, predicateFn) {
if (!actual) {
return false;
}
// Support predicates that reach into fields encoded in JSON strings (e.g. HTTP bodies)
if (typeof actual === 'string') {
actual = tryJSON(actual, predicateConfig);
}
return Object.keys(expected).every(fieldName => {
const isObject = helpers.isObject;
if (bothArrays(expected[fieldName], actual[fieldName])) {
return allExpectedArrayValuesMatchActualArray(
expected[fieldName], actual[fieldName], predicateConfig, predicateFn);
}
else if (onlyActualIsArray(expected[fieldName], actual[fieldName])) {
if (predicateConfig.exists && expected[fieldName]) {
return true;
}
else {
return expectedMatchesAtLeastOneValueInActualArray(
expected[fieldName], actual[fieldName], predicateConfig, predicateFn);
}
}
else if (expectedLeftOffArraySyntaxButActualIsArrayOfObjects(expected, actual, fieldName)) {
// This is a little confusing, but predated the ability for users to specify an
// array for the expected values and is left for backwards compatibility.
// The predicate might be:
// { equals: { examples: { key: 'third' } } }
// and the request might be
// { examples: '[{ "key": "first" }, { "different": true }, { "key": "third" }]' }
// We expect that the "key" field in the predicate definition matches any object key
// in the actual array
return expectedMatchesAtLeastOneValueInActualArray(expected, actual, predicateConfig, predicateFn);
}
else if (isObject(expected[fieldName])) {
return predicateSatisfied(expected[fieldName], actual[fieldName], predicateConfig, predicateFn);
}
else {
return testPredicate(expected[fieldName], actual[fieldName], predicateConfig, predicateFn);
}
});
}