1. /**
    
  2.  * Copyright (c) Meta Platforms, Inc. and affiliates.
    
  3.  *
    
  4.  * This source code is licensed under the MIT license found in the
    
  5.  * LICENSE file in the root directory of this source tree.
    
  6.  *
    
  7.  * @emails react-core
    
  8.  */
    
  9. 
    
  10. 'use strict';
    
  11. 
    
  12. let React;
    
  13. let ReactNoop;
    
  14. let JSXDEVRuntime;
    
  15. let waitForAll;
    
  16. 
    
  17. describe('ReactDeprecationWarnings', () => {
    
  18.   beforeEach(() => {
    
  19.     jest.resetModules();
    
  20.     React = require('react');
    
  21.     ReactNoop = require('react-noop-renderer');
    
  22.     const InternalTestUtils = require('internal-test-utils');
    
  23.     waitForAll = InternalTestUtils.waitForAll;
    
  24.     if (__DEV__) {
    
  25.       JSXDEVRuntime = require('react/jsx-dev-runtime');
    
  26.     }
    
  27.   });
    
  28. 
    
  29.   it('should warn when given defaultProps', async () => {
    
  30.     function FunctionalComponent(props) {
    
  31.       return null;
    
  32.     }
    
  33. 
    
  34.     FunctionalComponent.defaultProps = {
    
  35.       testProp: true,
    
  36.     };
    
  37. 
    
  38.     ReactNoop.render(<FunctionalComponent />);
    
  39.     await expect(async () => await waitForAll([])).toErrorDev(
    
  40.       'Warning: FunctionalComponent: Support for defaultProps ' +
    
  41.         'will be removed from function components in a future major ' +
    
  42.         'release. Use JavaScript default parameters instead.',
    
  43.     );
    
  44.   });
    
  45. 
    
  46.   it('should warn when given defaultProps on a memoized function', async () => {
    
  47.     const MemoComponent = React.memo(function FunctionalComponent(props) {
    
  48.       return null;
    
  49.     });
    
  50. 
    
  51.     MemoComponent.defaultProps = {
    
  52.       testProp: true,
    
  53.     };
    
  54. 
    
  55.     ReactNoop.render(
    
  56.       <div>
    
  57.         <MemoComponent />
    
  58.       </div>,
    
  59.     );
    
  60.     await expect(async () => await waitForAll([])).toErrorDev(
    
  61.       'Warning: FunctionalComponent: Support for defaultProps ' +
    
  62.         'will be removed from memo components in a future major ' +
    
  63.         'release. Use JavaScript default parameters instead.',
    
  64.     );
    
  65.   });
    
  66. 
    
  67.   it('should warn when given string refs', async () => {
    
  68.     class RefComponent extends React.Component {
    
  69.       render() {
    
  70.         return null;
    
  71.       }
    
  72.     }
    
  73.     class Component extends React.Component {
    
  74.       render() {
    
  75.         return <RefComponent ref="refComponent" />;
    
  76.       }
    
  77.     }
    
  78. 
    
  79.     ReactNoop.render(<Component />);
    
  80.     await expect(async () => await waitForAll([])).toErrorDev(
    
  81.       'Warning: Component "Component" contains the string ref "refComponent". ' +
    
  82.         'Support for string refs will be removed in a future major release. ' +
    
  83.         'We recommend using useRef() or createRef() instead. ' +
    
  84.         'Learn more about using refs safely here: ' +
    
  85.         'https://reactjs.org/link/strict-mode-string-ref' +
    
  86.         '\n    in Component (at **)',
    
  87.     );
    
  88.   });
    
  89. 
    
  90.   it('should warn when owner and self are the same for string refs', async () => {
    
  91.     class RefComponent extends React.Component {
    
  92.       render() {
    
  93.         return null;
    
  94.       }
    
  95.     }
    
  96.     class Component extends React.Component {
    
  97.       render() {
    
  98.         return <RefComponent ref="refComponent" __self={this} />;
    
  99.       }
    
  100.     }
    
  101.     expect(() => {
    
  102.       ReactNoop.renderLegacySyncRoot(<Component />);
    
  103.     }).toErrorDev([
    
  104.       'Component "Component" contains the string ref "refComponent". Support for string refs will be removed in a future major release.',
    
  105.     ]);
    
  106.     await waitForAll([]);
    
  107.   });
    
  108. 
    
  109.   it('should warn when owner and self are different for string refs', async () => {
    
  110.     class RefComponent extends React.Component {
    
  111.       render() {
    
  112.         return null;
    
  113.       }
    
  114.     }
    
  115.     class Component extends React.Component {
    
  116.       render() {
    
  117.         return <RefComponent ref="refComponent" __self={{}} />;
    
  118.       }
    
  119.     }
    
  120. 
    
  121.     ReactNoop.render(<Component />);
    
  122.     await expect(async () => await waitForAll([])).toErrorDev([
    
  123.       'Warning: Component "Component" contains the string ref "refComponent". ' +
    
  124.         'Support for string refs will be removed in a future major release. ' +
    
  125.         'This case cannot be automatically converted to an arrow function. ' +
    
  126.         'We ask you to manually fix this case by using useRef() or createRef() instead. ' +
    
  127.         'Learn more about using refs safely here: ' +
    
  128.         'https://reactjs.org/link/strict-mode-string-ref',
    
  129.     ]);
    
  130.   });
    
  131. 
    
  132.   if (__DEV__) {
    
  133.     it('should warn when owner and self are different for string refs', async () => {
    
  134.       class RefComponent extends React.Component {
    
  135.         render() {
    
  136.           return null;
    
  137.         }
    
  138.       }
    
  139.       class Component extends React.Component {
    
  140.         render() {
    
  141.           return JSXDEVRuntime.jsxDEV(
    
  142.             RefComponent,
    
  143.             {ref: 'refComponent'},
    
  144.             null,
    
  145.             false,
    
  146.             {},
    
  147.             {},
    
  148.           );
    
  149.         }
    
  150.       }
    
  151. 
    
  152.       ReactNoop.render(<Component />);
    
  153.       await expect(async () => await waitForAll([])).toErrorDev(
    
  154.         'Warning: Component "Component" contains the string ref "refComponent". ' +
    
  155.           'Support for string refs will be removed in a future major release. ' +
    
  156.           'This case cannot be automatically converted to an arrow function. ' +
    
  157.           'We ask you to manually fix this case by using useRef() or createRef() instead. ' +
    
  158.           'Learn more about using refs safely here: ' +
    
  159.           'https://reactjs.org/link/strict-mode-string-ref',
    
  160.       );
    
  161.     });
    
  162.   }
    
  163. });