From 61a4a743a2d01357430af83c1a6f5eea4fa9d680 Mon Sep 17 00:00:00 2001 From: Dave Normington Date: Fri, 21 Jan 2022 11:39:01 +0000 Subject: [PATCH] fix(matcher-utils): correct diff for expect asymmetric matchers --- .../__snapshots__/matchers.test.js.snap | 19 +++++++++-- .../__snapshots__/index.test.ts.snap | 19 +++++++++++ .../src/__tests__/index.test.ts | 34 +++++++++++++++++++ packages/jest-matcher-utils/src/index.ts | 7 ---- 4 files changed, 70 insertions(+), 9 deletions(-) diff --git a/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap b/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap index 16f85cccd725..5085d0b677e8 100644 --- a/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap +++ b/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap @@ -2175,8 +2175,15 @@ Received: {"0": "a", "1": "b", "2": "c"} exports[`.toEqual() {pass: false} expect({"a": 1, "b": 2}).toEqual(ObjectContaining {"a": 2}) 1`] = ` expect(received).toEqual(expected) // deep equality -Expected: ObjectContaining {"a": 2} -Received: {"a": 1, "b": 2} +- Expected - 2 ++ Received + 3 + +- ObjectContaining { +- "a": 2, ++ Object { ++ "a": 1, ++ "b": 2, + } `; exports[`.toEqual() {pass: false} expect({"a": 1}).toEqual({"a": 2}) 1`] = ` @@ -3560,6 +3567,14 @@ Expected path: "memo" Expected value: not [] `; +exports[`.toHaveProperty() {pass: true} expect({"": 1}).toHaveProperty('', 1) 1`] = ` +expect(received).not.toHaveProperty(path, value) + +Expected path: "" + +Expected value: not 1 +`; + exports[`.toHaveProperty() {pass: true} expect({"a": {"b": [[{"c": [{"d": 1}]}]]}}).toHaveProperty('a.b[0][0].c[0].d', 1) 1`] = ` expect(received).not.toHaveProperty(path, value) diff --git a/packages/jest-matcher-utils/src/__tests__/__snapshots__/index.test.ts.snap b/packages/jest-matcher-utils/src/__tests__/__snapshots__/index.test.ts.snap index 449a8ac82a93..a89c3850194b 100644 --- a/packages/jest-matcher-utils/src/__tests__/__snapshots__/index.test.ts.snap +++ b/packages/jest-matcher-utils/src/__tests__/__snapshots__/index.test.ts.snap @@ -88,6 +88,25 @@ exports[`ensureNumbers() with options promise resolves isNot true expected 1`] = Expected has value: null `; +exports[`printDiffOrStringify expected asymmetric matchers should be diffable 1`] = ` +- Expected - 2 ++ Received + 2 + +- ObjectContaining { ++ Object { + "array": Array [ + Object { + "3": "three", + "four": "4", + "one": 1, +- "two": 2, ++ "two": 1, + }, + ], + "foo": "bar", + } +`; + exports[`stringify() toJSON errors when comparing two objects 1`] = ` expect(received).toEqual(expected) // deep equality diff --git a/packages/jest-matcher-utils/src/__tests__/index.test.ts b/packages/jest-matcher-utils/src/__tests__/index.test.ts index 668307405512..9ed9cc9e17e3 100644 --- a/packages/jest-matcher-utils/src/__tests__/index.test.ts +++ b/packages/jest-matcher-utils/src/__tests__/index.test.ts @@ -342,3 +342,37 @@ describe('matcherHint', () => { expect(received).toMatch(substringPositive); }); }); + +describe('printDiffOrStringify', () => { + test('expected asymmetric matchers should be diffable', () => { + jest.dontMock('jest-diff'); + jest.resetModules(); + const {printDiffOrStringify} = require('../'); + + const expected = expect.objectContaining({ + array: [ + { + 3: 'three', + four: '4', + one: 1, + two: 2, + }, + ], + foo: 'bar', + }); + const received = { + array: [ + { + 3: 'three', + four: '4', + one: 1, + two: 1, + }, + ], + foo: 'bar', + }; + expect( + printDiffOrStringify(expected, received, 'Expected', 'Received', false), + ).toMatchSnapshot(); + }); +}); diff --git a/packages/jest-matcher-utils/src/index.ts b/packages/jest-matcher-utils/src/index.ts index 84aca72cd345..7210d37c624c 100644 --- a/packages/jest-matcher-utils/src/index.ts +++ b/packages/jest-matcher-utils/src/index.ts @@ -293,13 +293,6 @@ const isLineDiffable = (expected: unknown, received: unknown): boolean => { return false; } - if ( - expectedType === 'object' && - typeof (expected as any).asymmetricMatch === 'function' - ) { - return false; - } - if ( receivedType === 'object' && typeof (received as any).asymmetricMatch === 'function'