From e32533847c7eaa1a66b93fba4a1e00d6437a9d72 Mon Sep 17 00:00:00 2001 From: Jack Pope Date: Mon, 8 Jan 2024 13:33:38 -0500 Subject: [PATCH] [RTR] Add usage warning behind flag --- packages/react-test-renderer/shallow.js | 21 ++++++++- .../src/ReactTestRenderer.js | 11 ++++- .../src/__tests__/ReactTestRenderer-test.js | 12 +++++ .../src/__tests__/ShallowRenderer-test.js | 44 +++++++++++++++++++ .../ShallowRenderer-test.js.snap | 7 +++ packages/shared/ReactFeatureFlags.js | 3 ++ .../forks/ReactFeatureFlags.native-fb.js | 2 + .../forks/ReactFeatureFlags.native-oss.js | 2 + .../forks/ReactFeatureFlags.test-renderer.js | 2 + .../ReactFeatureFlags.test-renderer.native.js | 2 + .../ReactFeatureFlags.test-renderer.www.js | 2 + .../shared/forks/ReactFeatureFlags.www.js | 2 + 12 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 packages/react-test-renderer/src/__tests__/ShallowRenderer-test.js create mode 100644 packages/react-test-renderer/src/__tests__/__snapshots__/ShallowRenderer-test.js.snap diff --git a/packages/react-test-renderer/shallow.js b/packages/react-test-renderer/shallow.js index f4e93d121e5c7..3f277bc079b1e 100644 --- a/packages/react-test-renderer/shallow.js +++ b/packages/react-test-renderer/shallow.js @@ -4,7 +4,24 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow */ -export {default} from 'react-shallow-renderer'; +import ReactShallowRenderer from 'react-shallow-renderer'; +import {enableReactTestRendererWarning} from 'shared/ReactFeatureFlags'; + +const emptyObject = {}; + +export default class ReactShallowRendererWithWarning extends ReactShallowRenderer { + render(element, context = emptyObject) { + if (__DEV__) { + if (enableReactTestRendererWarning === true) { + console.warn( + "React's Shallow Renderer export will be removed in a future release. " + + 'Please use @testing-library/react instead.', + ); + } + } + + return super.render(element, context); + } +} diff --git a/packages/react-test-renderer/src/ReactTestRenderer.js b/packages/react-test-renderer/src/ReactTestRenderer.js index 4b19f599db5ac..29fa998f301b4 100644 --- a/packages/react-test-renderer/src/ReactTestRenderer.js +++ b/packages/react-test-renderer/src/ReactTestRenderer.js @@ -52,7 +52,7 @@ import {checkPropStringCoercion} from 'shared/CheckStringCoercion'; import {getPublicInstance} from './ReactFiberConfigTestHost'; import {ConcurrentRoot, LegacyRoot} from 'react-reconciler/src/ReactRootTags'; -import {allowConcurrentByDefault} from 'shared/ReactFeatureFlags'; +import {allowConcurrentByDefault, enableReactTestRendererWarning} from 'shared/ReactFeatureFlags'; const act = React.unstable_act; @@ -471,6 +471,15 @@ function create( getInstance(): React$Component | PublicInstance | null, unstable_flushSync: typeof flushSync, } { + if (__DEV__) { + if (enableReactTestRendererWarning === true) { + console.warn( + 'Support for ReactTestRenderer will be removed in a future release. ' + + 'Please use @testing-library/react instead.', + ); + } + } + let createNodeMock = defaultTestOptions.createNodeMock; let isConcurrent = false; let isStrictMode = false; diff --git a/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.js b/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.js index 0118fa53f3ad3..e5fcf3da0ed44 100644 --- a/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.js +++ b/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.js @@ -14,6 +14,7 @@ let React; let ReactCache; let ReactTestRenderer; let waitForAll; +let ReactFeatureFlags; describe('ReactTestRenderer', () => { beforeEach(() => { @@ -25,10 +26,21 @@ describe('ReactTestRenderer', () => { React = require('react'); ReactCache = require('react-cache'); ReactTestRenderer = require('react-test-renderer'); + ReactFeatureFlags = require('shared/ReactFeatureFlags'); const InternalTestUtils = require('internal-test-utils'); waitForAll = InternalTestUtils.waitForAll; }); + it('should warn if enableReactTestRendererWarning is enabled', () => { + ReactFeatureFlags.enableReactTestRendererWarning = true; + expect(() => { + ReactTestRenderer.create(
); + }).toWarnDev( + 'Warning: Support for ReactTestRenderer will be removed in a future release. Please use @testing-library/react instead.', + {withoutStack: true}, + ); + }); + it('should warn if used to render a ReactDOM portal', () => { const container = document.createElement('div'); expect(() => { diff --git a/packages/react-test-renderer/src/__tests__/ShallowRenderer-test.js b/packages/react-test-renderer/src/__tests__/ShallowRenderer-test.js new file mode 100644 index 0000000000000..1f921036dccc8 --- /dev/null +++ b/packages/react-test-renderer/src/__tests__/ShallowRenderer-test.js @@ -0,0 +1,44 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @emails react-core + */ + +'use strict'; + +let React; +let ReactShallowRenderer; +let ReactFeatureFlags; + +function HelloWorld() { + return

Hello, world!

; +} + +describe('ShallowRenderer', () => { + beforeEach(() => { + jest.resetModules(); + ReactFeatureFlags = require('shared/ReactFeatureFlags'); + React = require('react'); + ReactShallowRenderer = require('../../shallow.js').default; + }); + + it('should render without warnings without enableReactTestRendererWarning', () => { + ReactFeatureFlags.enableReactTestRendererWarning = false; + const renderer = new ReactShallowRenderer(); + expect(renderer.render()).toMatchSnapshot(); + }); + + it('should render with warnings with enableReactTestRendererWarning', () => { + ReactFeatureFlags.enableReactTestRendererWarning = true; + const renderer = new ReactShallowRenderer(); + expect(() => { + renderer.render(); + }).toWarnDev( + "Warning: React's Shallow Renderer export will be removed in a future release. Please use @testing-library/react instead.", + {withoutStack: true}, + ); + }); +}); diff --git a/packages/react-test-renderer/src/__tests__/__snapshots__/ShallowRenderer-test.js.snap b/packages/react-test-renderer/src/__tests__/__snapshots__/ShallowRenderer-test.js.snap new file mode 100644 index 0000000000000..ce181e1388af8 --- /dev/null +++ b/packages/react-test-renderer/src/__tests__/__snapshots__/ShallowRenderer-test.js.snap @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ShallowRenderer should render without warnings without enableReactTestRendererWarning 1`] = ` +

+ Hello, world! +

+`; diff --git a/packages/shared/ReactFeatureFlags.js b/packages/shared/ReactFeatureFlags.js index 8841a7bc6a4b5..377d3ce1b7ad4 100644 --- a/packages/shared/ReactFeatureFlags.js +++ b/packages/shared/ReactFeatureFlags.js @@ -162,6 +162,9 @@ export const enableUnifiedSyncLane = true; // Adds an opt-in to time slicing for updates that aren't wrapped in startTransition. export const allowConcurrentByDefault = false; +// Warn on any usage of ReactTestRenderer +export const enableReactTestRendererWarning = false; + // ----------------------------------------------------------------------------- // React DOM Chopping Block // diff --git a/packages/shared/forks/ReactFeatureFlags.native-fb.js b/packages/shared/forks/ReactFeatureFlags.native-fb.js index eaf68191aa6f5..a6e2ef1d99f5e 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-fb.js +++ b/packages/shared/forks/ReactFeatureFlags.native-fb.js @@ -96,5 +96,7 @@ export const enableFizzExternalRuntime = false; export const enableAsyncActions = false; export const enableUseDeferredValueInitialArg = true; +export const enableReactTestRendererWarning = false; + // Flow magic to verify the exports of this file match the original version. ((((null: any): ExportsType): FeatureFlagsType): ExportsType); diff --git a/packages/shared/forks/ReactFeatureFlags.native-oss.js b/packages/shared/forks/ReactFeatureFlags.native-oss.js index d3ef3621d1dbb..e08a9fa1344fe 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-oss.js +++ b/packages/shared/forks/ReactFeatureFlags.native-oss.js @@ -87,5 +87,7 @@ export const useMicrotasksForSchedulingInFabric = false; export const passChildrenWhenCloningPersistedNodes = false; export const enableUseDeferredValueInitialArg = __EXPERIMENTAL__; +export const enableReactTestRendererWarning = false; + // Flow magic to verify the exports of this file match the original version. ((((null: any): ExportsType): FeatureFlagsType): ExportsType); diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.js index 20fa7bb3ff1d1..c3c40e1c5c540 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.js @@ -87,5 +87,7 @@ export const useMicrotasksForSchedulingInFabric = false; export const passChildrenWhenCloningPersistedNodes = false; export const enableUseDeferredValueInitialArg = __EXPERIMENTAL__; +export const enableReactTestRendererWarning = false; + // Flow magic to verify the exports of this file match the original version. ((((null: any): ExportsType): FeatureFlagsType): ExportsType); diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.native.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.native.js index af184d191bd04..0e357d11e3ab7 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.native.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.native.js @@ -84,5 +84,7 @@ export const useMicrotasksForSchedulingInFabric = false; export const passChildrenWhenCloningPersistedNodes = false; export const enableUseDeferredValueInitialArg = __EXPERIMENTAL__; +export const enableReactTestRendererWarning = false; + // Flow magic to verify the exports of this file match the original version. ((((null: any): ExportsType): FeatureFlagsType): ExportsType); diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js index 8a31dbca6bcf7..501ef7f6509b2 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js @@ -87,5 +87,7 @@ export const useMicrotasksForSchedulingInFabric = false; export const passChildrenWhenCloningPersistedNodes = false; export const enableUseDeferredValueInitialArg = true; +export const enableReactTestRendererWarning = false; + // Flow magic to verify the exports of this file match the original version. ((((null: any): ExportsType): FeatureFlagsType): ExportsType); diff --git a/packages/shared/forks/ReactFeatureFlags.www.js b/packages/shared/forks/ReactFeatureFlags.www.js index 4850d8236c661..f3312c4917d09 100644 --- a/packages/shared/forks/ReactFeatureFlags.www.js +++ b/packages/shared/forks/ReactFeatureFlags.www.js @@ -118,5 +118,7 @@ export const passChildrenWhenCloningPersistedNodes = false; export const enableAsyncDebugInfo = false; +export const enableReactTestRendererWarning = false; + // Flow magic to verify the exports of this file match the original version. ((((null: any): ExportsType): FeatureFlagsType): ExportsType);