From 8e11fcc59f1c93fee5e936427375c7b921708769 Mon Sep 17 00:00:00 2001 From: romellem Date: Wed, 27 Apr 2022 23:27:22 -0500 Subject: [PATCH] fix(expect-utils): Skip ImmutableList entries check Some of their internal properties may not match, but they should be considered equal. --- CHANGELOG.md | 2 ++ packages/expect-utils/package.json | 1 + packages/expect-utils/src/__tests__/utils.test.ts | 8 ++++++++ packages/expect-utils/src/jasmineUtils.ts | 8 ++++++++ packages/expect-utils/src/utils.ts | 11 +++++++---- yarn.lock | 1 + 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6f60fb932f5..8d795101bf9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ ### Fixes +- `[@jest/expect-utils]` Fix deep equality of ImmutableJS Lists ([#12763](https://github.com/facebook/jest/pull/12763)) + ### Chore & Maintenance ### Performance diff --git a/packages/expect-utils/package.json b/packages/expect-utils/package.json index 1d2f5c2a2f8d..cacc8f0a8778 100644 --- a/packages/expect-utils/package.json +++ b/packages/expect-utils/package.json @@ -20,6 +20,7 @@ "jest-get-type": "^28.0.2" }, "devDependencies": { + "immutable": "^4.0.0", "jest-matcher-utils": "^28.0.2" }, "engines": { diff --git a/packages/expect-utils/src/__tests__/utils.test.ts b/packages/expect-utils/src/__tests__/utils.test.ts index 09b6574e9164..d5fc11521e75 100644 --- a/packages/expect-utils/src/__tests__/utils.test.ts +++ b/packages/expect-utils/src/__tests__/utils.test.ts @@ -6,6 +6,7 @@ * */ +import {List} from 'immutable'; import {stringify} from 'jest-matcher-utils'; import { arrayBufferEquality, @@ -517,6 +518,13 @@ describe('iterableEquality', () => { expect(iterableEquality(a, b)).toBe(true); }); + + test('returns true when given Immutable Lists without an OwnerID', () => { + const a = List([1, 2, 3]); + const b = a.filter(v => v > 0); + + expect(iterableEquality(a, b)).toBe(true); + }); }); describe('arrayBufferEquality', () => { diff --git a/packages/expect-utils/src/jasmineUtils.ts b/packages/expect-utils/src/jasmineUtils.ts index c539cb5e798e..8a3122b8a22c 100644 --- a/packages/expect-utils/src/jasmineUtils.ts +++ b/packages/expect-utils/src/jasmineUtils.ts @@ -241,6 +241,7 @@ function isDomNode(obj: any): boolean { // SENTINEL constants are from https://github.com/facebook/immutable-js const IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@'; const IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@'; +const IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@'; const IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@'; export function isImmutableUnorderedKeyed(maybeKeyed: any) { @@ -258,3 +259,10 @@ export function isImmutableUnorderedSet(maybeSet: any) { !maybeSet[IS_ORDERED_SENTINEL] ); } + +export function isImmutableList(maybeList: any) { + return !!( + maybeList && + maybeList[IS_LIST_SENTINEL] + ); +} diff --git a/packages/expect-utils/src/utils.ts b/packages/expect-utils/src/utils.ts index 7dbd4d124cbf..a16522eb38e6 100644 --- a/packages/expect-utils/src/utils.ts +++ b/packages/expect-utils/src/utils.ts @@ -10,6 +10,7 @@ import {isPrimitive} from 'jest-get-type'; import { equals, isA, + isImmutableList, isImmutableUnorderedKeyed, isImmutableUnorderedSet, } from './jasmineUtils'; @@ -254,10 +255,12 @@ export const iterableEquality = ( return false; } - const aEntries = Object.entries(a); - const bEntries = Object.entries(b); - if (!equals(aEntries, bEntries)) { - return false; + if (!isImmutableList(a)) { + const aEntries = Object.entries(a); + const bEntries = Object.entries(b); + if (!equals(aEntries, bEntries)) { + return false; + } } // Remove the first value from the stack of traversed values. diff --git a/yarn.lock b/yarn.lock index 001344e5fbce..cb1c7b76ed97 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2606,6 +2606,7 @@ __metadata: version: 0.0.0-use.local resolution: "@jest/expect-utils@workspace:packages/expect-utils" dependencies: + immutable: ^4.0.0 jest-get-type: ^28.0.2 jest-matcher-utils: ^28.0.2 languageName: unknown