@netly/jest-sorted-by
Version:
Sort array validation for jest
49 lines (48 loc) • 1.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
function defaultComparator(a, b) {
if (a > b)
return 1;
if (a < b)
return -1;
return 0;
}
function toBeSortedBy(received, options = {}) {
const array = received;
if (!Array.isArray(array)) {
return {
pass: false,
message: () => `${array} is not iterable and cannot be sorted`,
};
}
const { descending = false, key, strict = false, comparator = defaultComparator } = options;
const descMult = descending ? -1 : 1;
const arrayMsg = key ? `Array(${array.length})` : `[${array}]`;
const orderMsg = descending ? 'descending' : 'ascending';
let keyMsg = key ? `by ${key} ` : '';
let failingElements = '';
let pass = true;
for (let i = 0; i < array.length - 1; i++) {
const element = key ? array[i]?.[key] : array[i];
const nextElement = key ? array[i + 1]?.[key] : array[i + 1];
if (key && strict && !(key in array[i])) {
pass = false;
keyMsg = `by a missing key, ${key}, `;
break;
}
if (descMult * comparator(element, nextElement) > 0) {
pass = false;
const elementOrder = descending ? 'before' : 'after';
failingElements = `\nExpected ${JSON.stringify(element)} to be ${elementOrder} ${JSON.stringify(nextElement)}`;
break;
}
}
const passMsg = pass ? 'not ' : '';
const errMsg = `Expected ${arrayMsg} to ${passMsg}be sorted ${keyMsg}in ${orderMsg} order${failingElements}`;
return {
pass,
message: () => errMsg,
};
}
exports.default = toBeSortedBy;
expect.extend({ toBeSortedBy });