@fgv/ts-utils-jest
Version:
Custom matchers for ts-utils result class
71 lines • 2.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const ts_utils_1 = require("@fgv/ts-utils");
const jest_matcher_utils_1 = require("jest-matcher-utils");
const predicate_1 = require("./predicate");
function getRange(length, cursor) {
// less than 3 return everything
if (length < 3) {
return { start: 0, end: length };
}
if (cursor === 0) {
return { start: 0, end: 3 };
}
else if (cursor >= length - 1) {
return { start: length - 3, end: length };
}
return { start: cursor - 1, end: cursor + 2 };
}
function formatOneCall(index, received, cursor) {
const indexString = index.toLocaleString([], { maximumFractionDigits: 0, minimumIntegerDigits: 3 });
const cursorString = cursor ? '*' : ' ';
return `${cursorString}${indexString}: ${(0, jest_matcher_utils_1.printReceived)(received)}`;
}
function formatArgsMessage(received, cursor) {
const calls = received.mock.calls;
if (calls.length > 0) {
// if there's no cursor, show the last 3
const { start, end } = getRange(calls.length, cursor !== undefined ? cursor : calls.length - 1);
const callsToShow = calls.slice(start, end);
return callsToShow.map((c, i) => formatOneCall(start + i, c, start + i === cursor));
}
return [];
}
function passMessage(received, expected, matched) {
return () => [
(0, jest_matcher_utils_1.matcherHint)(`.not.${predicate_1.matcherName}`),
'Expected no call with arguments matching:',
` ${(0, jest_matcher_utils_1.printExpected)(expected)}`,
`Received (${received.mock.calls.length} total):`,
...formatArgsMessage(received, matched.index)
].join('\n');
}
function failMessage(received, expected) {
return () => [
(0, jest_matcher_utils_1.matcherHint)(`${predicate_1.matcherName}`),
'Expected call with arguments matching:',
` ${(0, jest_matcher_utils_1.printExpected)(expected)}`,
`Received (${received.mock.calls.length} total):`,
...formatArgsMessage(received)
].join('\n');
}
function isMock(received) {
if (received !== null && !Array.isArray(received)) {
return ((0, ts_utils_1.getValueOfPropertyOrDefault)('_isMockFunction', received) === true &&
(0, ts_utils_1.getTypeOfProperty)('mock', received) === 'object');
}
return false;
}
exports.default = {
toHaveBeenCalledWithArgumentsMatching: function (received, expected) {
if (!isMock(received)) {
throw new Error('Test error: toHaveBeenCalledWithArgumentsMatching called with other than jest.Mock');
}
const matched = (0, predicate_1.predicate)(received, expected);
if (matched !== undefined) {
return { pass: true, message: passMessage(received, expected, matched) };
}
return { pass: false, message: failMessage(received, expected) };
}
};
//# sourceMappingURL=index.js.map