From f39963ff0ad935b696139723672a423e9b6f8860 Mon Sep 17 00:00:00 2001 From: Sunil Pai Date: Thu, 6 Feb 2020 01:05:17 +0000 Subject: [PATCH] Use testing builds for our own tests Following up from #17915 where we generated testing builds for `react-dom`, this PR uses those builds for our own tests. - fixes `ReactFeatureFlags.testing` to use all the default flags - changes `ReactFeatureFlags.readonly` to return `isTestEnvironment: true` (this might not strictly be needed) - with jest, mocks `react-dom` with the testing version, both for source and builds - uses `ReactDOM.act` in one of these tests to verify it actually works --- .eslintrc.js | 1 + fixtures/dom/src/__tests__/nested-act-test.js | 5 +- fixtures/dom/src/__tests__/wrong-act-test.js | 5 +- packages/react-dom/package.json | 1 + .../ReactDOMSuspensePlaceholder-test.js | 4 +- packages/react-dom/src/client/ReactDOM.js | 3 +- .../src/ReactFiberReconciler.js | 4 +- packages/shared/ReactFeatureFlags.js | 2 - .../forks/ReactFeatureFlags.native-fb.js | 1 - .../forks/ReactFeatureFlags.native-oss.js | 1 - .../forks/ReactFeatureFlags.persistent.js | 1 - .../forks/ReactFeatureFlags.test-renderer.js | 1 - .../ReactFeatureFlags.test-renderer.www.js | 1 - .../shared/forks/ReactFeatureFlags.testing.js | 61 ------------------- .../shared/forks/ReactFeatureFlags.www.js | 2 - scripts/flow/environment.js | 1 + scripts/jest/setupEnvironment.js | 1 + scripts/jest/setupHostConfigs.js | 2 + scripts/jest/setupTests.build.js | 2 + scripts/rollup/build.js | 2 + scripts/rollup/forks.js | 6 +- 21 files changed, 17 insertions(+), 90 deletions(-) delete mode 100644 packages/shared/forks/ReactFeatureFlags.testing.js diff --git a/.eslintrc.js b/.eslintrc.js index 74b87ab13a679..7d34ba704554a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -168,6 +168,7 @@ module.exports = { __PROFILE__: true, __UMD__: true, __EXPERIMENTAL__: true, + __TEST__: true, trustedTypes: true, }, }; diff --git a/fixtures/dom/src/__tests__/nested-act-test.js b/fixtures/dom/src/__tests__/nested-act-test.js index c7a191943abdf..60e03208ada26 100644 --- a/fixtures/dom/src/__tests__/nested-act-test.js +++ b/fixtures/dom/src/__tests__/nested-act-test.js @@ -13,10 +13,7 @@ let TestRenderer; global.__DEV__ = process.env.NODE_ENV !== 'production'; -jest.mock('react-dom', () => - require.requireActual('react-dom/cjs/react-dom-testing.development.js') -); -// we'll replace the above with react/testing and react-dom/testing right before the next minor +jest.mock('react-dom', () => require.requireActual('react-dom/testing')); expect.extend(require('../toWarnDev')); diff --git a/fixtures/dom/src/__tests__/wrong-act-test.js b/fixtures/dom/src/__tests__/wrong-act-test.js index 10df65ce6df60..805a608196876 100644 --- a/fixtures/dom/src/__tests__/wrong-act-test.js +++ b/fixtures/dom/src/__tests__/wrong-act-test.js @@ -18,10 +18,7 @@ let ARTTest; global.__DEV__ = process.env.NODE_ENV !== 'production'; global.__EXPERIMENTAL__ = process.env.RELEASE_CHANNEL === 'experimental'; -jest.mock('react-dom', () => - require.requireActual('react-dom/cjs/react-dom-testing.development.js') -); -// we'll replace the above with react/testing and react-dom/testing right before the next minor +jest.mock('react-dom', () => require.requireActual('react-dom/testing')); expect.extend(require('../toWarnDev')); diff --git a/packages/react-dom/package.json b/packages/react-dom/package.json index 7e6cf5e5c0ee8..4388616e430a6 100644 --- a/packages/react-dom/package.json +++ b/packages/react-dom/package.json @@ -30,6 +30,7 @@ "README.md", "build-info.json", "index.js", + "testing.js", "profiling.js", "server.js", "server.browser.js", diff --git a/packages/react-dom/src/__tests__/ReactDOMSuspensePlaceholder-test.js b/packages/react-dom/src/__tests__/ReactDOMSuspensePlaceholder-test.js index 94bd63ff026cd..661134f388422 100644 --- a/packages/react-dom/src/__tests__/ReactDOMSuspensePlaceholder-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMSuspensePlaceholder-test.js @@ -13,7 +13,6 @@ let React; let ReactDOM; let Suspense; let ReactCache; -let ReactTestUtils; let Scheduler; let TextResource; let act; @@ -26,9 +25,8 @@ describe('ReactDOMSuspensePlaceholder', () => { React = require('react'); ReactDOM = require('react-dom'); ReactCache = require('react-cache'); - ReactTestUtils = require('react-dom/test-utils'); Scheduler = require('scheduler'); - act = ReactTestUtils.act; + act = ReactDOM.act; Suspense = React.Suspense; container = document.createElement('div'); document.body.appendChild(container); diff --git a/packages/react-dom/src/client/ReactDOM.js b/packages/react-dom/src/client/ReactDOM.js index ee54497f232af..a2ee4891d731c 100644 --- a/packages/react-dom/src/client/ReactDOM.js +++ b/packages/react-dom/src/client/ReactDOM.js @@ -59,7 +59,6 @@ import { disableUnstableCreatePortal, disableUnstableRenderSubtreeIntoContainer, warnUnstableRenderSubtreeIntoContainer, - isTestEnvironment, } from 'shared/ReactFeatureFlags'; import { @@ -253,7 +252,7 @@ if (__DEV__) { } } -if (isTestEnvironment) { +if (__TEST__) { ReactDOM.act = act; } diff --git a/packages/react-reconciler/src/ReactFiberReconciler.js b/packages/react-reconciler/src/ReactFiberReconciler.js index 8102f66c25f65..c3f685a5f4e4e 100644 --- a/packages/react-reconciler/src/ReactFiberReconciler.js +++ b/packages/react-reconciler/src/ReactFiberReconciler.js @@ -87,10 +87,10 @@ import { findHostInstancesForRefresh, } from './ReactFiberHotReloading'; -// used by isTestEnvironment builds +// used by __TEST__ builds import enqueueTask from 'shared/enqueueTask'; import * as Scheduler from 'scheduler'; -// end isTestEnvironment imports +// end __TEST__ imports type OpaqueRoot = FiberRoot; diff --git a/packages/shared/ReactFeatureFlags.js b/packages/shared/ReactFeatureFlags.js index 469e5c5e810a5..f557188680945 100644 --- a/packages/shared/ReactFeatureFlags.js +++ b/packages/shared/ReactFeatureFlags.js @@ -97,8 +97,6 @@ export const enableNativeTargetAsInstance = false; // This flag provides a killswitch if that proves to break existing code somehow. export const deferPassiveEffectCleanupDuringUnmount = false; -export const isTestEnvironment = false; - // -------------------------- // Future APIs to be deprecated // -------------------------- diff --git a/packages/shared/forks/ReactFeatureFlags.native-fb.js b/packages/shared/forks/ReactFeatureFlags.native-fb.js index 3d6afec5e6e9c..651f62e981622 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-fb.js +++ b/packages/shared/forks/ReactFeatureFlags.native-fb.js @@ -52,7 +52,6 @@ export const disableUnstableRenderSubtreeIntoContainer = false; export const warnUnstableRenderSubtreeIntoContainer = false; export const disableUnstableCreatePortal = false; export const deferPassiveEffectCleanupDuringUnmount = false; -export const isTestEnvironment = false; // Only used in www builds. export function addUserTimingListener() { diff --git a/packages/shared/forks/ReactFeatureFlags.native-oss.js b/packages/shared/forks/ReactFeatureFlags.native-oss.js index c97153f3ae1d4..1129c6fe8a1a8 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-oss.js +++ b/packages/shared/forks/ReactFeatureFlags.native-oss.js @@ -47,7 +47,6 @@ export const disableUnstableRenderSubtreeIntoContainer = false; export const warnUnstableRenderSubtreeIntoContainer = false; export const disableUnstableCreatePortal = false; export const deferPassiveEffectCleanupDuringUnmount = false; -export const isTestEnvironment = false; // Only used in www builds. export function addUserTimingListener() { diff --git a/packages/shared/forks/ReactFeatureFlags.persistent.js b/packages/shared/forks/ReactFeatureFlags.persistent.js index deeeeb12b07cf..9d6abfb51e412 100644 --- a/packages/shared/forks/ReactFeatureFlags.persistent.js +++ b/packages/shared/forks/ReactFeatureFlags.persistent.js @@ -47,7 +47,6 @@ export const disableUnstableRenderSubtreeIntoContainer = false; export const warnUnstableRenderSubtreeIntoContainer = false; export const disableUnstableCreatePortal = false; export const deferPassiveEffectCleanupDuringUnmount = false; -export const isTestEnvironment = false; // Only used in www builds. export function addUserTimingListener() { diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.js index adc9ab91061c2..cb40577c2c0c1 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.js @@ -47,7 +47,6 @@ export const disableUnstableRenderSubtreeIntoContainer = false; export const warnUnstableRenderSubtreeIntoContainer = false; export const disableUnstableCreatePortal = false; export const deferPassiveEffectCleanupDuringUnmount = false; -export const isTestEnvironment = true; // this should probably *never* change // Only used in www builds. export function addUserTimingListener() { diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js index ee17330bb4746..eaad89f0e26a4 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js @@ -45,7 +45,6 @@ export const disableUnstableRenderSubtreeIntoContainer = false; export const warnUnstableRenderSubtreeIntoContainer = false; export const disableUnstableCreatePortal = false; export const deferPassiveEffectCleanupDuringUnmount = false; -export const isTestEnvironment = true; // this should probably *never* change // Only used in www builds. export function addUserTimingListener() { diff --git a/packages/shared/forks/ReactFeatureFlags.testing.js b/packages/shared/forks/ReactFeatureFlags.testing.js deleted file mode 100644 index 4bcf3cc5b7914..0000000000000 --- a/packages/shared/forks/ReactFeatureFlags.testing.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @flow - */ - -import invariant from 'shared/invariant'; - -import typeof * as FeatureFlagsType from 'shared/ReactFeatureFlags'; -import typeof * as PersistentFeatureFlagsType from './ReactFeatureFlags.persistent'; - -export const debugRenderPhaseSideEffectsForStrictMode = false; -export const enableUserTimingAPI = __DEV__; -export const warnAboutDeprecatedLifecycles = true; -export const replayFailedUnitOfWorkWithInvokeGuardedCallback = false; -export const enableProfilerTimer = __PROFILE__; -export const enableSchedulerTracing = __PROFILE__; -export const enableSuspenseServerRenderer = false; -export const enableSelectiveHydration = false; -export const enableChunksAPI = false; -export const disableJavaScriptURLs = false; -export const disableInputAttributeSyncing = false; -export const exposeConcurrentModeAPIs = __EXPERIMENTAL__; -export const warnAboutShorthandPropertyCollision = false; -export const enableSchedulerDebugging = false; -export const enableDeprecatedFlareAPI = false; -export const enableFundamentalAPI = false; -export const enableScopeAPI = false; -export const enableJSXTransformAPI = false; -export const warnAboutUnmockedScheduler = false; -export const flushSuspenseFallbacksInTests = true; -export const enableSuspenseCallback = false; -export const warnAboutDefaultPropsOnFunctionComponents = false; -export const warnAboutStringRefs = false; -export const disableLegacyContext = false; -export const disableSchedulerTimeoutBasedOnReactExpirationTime = false; -export const enableTrainModelFix = true; -export const enableTrustedTypesIntegration = false; -export const enableNativeTargetAsInstance = false; -export const disableCreateFactory = false; -export const disableTextareaChildren = false; -export const disableMapsAsChildren = false; -export const disableUnstableRenderSubtreeIntoContainer = false; -export const warnUnstableRenderSubtreeIntoContainer = false; -export const disableUnstableCreatePortal = false; -export const deferPassiveEffectCleanupDuringUnmount = false; -export const isTestEnvironment = true; - -// Only used in www builds. -export function addUserTimingListener() { - invariant(false, 'Not implemented.'); -} - -// Flow magic to verify the exports of this file match the original version. -// eslint-disable-next-line no-unused-vars -type Check<_X, Y: _X, X: Y = _X> = null; -// eslint-disable-next-line no-unused-expressions -(null: Check); diff --git a/packages/shared/forks/ReactFeatureFlags.www.js b/packages/shared/forks/ReactFeatureFlags.www.js index 7cc5a9ae1c71a..396a9d99a74ce 100644 --- a/packages/shared/forks/ReactFeatureFlags.www.js +++ b/packages/shared/forks/ReactFeatureFlags.www.js @@ -104,8 +104,6 @@ export const warnUnstableRenderSubtreeIntoContainer = false; export const disableUnstableCreatePortal = false; -export const isTestEnvironment = false; - // Flow magic to verify the exports of this file match the original version. // eslint-disable-next-line no-unused-vars type Check<_X, Y: _X, X: Y = _X> = null; diff --git a/scripts/flow/environment.js b/scripts/flow/environment.js index 524cae905bc2e..735a4167bd398 100644 --- a/scripts/flow/environment.js +++ b/scripts/flow/environment.js @@ -9,6 +9,7 @@ /* eslint-disable */ +declare var __TEST__: boolean; declare var __PROFILE__: boolean; declare var __UMD__: boolean; declare var __EXPERIMENTAL__: boolean; diff --git a/scripts/jest/setupEnvironment.js b/scripts/jest/setupEnvironment.js index 7eef6432e73cf..cee6fd0d6cdd4 100644 --- a/scripts/jest/setupEnvironment.js +++ b/scripts/jest/setupEnvironment.js @@ -7,6 +7,7 @@ if (NODE_ENV !== 'development' && NODE_ENV !== 'production') { global.__DEV__ = NODE_ENV === 'development'; global.__PROFILE__ = NODE_ENV === 'development'; global.__UMD__ = false; +global.__TEST__ = true; const RELEASE_CHANNEL = process.env.RELEASE_CHANNEL; diff --git a/scripts/jest/setupHostConfigs.js b/scripts/jest/setupHostConfigs.js index 93078a03cdee0..a3afc4f273edd 100644 --- a/scripts/jest/setupHostConfigs.js +++ b/scripts/jest/setupHostConfigs.js @@ -177,6 +177,8 @@ inlinedHostConfigs.forEach(rendererInfo => { } }); +jest.mock('react-dom', () => require.requireActual('react-dom/testing')); + // Make it possible to import this module inside // the React package itself. jest.mock('shared/ReactSharedInternals', () => diff --git a/scripts/jest/setupTests.build.js b/scripts/jest/setupTests.build.js index 62db0fc007f95..7dcd12811f279 100644 --- a/scripts/jest/setupTests.build.js +++ b/scripts/jest/setupTests.build.js @@ -1,5 +1,7 @@ 'use strict'; +jest.mock('react-dom', () => require.requireActual(`react-dom/testing`)); + jest.mock('scheduler', () => require.requireActual('scheduler/unstable_mock')); jest.mock('scheduler/src/SchedulerHostConfig', () => require.requireActual('scheduler/src/forks/SchedulerHostConfig.mock.js') diff --git a/scripts/rollup/build.js b/scripts/rollup/build.js index ec0cc2c1754bb..65fe83fbdd1ab 100644 --- a/scripts/rollup/build.js +++ b/scripts/rollup/build.js @@ -347,6 +347,7 @@ function getPlugins( bundleType === RN_FB_DEV || bundleType === RN_FB_PROD || bundleType === RN_FB_PROFILING; + const isTestBuild = entry === 'react-dom/testing'; const shouldStayReadable = isFBBundle || isRNBundle || forcePrettyOutput; return [ // Extract error codes from invariant() messages into a file. @@ -391,6 +392,7 @@ function getPlugins( __DEV__: isProduction ? 'false' : 'true', __PROFILE__: isProfiling || !isProduction ? 'true' : 'false', __UMD__: isUMDBundle ? 'true' : 'false', + __TEST__: isTestBuild ? 'true' : 'false', 'process.env.NODE_ENV': isProduction ? "'production'" : "'development'", __EXPERIMENTAL__, }), diff --git a/scripts/rollup/forks.js b/scripts/rollup/forks.js index 9f1f3c41bdd62..142c278b9c17c 100644 --- a/scripts/rollup/forks.js +++ b/scripts/rollup/forks.js @@ -46,7 +46,7 @@ const forks = Object.freeze({ // Without this fork, importing `shared/ReactSharedInternals` inside // the `react` package itself would not work due to a cyclical dependency. 'shared/ReactSharedInternals': (bundleType, entry, dependencies) => { - if (entry === 'react' || entry === 'react/testing') { + if (entry === 'react') { return 'react/src/ReactSharedInternals'; } if (dependencies.indexOf('react') === -1) { @@ -106,10 +106,6 @@ const forks = Object.freeze({ return 'shared/forks/ReactFeatureFlags.test-renderer.www.js'; } return 'shared/forks/ReactFeatureFlags.test-renderer.js'; - case 'react-dom/testing': - return 'shared/forks/ReactFeatureFlags.testing.js'; - case 'react/testing': - return 'shared/forks/ReactFeatureFlags.testing.js'; default: switch (bundleType) { case FB_WWW_DEV: