mirror of
https://github.com/hexastack/hexabot
synced 2024-12-01 16:51:43 +00:00
65 lines
2.3 KiB
TypeScript
65 lines
2.3 KiB
TypeScript
|
/*
|
||
|
* Copyright © 2024 Hexastack. All rights reserved.
|
||
|
*
|
||
|
* Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms:
|
||
|
* 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission.
|
||
|
* 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file).
|
||
|
* 3. SaaS Restriction: This software, or any derivative of it, may not be used to offer a competing product or service (SaaS) without prior written consent from Hexastack. Offering the software as a service or using it in a commercial cloud environment without express permission is strictly prohibited.
|
||
|
*/
|
||
|
|
||
|
import { diff } from 'jest-diff';
|
||
|
|
||
|
import { IGNORED_TEST_FIELDS } from '@/utils/test/constants';
|
||
|
|
||
|
function recursivelyOmitKeys(obj: any, keysToIgnore: string[]): any {
|
||
|
if (typeof obj !== 'object' || obj === null) {
|
||
|
return obj;
|
||
|
}
|
||
|
|
||
|
if (Array.isArray(obj)) {
|
||
|
return obj.map((item) => recursivelyOmitKeys(item, keysToIgnore));
|
||
|
}
|
||
|
|
||
|
return Object.keys(obj).reduce((acc: any, key: string) => {
|
||
|
if (!keysToIgnore.includes(key)) {
|
||
|
if (typeof obj[key] === 'object' && obj[key] !== null) {
|
||
|
acc[key] = recursivelyOmitKeys(obj[key], keysToIgnore);
|
||
|
} else {
|
||
|
acc[key] = obj[key];
|
||
|
}
|
||
|
}
|
||
|
return acc;
|
||
|
}, {});
|
||
|
}
|
||
|
|
||
|
expect.extend({
|
||
|
toEqualPayload(received, expected, keysToIgnore = IGNORED_TEST_FIELDS) {
|
||
|
const receivedStripped = recursivelyOmitKeys(received, keysToIgnore);
|
||
|
const expectedStripped = recursivelyOmitKeys(expected, keysToIgnore);
|
||
|
|
||
|
const pass = this.equals(receivedStripped, expectedStripped);
|
||
|
|
||
|
const diffString = diff(expectedStripped, receivedStripped, {
|
||
|
expand: this.expand,
|
||
|
});
|
||
|
|
||
|
if (pass) {
|
||
|
return {
|
||
|
pass: true,
|
||
|
message: () =>
|
||
|
`Expected objects to not be equal with keys [${keysToIgnore.join(
|
||
|
', ',
|
||
|
)}] ignored`,
|
||
|
};
|
||
|
} else {
|
||
|
return {
|
||
|
pass: false,
|
||
|
message: () =>
|
||
|
`Expected objects with keys [${keysToIgnore.join(
|
||
|
', ',
|
||
|
)}] ignored to be equal:\n${diffString}`,
|
||
|
};
|
||
|
}
|
||
|
},
|
||
|
});
|