From dd690ca905a9fab1901b1c96894dce28874c294a Mon Sep 17 00:00:00 2001 From: Matt Wade Date: Mon, 2 May 2022 01:34:33 -0500 Subject: [PATCH] fix(expect-utils): Treat ImmutableJS Lists as Sets (#12763) --- CHANGELOG.md | 2 ++ packages/expect-utils/package.json | 1 + packages/expect-utils/src/__tests__/utils.test.ts | 8 ++++++++ packages/expect-utils/src/jasmineUtils.ts | 10 +++++++++- packages/expect-utils/src/utils.ts | 11 +++++++---- yarn.lock | 1 + 6 files changed, 28 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c564a0f65481..807fe18cbd6a 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 - `[@jest-reporters]` Move helper functions from `utils.ts` into separate files ([#12782](https://github.com/facebook/jest/pull/12782)) 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..552265c65764 100644 --- a/packages/expect-utils/src/jasmineUtils.ts +++ b/packages/expect-utils/src/jasmineUtils.ts @@ -238,9 +238,10 @@ function isDomNode(obj: any): boolean { ); } -// SENTINEL constants are from https://github.com/facebook/immutable-js +// SENTINEL constants are from https://github.com/immutable-js/immutable-js/tree/main/src/predicates 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 9697812d48a6..eb3464096840 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