diff --git a/CHANGELOG.md b/CHANGELOG.md index 18b0b770a7bc..039968ce1d74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ - `[expect]` Fix non-object received value in toHaveProperty ([#7986](https://github.com/facebook/jest/pull/7986)) - `[jest-jasmine2]`: Throw explicit error when errors happen after test is considered complete ([#8005](https://github.com/facebook/jest/pull/8005)) - `[jest-circus]`: Throw explicit error when errors happen after test is considered complete ([#8005](https://github.com/facebook/jest/pull/8005)) +- `[expect]` Remove duck typing and obsolete browser support code when comparing DOM nodes and use DOM-Level-3 API instead ([#7995](https://github.com/facebook/jest/pull/7995)) ### Chore & Maintenance diff --git a/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap b/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap index 3b43f553d7d3..f236cb1e4902 100644 --- a/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap +++ b/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap @@ -1996,6 +1996,28 @@ Expected: {\\"a\\": 99} Received: {\\"a\\": 99}" `; +exports[`.toEqual() {pass: false} expect({"nodeName": "div", "nodeType": 1}).not.toEqual({"nodeName": "div", "nodeType": 1}) 1`] = ` +"expect(received).not.toEqual(expected) + +Expected: {\\"nodeName\\": \\"div\\", \\"nodeType\\": 1} +Received: {\\"nodeName\\": \\"div\\", \\"nodeType\\": 1}" +`; + +exports[`.toEqual() {pass: false} expect({"nodeName": "div", "nodeType": 1}).toEqual({"nodeName": "p", "nodeType": 1}) 1`] = ` +"expect(received).toEqual(expected) + +Difference: + +- Expected ++ Received + + Object { +- \\"nodeName\\": \\"p\\", ++ \\"nodeName\\": \\"div\\", + \\"nodeType\\": 1, + }" +`; + exports[`.toEqual() {pass: false} expect({"target": {"nodeType": 1, "value": "a"}}).toEqual({"target": {"nodeType": 1, "value": "b"}}) 1`] = ` "expect(received).toEqual(expected) diff --git a/packages/expect/src/__tests__/matchers.test.js b/packages/expect/src/__tests__/matchers.test.js index 6b4b90788672..8f79c49c15c4 100644 --- a/packages/expect/src/__tests__/matchers.test.js +++ b/packages/expect/src/__tests__/matchers.test.js @@ -417,6 +417,16 @@ describe('.toEqual()', () => { }, }, ], + [ + { + nodeName: 'div', + nodeType: 1, + }, + { + nodeName: 'p', + nodeType: 1, + }, + ], ].forEach(([a, b]) => { test(`{pass: false} expect(${stringify(a)}).toEqual(${stringify( b, @@ -537,6 +547,16 @@ describe('.toEqual()', () => { }, }, ], + [ + { + nodeName: 'div', + nodeType: 1, + }, + { + nodeName: 'div', + nodeType: 1, + }, + ], ].forEach(([a, b]) => { test(`{pass: false} expect(${stringify(a)}).not.toEqual(${stringify( b, diff --git a/packages/expect/src/jasmineUtils.ts b/packages/expect/src/jasmineUtils.ts index f16bc5aeaa64..7636ec9c2274 100644 --- a/packages/expect/src/jasmineUtils.ts +++ b/packages/expect/src/jasmineUtils.ts @@ -129,24 +129,9 @@ function eq( var aIsDomNode = isDomNode(a); var bIsDomNode = isDomNode(b); - if (aIsDomNode && bIsDomNode) { - // At first try to use DOM3 method isEqualNode - if (a.isEqualNode) { - return a.isEqualNode(b); - } - // IE8 doesn't support isEqualNode, try to use outerHTML && innerText - var aIsElement = a instanceof Element; - var bIsElement = b instanceof Element; - if (aIsElement && bIsElement) { - return a.outerHTML == b.outerHTML; - } - if (aIsElement || bIsElement) { - return false; - } - return a.innerText == b.innerText && a.textContent == b.textContent; - } - if (aIsDomNode || bIsDomNode) { - return false; + // Use DOM3 method isEqualNode (IE>=9) + if (aIsDomNode && typeof a.isEqualNode === 'function' && bIsDomNode) { + return a.isEqualNode(b); } // Used to detect circular references. @@ -263,12 +248,9 @@ export function isA(typeName: string, value: unknown) { } function isDomNode(obj: any): obj is Node { - return ( - obj !== null && - typeof obj === 'object' && - typeof obj.nodeType === 'number' && - typeof obj.nodeName === 'string' - ); + // In some test environments (e.g. "node") there is no `Node` even though + // we might be comparing things that look like DOM nodes. + return typeof Node !== 'undefined' && obj instanceof Node; } export function fnNameFor(func: Function) {