From 54e30576223d759ebeb6db46b5434cff76909161 Mon Sep 17 00:00:00 2001 From: Grzegorz Ziolkowski Date: Fri, 20 Oct 2017 11:31:48 +0200 Subject: [PATCH] Testing: Upgrade React and Enzyme to the latest version --- blocks/test/fixtures/core__cover-image.html | 2 +- blocks/test/fixtures/core__cover-image.json | 2 +- .../fixtures/core__cover-image.parsed.json | 2 +- .../core__cover-image.serialized.html | 2 +- ...re__paragraph__align-right.serialized.html | 2 +- components/dropdown-menu/test/index.js | 2 +- components/dropdown/test/index.js | 40 +- components/navigable-menu/test/index.js | 1 + components/panel/test/header.js | 6 +- components/panel/test/index.js | 1 - components/popover/test/index.js | 4 +- components/tooltip/test/index.js | 9 +- editor/inserter/menu.js | 4 +- editor/inserter/test/menu.js | 1 + element/index.js | 4 +- element/test/index.js | 12 +- package-lock.json | 448 ++++++++++++++---- package.json | 11 +- test/setup-console.js | 10 - test/setup-test-framework.js | 45 +- 20 files changed, 429 insertions(+), 179 deletions(-) delete mode 100644 test/setup-console.js diff --git a/blocks/test/fixtures/core__cover-image.html b/blocks/test/fixtures/core__cover-image.html index de557f4357676c..935452ed8f0f46 100644 --- a/blocks/test/fixtures/core__cover-image.html +++ b/blocks/test/fixtures/core__cover-image.html @@ -1,5 +1,5 @@ -
+

Guten Berg!

diff --git a/blocks/test/fixtures/core__cover-image.json b/blocks/test/fixtures/core__cover-image.json index a8b2f95c682ef6..8fdfd14e7515e2 100644 --- a/blocks/test/fixtures/core__cover-image.json +++ b/blocks/test/fixtures/core__cover-image.json @@ -11,6 +11,6 @@ "hasParallax": false, "dimRatio": 40 }, - "originalContent": "
\n

Guten Berg!

\n
" + "originalContent": "
\n

Guten Berg!

\n
" } ] diff --git a/blocks/test/fixtures/core__cover-image.parsed.json b/blocks/test/fixtures/core__cover-image.parsed.json index 9d337ce943ef1b..6bbf8081491b59 100644 --- a/blocks/test/fixtures/core__cover-image.parsed.json +++ b/blocks/test/fixtures/core__cover-image.parsed.json @@ -5,7 +5,7 @@ "url": "https://cldup.com/uuUqE_dXzy.jpg", "dimRatio": 40 }, - "rawContent": "\n
\n

Guten Berg!

\n
\n" + "rawContent": "\n
\n

Guten Berg!

\n
\n" }, { "attrs": {}, diff --git a/blocks/test/fixtures/core__cover-image.serialized.html b/blocks/test/fixtures/core__cover-image.serialized.html index f2eb58b9e32cd6..35427b2cd64b89 100644 --- a/blocks/test/fixtures/core__cover-image.serialized.html +++ b/blocks/test/fixtures/core__cover-image.serialized.html @@ -1,5 +1,5 @@ -
+

Guten Berg!

diff --git a/blocks/test/fixtures/core__paragraph__align-right.serialized.html b/blocks/test/fixtures/core__paragraph__align-right.serialized.html index 4ec4638ee27b8d..3e18265b5c44b1 100644 --- a/blocks/test/fixtures/core__paragraph__align-right.serialized.html +++ b/blocks/test/fixtures/core__paragraph__align-right.serialized.html @@ -1,3 +1,3 @@ -

... like this one, which is separate from the above and right aligned.

+

... like this one, which is separate from the above and right aligned.

diff --git a/components/dropdown-menu/test/index.js b/components/dropdown-menu/test/index.js index e8cb9fbf5d1c99..bcfde6cf10fbd0 100644 --- a/components/dropdown-menu/test/index.js +++ b/components/dropdown-menu/test/index.js @@ -59,7 +59,7 @@ describe( 'DropdownMenu', () => { const wrapper = mount( ); // Close menu by keyup - wrapper.find( '.components-dropdown-menu__toggle' ).simulate( 'keydown', { + wrapper.find( 'button.components-dropdown-menu__toggle' ).simulate( 'keydown', { stopPropagation: () => {}, preventDefault: () => {}, keyCode: DOWN, diff --git a/components/dropdown/test/index.js b/components/dropdown/test/index.js index 3ba2557d3fad72..c2dca82617c44f 100644 --- a/components/dropdown/test/index.js +++ b/components/dropdown/test/index.js @@ -9,7 +9,13 @@ import { mount } from 'enzyme'; import Dropdown from '../'; describe( 'Dropdown', () => { + const expectPopoverOpened = ( wrapper, opened ) => expect( wrapper.find( 'Popover' ) ).toHaveProp( 'isOpen', opened ); + it( 'should toggle the dropdown properly', () => { + const expectButtonExpanded = ( wrapper, expanded ) => { + expect( wrapper.find( 'button' ) ).toHaveLength( 1 ); + expect( wrapper.find( 'button' ) ).toHaveProp( 'aria-expanded', expanded ); + }; const wrapper = mount( { renderContent={ () => null } /> ); - const button = wrapper.find( 'button' ); - const popover = wrapper.find( 'Popover' ); + expectButtonExpanded( wrapper, false ); + expectPopoverOpened( wrapper, false ); + + wrapper.find( 'button' ).simulate( 'click' ); + wrapper.update(); - expect( button ).toHaveLength( 1 ); - expect( popover.prop( 'isOpen' ) ).toBe( false ); - expect( button.prop( 'aria-expanded' ) ).toBe( false ); - button.simulate( 'click' ); - expect( popover.prop( 'isOpen' ) ).toBe( true ); - expect( button.prop( 'aria-expanded' ) ).toBe( true ); + expectButtonExpanded( wrapper, true ); + expectPopoverOpened( wrapper, true ); } ); it( 'should close the dropdown when calling onClose', () => { @@ -41,13 +46,16 @@ describe( 'Dropdown', () => { renderContent={ () => null } /> ); - const openButton = wrapper.find( '.open' ); - const closeButton = wrapper.find( '.close' ); - const popover = wrapper.find( 'Popover' ); - expect( popover.prop( 'isOpen' ) ).toBe( false ); - openButton.simulate( 'click' ); - expect( popover.prop( 'isOpen' ) ).toBe( true ); - closeButton.simulate( 'click' ); - expect( popover.prop( 'isOpen' ) ).toBe( false ); + expectPopoverOpened( wrapper, false ); + + wrapper.find( '.open' ).simulate( 'click' ); + wrapper.update(); + + expectPopoverOpened( wrapper, true ); + + wrapper.find( '.close' ).simulate( 'click' ); + wrapper.update(); + + expectPopoverOpened( wrapper, false ); } ); } ); diff --git a/components/navigable-menu/test/index.js b/components/navigable-menu/test/index.js index e14f21bedb7fcb..c9e4fa28dadc2e 100644 --- a/components/navigable-menu/test/index.js +++ b/components/navigable-menu/test/index.js @@ -18,6 +18,7 @@ const { UP, DOWN } = keycodes; describe( 'NavigableMenu', () => { // Skipping this this because the `isVisible` check in utils/focus/tabbable.js always returns false in tests // Probbably a jsdom issue + // eslint-disable-next-line jest/no-disabled-tests it.skip( 'should navigate by keypresses', () => { let currentIndex = 0; const wrapper = mount( ( diff --git a/components/panel/test/header.js b/components/panel/test/header.js index 6946f809e81e73..1955042e5c4ff2 100644 --- a/components/panel/test/header.js +++ b/components/panel/test/header.js @@ -14,7 +14,7 @@ describe( 'PanelHeader', () => { const panelHeader = shallow( ); expect( panelHeader.hasClass( 'components-panel__header' ) ).toBe( true ); expect( panelHeader.type() ).toBe( 'div' ); - expect( panelHeader.find( 'div' ).shallow().children().length ).toBe( 0 ); + expect( panelHeader.find( 'div' ).shallow().children() ).toHaveLength( 0 ); } ); it( 'should render a label matching the text provided in the prop', () => { @@ -26,13 +26,13 @@ describe( 'PanelHeader', () => { it( 'should render child elements in the panel header body when provided', () => { const panelHeader = shallow( ); - expect( panelHeader.instance().props.children ).toBe( 'Some Text' ); expect( panelHeader.text() ).toBe( 'Some Text' ); + expect( panelHeader.find( 'div' ).shallow().children() ).toHaveLength( 1 ); } ); it( 'should render both child elements and label when passed in', () => { const panelHeader = shallow( ); - expect( panelHeader.find( 'div' ).shallow().children().length ).toBe( 2 ); + expect( panelHeader.find( 'div' ).shallow().children() ).toHaveLength( 2 ); } ); } ); } ); diff --git a/components/panel/test/index.js b/components/panel/test/index.js index 3750eb798f0092..d5ac90b30a9cec 100644 --- a/components/panel/test/index.js +++ b/components/panel/test/index.js @@ -31,7 +31,6 @@ describe( 'Panel', () => { it( 'should add additional child elements to be rendered in the panel', () => { const panel = shallow( ); - expect( panel.instance().props.children ).toBe( 'The Panel' ); expect( panel.text() ).toBe( 'The Panel' ); expect( panel.find( 'div' ).shallow().children().length ).toBe( 1 ); } ); diff --git a/components/popover/test/index.js b/components/popover/test/index.js index 9aebd30546210b..e3a2934ca07a63 100644 --- a/components/popover/test/index.js +++ b/components/popover/test/index.js @@ -262,13 +262,13 @@ describe( 'Popover', () => { } ); it( 'should render content if popover is open', () => { - const wrapper = shallow( Hello ); + const wrapper = shallow( Hello, { disableLifecycleMethods: true } ); expect( wrapper.type() ).not.toBeNull(); } ); it( 'should pass additional to portaled element', () => { - const wrapper = shallow( Hello ); + const wrapper = shallow( Hello, { disableLifecycleMethods: true } ); expect( wrapper.find( '.components-popover' ).prop( 'role' ) ).toBe( 'tooltip' ); } ); diff --git a/components/tooltip/test/index.js b/components/tooltip/test/index.js index 9fb1bc4248da64..4719d9a9a473ec 100644 --- a/components/tooltip/test/index.js +++ b/components/tooltip/test/index.js @@ -67,6 +67,8 @@ describe( 'Tooltip', () => { } ); it( 'should show popover on delayed mouseenter', () => { + const expectPopoverOpened = ( wrapper, opened ) => expect( wrapper.find( 'Popover' ) ).toHaveProp( 'isOpen', opened ); + // Mount: Issues with using `setState` asynchronously with shallow- // rendered components: https://github.com/airbnb/enzyme/issues/450 const originalMouseEnter = jest.fn(); @@ -86,14 +88,13 @@ describe( 'Tooltip', () => { expect( originalMouseEnter ).toHaveBeenCalled(); - const popover = wrapper.find( 'Popover' ); expect( wrapper.state( 'isOver' ) ).toBe( false ); - expect( popover.prop( 'isOpen' ) ).toBe( false ); - + expectPopoverOpened( wrapper, false ); wrapper.instance().delayedSetIsOver.flush(); + wrapper.update(); expect( wrapper.state( 'isOver' ) ).toBe( true ); - expect( popover.prop( 'isOpen' ) ).toBe( true ); + expectPopoverOpened( wrapper, true ); } ); it( 'should ignore mouseenter on disabled elements', () => { diff --git a/editor/inserter/menu.js b/editor/inserter/menu.js index 785688db1a20ef..4e1b9c671336cf 100644 --- a/editor/inserter/menu.js +++ b/editor/inserter/menu.js @@ -290,8 +290,8 @@ export class InserterMenu extends Component { onClick={ this.selectBlock( block.name ) } ref={ this.bindReferenceNode( block.name ) } tabIndex="-1" - onMouseEnter={ ! disabled && this.props.showInsertionPoint } - onMouseLeave={ ! disabled && this.props.hideInsertionPoint } + onMouseEnter={ ! disabled ? this.props.showInsertionPoint : null } + onMouseLeave={ ! disabled ? this.props.hideInsertionPoint : null } disabled={ disabled } > diff --git a/editor/inserter/test/menu.js b/editor/inserter/test/menu.js index 6d0cac974c3c6e..9c897f165107ed 100644 --- a/editor/inserter/test/menu.js +++ b/editor/inserter/test/menu.js @@ -181,6 +181,7 @@ describe( 'InserterMenu', () => { const blocksTab = wrapper.find( '.editor-inserter__tab' ) .filterWhere( ( node ) => node.text() === 'Blocks' ); blocksTab.simulate( 'click' ); + wrapper.update(); const disabledBlocks = wrapper.find( '.editor-inserter__block[disabled]' ); expect( disabledBlocks.length ).toBe( 1 ); diff --git a/element/index.js b/element/index.js index 0621ff77a5ba05..97c8ef990fd63f 100644 --- a/element/index.js +++ b/element/index.js @@ -2,7 +2,7 @@ * External dependencies */ import { createElement, Component, cloneElement, Children } from 'react'; -import { render, findDOMNode, unstable_createPortal } from 'react-dom'; // eslint-disable-line camelcase +import { render, findDOMNode, createPortal } from 'react-dom'; import { renderToStaticMarkup } from 'react-dom/server'; import { isString } from 'lodash'; @@ -59,7 +59,7 @@ export { Children }; * @param {Component} component Component * @param {Element} target DOM node into which element should be rendered */ -export { unstable_createPortal as createPortal }; // eslint-disable-line camelcase +export { createPortal }; /** * Renders a given element into a string diff --git a/element/test/index.js b/element/test/index.js index af03702b956f5a..e6a0df53d4cdf9 100644 --- a/element/test/index.js +++ b/element/test/index.js @@ -5,11 +5,19 @@ import { createElement, renderToString, concatChildren, switchChildrenNodeName } describe( 'element', () => { describe( 'renderToString', () => { - it( 'should return an empty string for a falsey value', () => { + it( 'should return an empty string for booleans/null/undefined values', () => { expect( renderToString() ).toBe( '' ); expect( renderToString( false ) ).toBe( '' ); + expect( renderToString( true ) ).toBe( '' ); expect( renderToString( null ) ).toBe( '' ); - expect( renderToString( 0 ) ).toBe( '' ); + } ); + + it( 'should return a string 0', () => { + expect( renderToString( 0 ) ).toBe( '0' ); + } ); + + it( 'should return a string 12345', () => { + expect( renderToString( 12345 ) ).toBe( '12345' ); } ); it( 'should return a string verbatim', () => { diff --git a/package-lock.json b/package-lock.json index 54293aecb1b9a1..99b03ee9298368 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,12 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/node": { + "version": "6.0.90", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.90.tgz", + "integrity": "sha512-tXoGRVdi7wZX7P1VWoV9Wfk0uYDOAHdEYXAttuWgSrN76Q32wQlSrMX0Rgyv3RTEaQY2ZLQrzYHVM2e8rfo8sA==", + "dev": true + }, "@wordpress/a11y": { "version": "0.1.0-beta.1", "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-0.1.0-beta.1.tgz", @@ -1470,27 +1476,28 @@ } }, "cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", "dev": true, "requires": { "css-select": "1.2.0", "dom-serializer": "0.1.0", "entities": "1.1.1", "htmlparser2": "3.9.2", - "lodash.assignin": "4.2.0", - "lodash.bind": "4.2.1", - "lodash.defaults": "4.2.0", - "lodash.filter": "4.6.0", - "lodash.flatten": "4.4.0", - "lodash.foreach": "4.5.0", - "lodash.map": "4.6.0", - "lodash.merge": "4.6.0", - "lodash.pick": "4.4.0", - "lodash.reduce": "4.6.0", - "lodash.reject": "4.6.0", - "lodash.some": "4.6.0" + "lodash": "4.17.4", + "parse5": "3.0.2" + }, + "dependencies": { + "parse5": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz", + "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA=", + "dev": true, + "requires": { + "@types/node": "6.0.90" + } + } } }, "chokidar": { @@ -1641,6 +1648,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "colors": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", + "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", + "dev": true + }, "combined-stream": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", @@ -2062,6 +2075,27 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "deep-equal-ident": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal-ident/-/deep-equal-ident-1.1.1.tgz", + "integrity": "sha1-BvS4nlNxDNbOpKd4HHqVZkLejck=", + "dev": true, + "requires": { + "lodash.isequal": "3.0.4" + }, + "dependencies": { + "lodash.isequal": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-3.0.4.tgz", + "integrity": "sha1-HDXrO27wzR/1F0Pj6jz3/f/ay2Q=", + "dev": true, + "requires": { + "lodash._baseisequal": "3.0.7", + "lodash._bindcallback": "3.0.1" + } + } + } + }, "deep-freeze": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", @@ -2172,6 +2206,12 @@ "randombytes": "2.0.5" } }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "dev": true + }, "doctrine": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", @@ -2333,12 +2373,12 @@ "dev": true }, "enzyme": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-2.9.1.tgz", - "integrity": "sha1-B9XOaRJBJA+4F78sSxjW5TAkDfY=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.1.0.tgz", + "integrity": "sha1-2MqECFeQ+87G7UC63RRHj67kwlo=", "dev": true, "requires": { - "cheerio": "0.22.0", + "cheerio": "1.0.0-rc.2", "function.prototype.name": "1.0.3", "is-subset": "0.1.1", "lodash": "4.17.4", @@ -2346,8 +2386,78 @@ "object.assign": "4.0.4", "object.entries": "1.0.4", "object.values": "1.0.4", + "raf": "3.4.0", + "rst-selector-parser": "2.2.2" + } + }, + "enzyme-adapter-react-16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.2.tgz", + "integrity": "sha512-ePlf3ikzau4NatDCzBP1Y/rFgLhR6MnS1YQVrxD2KXFI31nE1HtL+6ciqALF8kHe5q7Y7lFAd1MYOLIriRqgcw==", + "dev": true, + "requires": { + "enzyme-adapter-utils": "1.0.1", + "lodash": "4.17.4", + "object.assign": "4.0.4", + "object.values": "1.0.4", "prop-types": "15.5.10", - "uuid": "3.1.0" + "react-test-renderer": "16.0.0" + }, + "dependencies": { + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "dev": true, + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.14" + } + }, + "react-test-renderer": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.0.0.tgz", + "integrity": "sha1-n+e4MI8vcfKfw1bUECCG8THJyxU=", + "dev": true, + "requires": { + "fbjs": "0.8.16", + "object-assign": "4.1.1" + } + } + } + }, + "enzyme-adapter-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.0.1.tgz", + "integrity": "sha1-/NgSIzOaVaMS91UmQeBFxAQIQAk=", + "dev": true, + "requires": { + "lodash": "4.17.4", + "object.assign": "4.0.4", + "prop-types": "15.5.10" + } + }, + "enzyme-matchers": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/enzyme-matchers/-/enzyme-matchers-4.0.1.tgz", + "integrity": "sha512-cCA5FmPvx2+3UojHJZFuMDekanVOQA7VeneU8daFyCS4BeGAK9doujxpdsYMqUO9jG9Xv6/8sTzUAhvFH0dkJQ==", + "dev": true, + "requires": { + "deep-equal-ident": "1.1.1" + } + }, + "enzyme-to-json": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.1.4.tgz", + "integrity": "sha512-bGXQxsbVdRqn3ebWej90ADH+RmlKXwy4SgMWc1gG4oDKlVHEsu2eP6hMA4zFGMlQqTxgyd1XPcsryo6Ti4YG+Q==", + "dev": true, + "requires": { + "lodash": "4.17.4" } }, "errno": { @@ -3871,7 +3981,7 @@ "function.prototype.name": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.0.3.tgz", - "integrity": "sha1-AJmuVXLp3W8DyX0CP9krzF5jnqw=", + "integrity": "sha512-5EblxZUdioXi2JiMZ9FUbwYj40eQ9MFHyzFLBSPdlRl3SO8l7SLWuAnQ/at/1Wi4hjJwME/C5WpF2ZfAc8nGNw==", "dev": true, "requires": { "define-properties": "1.1.2", @@ -5147,6 +5257,16 @@ "jest-util": "21.2.1" } }, + "jest-enzyme": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jest-enzyme/-/jest-enzyme-4.0.1.tgz", + "integrity": "sha512-ywJDk3yK2zMDq4zdmdv527VEOyGF2RQJdWnesbNE+fD0Vrk1tfuzb9vqGAOhXMs6yIxNn5XzAa7wpbmyTQnhdg==", + "dev": true, + "requires": { + "enzyme-matchers": "4.0.1", + "enzyme-to-json": "3.1.4" + } + }, "jest-get-type": { "version": "21.2.0", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", @@ -6064,22 +6184,33 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.4.tgz", "integrity": "sha1-3MHXVS4VCgZABzupyzHXDwMpUOc=" }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "lodash._baseisequal": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz", + "integrity": "sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE=", + "dev": true, + "requires": { + "lodash.isarray": "3.0.4", + "lodash.istypedarray": "3.0.6", + "lodash.keys": "3.1.2" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", "dev": true }, - "lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", "dev": true }, - "lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=", + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, "lodash.clonedeep": { @@ -6088,28 +6219,22 @@ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", "dev": true }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", "dev": true }, "lodash.isequal": { @@ -6123,17 +6248,22 @@ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", "dev": true }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "lodash.istypedarray": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", + "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=", "dev": true }, - "lodash.merge": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", - "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=", - "dev": true + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } }, "lodash.mergewith": { "version": "4.6.0", @@ -6141,30 +6271,6 @@ "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", "dev": true }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", - "dev": true - }, - "lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=", - "dev": true - }, - "lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=", - "dev": true - }, - "lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", - "dev": true - }, "lodash.tail": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", @@ -6451,6 +6557,17 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "nearley": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.11.0.tgz", + "integrity": "sha512-clqqhEuP0ZCJQ85Xv2I/4o2Gs/fvSR6fCg5ZHVE2c8evWyNk2G++ih4JOO3lMb/k/09x6ihQ2nzKUlB/APCWjg==", + "dev": true, + "requires": { + "nomnom": "1.6.2", + "railroad-diagrams": "1.0.0", + "randexp": "0.4.6" + } + }, "node-fetch": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.2.tgz", @@ -6594,6 +6711,16 @@ } } }, + "nomnom": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", + "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", + "dev": true, + "requires": { + "colors": "0.5.1", + "underscore": "1.4.4" + } + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -7288,6 +7415,39 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "dev": true, + "requires": { + "performance-now": "2.1.0" + }, + "dependencies": { + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + } + } + }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "requires": { + "discontinuous-range": "1.0.0", + "ret": "0.1.15" + } + }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", @@ -7345,15 +7505,40 @@ "dev": true }, "react": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/react/-/react-15.6.1.tgz", - "integrity": "sha1-uqhDTsZ4C96ZfNw4C3nNM7ljk98=", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.0.0.tgz", + "integrity": "sha1-zn348ZQbA28Cssyp29DLHw6FXi0=", "requires": { - "create-react-class": "15.6.0", - "fbjs": "0.8.14", + "fbjs": "0.8.16", "loose-envify": "1.3.1", "object-assign": "4.1.1", - "prop-types": "15.5.10" + "prop-types": "15.6.0" + }, + "dependencies": { + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.14" + } + }, + "prop-types": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", + "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + } } }, "react-autosize-textarea": { @@ -7399,14 +7584,40 @@ } }, "react-dom": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.1.tgz", - "integrity": "sha1-LLDtQZEDjlPCCes6eaI+Kkz5lHA=", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.0.0.tgz", + "integrity": "sha1-nMMHnD3NcNTG4BuEqrKn40wwP1g=", "requires": { - "fbjs": "0.8.14", + "fbjs": "0.8.16", "loose-envify": "1.3.1", "object-assign": "4.1.1", - "prop-types": "15.5.10" + "prop-types": "15.6.0" + }, + "dependencies": { + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.14" + } + }, + "prop-types": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", + "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + } } }, "react-markdown": { @@ -7458,13 +7669,30 @@ } }, "react-test-renderer": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-15.6.1.tgz", - "integrity": "sha1-Am9KW7VVJmH9LMS7zQ1LyKNev34=", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.0.0.tgz", + "integrity": "sha1-n+e4MI8vcfKfw1bUECCG8THJyxU=", "dev": true, "requires": { - "fbjs": "0.8.14", + "fbjs": "0.8.16", "object-assign": "4.1.1" + }, + "dependencies": { + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "dev": true, + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.14" + } + } } }, "react-transition-group": { @@ -7774,6 +8002,12 @@ "onetime": "1.1.0" } }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -7802,6 +8036,16 @@ "inherits": "2.0.3" } }, + "rst-selector-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.2.tgz", + "integrity": "sha512-T5yd2bsA+FVQ5xP8Ga62gXjOnEaMsYhbbslVB+Fe4R9lAZiF7DfTHRyBpV9xEZ772LwstCdDdkHkvkWIr47X8g==", + "dev": true, + "requires": { + "lodash.flattendeep": "4.4.0", + "nearley": "2.11.0" + } + }, "run-async": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", @@ -8746,6 +8990,12 @@ "webpack-sources": "1.0.1" } }, + "underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", + "dev": true + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", diff --git a/package.json b/package.json index 636bb55704e08b..d786442f425546 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,12 @@ "moment-timezone": "0.5.13", "mousetrap": "1.6.1", "prop-types": "15.5.10", - "react": "15.6.1", + "react": "16.0.0", "react-autosize-textarea": "0.4.8", "react-click-outside": "2.3.1", "react-color": "2.13.4", "react-datepicker": "0.46.0", - "react-dom": "15.6.1", + "react-dom": "16.0.0", "react-redux": "5.0.6", "react-resizable-box": "2.0.6", "react-transition-group": "1.2.0", @@ -62,7 +62,8 @@ "concurrently": "3.5.0", "cross-env": "3.2.4", "deep-freeze": "0.0.1", - "enzyme": "2.9.1", + "enzyme": "3.1.0", + "enzyme-adapter-react-16": "1.0.2", "eslint": "3.19.0", "eslint-config-wordpress": "1.1.0", "eslint-plugin-jest": "21.2.0", @@ -72,6 +73,7 @@ "extract-text-webpack-plugin": "3.0.0", "gettext-parser": "1.3.0", "jest": "21.2.1", + "jest-enzyme": "4.0.1", "node-sass": "4.5.3", "pegjs": "0.10.0", "pegjs-loader": "0.5.4", @@ -80,7 +82,7 @@ "prismjs": "1.6.0", "raw-loader": "0.5.1", "react-markdown": "2.5.0", - "react-test-renderer": "15.6.1", + "react-test-renderer": "16.0.0", "sass-loader": "6.0.6", "style-loader": "0.18.2", "tinymce": "4.7.1", @@ -103,7 +105,6 @@ "" ], "setupFiles": [ - "/test/setup-console.js", "/test/setup-globals.js", "/test/setup-wp-aliases.js" ], diff --git a/test/setup-console.js b/test/setup-console.js deleted file mode 100644 index 2d1edd00adbc2d..00000000000000 --- a/test/setup-console.js +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable no-console */ -// Turn various warnings into errors -console._errorOriginal = console.error; -console.error = ( ...args ) => { - const util = require( 'util' ); - throw new Error( - 'Warning caught via console.error: ' + - util.format.apply( util, args ) - ); -}; diff --git a/test/setup-test-framework.js b/test/setup-test-framework.js index ba7252cafd1457..37b6bbf123fd43 100644 --- a/test/setup-test-framework.js +++ b/test/setup-test-framework.js @@ -1,34 +1,25 @@ // `babel-jest` should be doing this instead, but apparently it's not working. require( 'core-js/modules/es7.object.values' ); -// TODO: These exist only to stub or monkey-patch differences between React 15 -// and 16, since the test environment runs an older version (while we wait for -// test dependencies like Enzyme to support 16) -// -// See: https://github.com/airbnb/enzyme/issues/928 -jest.mock( '@wordpress/element', () => ( { - ...require.requireActual( '@wordpress/element' ), - createPortal: ( x ) => x, - renderToString: ( element ) => { - const { createElement } = require( 'react' ); - const { renderToStaticMarkup } = require( 'react-dom/server' ); +/** + * External dependencies + */ +import Adapter from 'enzyme-adapter-react-16'; +import Enzyme from 'enzyme'; +import 'jest-enzyme'; - if ( ! element ) { - return ''; - } +Enzyme.configure( { adapter: new Adapter() } ); - if ( 'string' === typeof element ) { - return element; - } +// Sets spies on console object to make it possible to convert them into test failures. +const spyError = jest.spyOn( console, 'error' ); +const spyWarn = jest.spyOn( console, 'warn' ); - if ( Array.isArray( element ) ) { - // Pass the array as children of a dummy wrapper, then remove the - // wrapper's opening and closing tags. - return renderToStaticMarkup( - createElement( 'div', null, ...element ) - ).slice( 5 /*
*/, -6 /*
*/ ); - } +beforeEach( () => { + spyError.mockReset(); + spyWarn.mockReset(); +} ); - return renderToStaticMarkup( element ); - }, -} ) ); +afterEach( () => { + expect( spyError ).not.toHaveBeenCalled(); + expect( spyWarn ).not.toHaveBeenCalled(); +} );