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.  * @jest-environment ./scripts/jest/ReactDOMServerIntegrationEnvironment
    
  9.  */
    
  10. 
    
  11. 'use strict';
    
  12. 
    
  13. const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegrationTestUtils');
    
  14. 
    
  15. let React;
    
  16. let ReactDOM;
    
  17. let ReactDOMServer;
    
  18. let ReactTestUtils;
    
  19. 
    
  20. function initModules() {
    
  21.   // Reset warning cache.
    
  22.   jest.resetModules();
    
  23.   React = require('react');
    
  24.   ReactDOM = require('react-dom');
    
  25.   ReactDOMServer = require('react-dom/server');
    
  26.   ReactTestUtils = require('react-dom/test-utils');
    
  27. 
    
  28.   // Make them available to the helpers.
    
  29.   return {
    
  30.     ReactDOM,
    
  31.     ReactDOMServer,
    
  32.     ReactTestUtils,
    
  33.   };
    
  34. }
    
  35. 
    
  36. const {resetModules, itRenders} = ReactDOMServerIntegrationUtils(initModules);
    
  37. 
    
  38. describe('ReactDOMServerIntegration', () => {
    
  39.   beforeEach(() => {
    
  40.     resetModules();
    
  41.   });
    
  42. 
    
  43.   // Test pragmas don't support itRenders abstraction
    
  44.   if (
    
  45.     __EXPERIMENTAL__ &&
    
  46.     require('shared/ReactFeatureFlags').enableDebugTracing
    
  47.   ) {
    
  48.     describe('React.unstable_DebugTracingMode', () => {
    
  49.       beforeEach(() => {
    
  50.         spyOnDevAndProd(console, 'log');
    
  51.       });
    
  52. 
    
  53.       itRenders('with one child', async render => {
    
  54.         const e = await render(
    
  55.           <React.unstable_DebugTracingMode>
    
  56.             <div>text1</div>
    
  57.           </React.unstable_DebugTracingMode>,
    
  58.         );
    
  59.         const parent = e.parentNode;
    
  60.         expect(parent.childNodes[0].tagName).toBe('DIV');
    
  61.       });
    
  62. 
    
  63.       itRenders('mode with several children', async render => {
    
  64.         const Header = props => {
    
  65.           return <p>header</p>;
    
  66.         };
    
  67.         const Footer = props => {
    
  68.           return (
    
  69.             <React.unstable_DebugTracingMode>
    
  70.               <h2>footer</h2>
    
  71.               <h3>about</h3>
    
  72.             </React.unstable_DebugTracingMode>
    
  73.           );
    
  74.         };
    
  75.         const e = await render(
    
  76.           <React.unstable_DebugTracingMode>
    
  77.             <div>text1</div>
    
  78.             <span>text2</span>
    
  79.             <Header />
    
  80.             <Footer />
    
  81.           </React.unstable_DebugTracingMode>,
    
  82.         );
    
  83.         const parent = e.parentNode;
    
  84.         expect(parent.childNodes[0].tagName).toBe('DIV');
    
  85.         expect(parent.childNodes[1].tagName).toBe('SPAN');
    
  86.         expect(parent.childNodes[2].tagName).toBe('P');
    
  87.         expect(parent.childNodes[3].tagName).toBe('H2');
    
  88.         expect(parent.childNodes[4].tagName).toBe('H3');
    
  89.       });
    
  90.     });
    
  91.   }
    
  92. 
    
  93.   describe('React.StrictMode', () => {
    
  94.     itRenders('a strict mode with one child', async render => {
    
  95.       const e = await render(
    
  96.         <React.StrictMode>
    
  97.           <div>text1</div>
    
  98.         </React.StrictMode>,
    
  99.       );
    
  100.       const parent = e.parentNode;
    
  101.       expect(parent.childNodes[0].tagName).toBe('DIV');
    
  102.     });
    
  103. 
    
  104.     itRenders('a strict mode with several children', async render => {
    
  105.       const Header = props => {
    
  106.         return <p>header</p>;
    
  107.       };
    
  108.       const Footer = props => {
    
  109.         return (
    
  110.           <React.StrictMode>
    
  111.             <h2>footer</h2>
    
  112.             <h3>about</h3>
    
  113.           </React.StrictMode>
    
  114.         );
    
  115.       };
    
  116.       const e = await render(
    
  117.         <React.StrictMode>
    
  118.           <div>text1</div>
    
  119.           <span>text2</span>
    
  120.           <Header />
    
  121.           <Footer />
    
  122.         </React.StrictMode>,
    
  123.       );
    
  124.       const parent = e.parentNode;
    
  125.       expect(parent.childNodes[0].tagName).toBe('DIV');
    
  126.       expect(parent.childNodes[1].tagName).toBe('SPAN');
    
  127.       expect(parent.childNodes[2].tagName).toBe('P');
    
  128.       expect(parent.childNodes[3].tagName).toBe('H2');
    
  129.       expect(parent.childNodes[4].tagName).toBe('H3');
    
  130.     });
    
  131. 
    
  132.     itRenders('a nested strict mode', async render => {
    
  133.       const e = await render(
    
  134.         <React.StrictMode>
    
  135.           <React.StrictMode>
    
  136.             <div>text1</div>
    
  137.           </React.StrictMode>
    
  138.           <span>text2</span>
    
  139.           <React.StrictMode>
    
  140.             <React.StrictMode>
    
  141.               <React.StrictMode>
    
  142.                 {null}
    
  143.                 <p />
    
  144.               </React.StrictMode>
    
  145.               {false}
    
  146.             </React.StrictMode>
    
  147.           </React.StrictMode>
    
  148.         </React.StrictMode>,
    
  149.       );
    
  150.       const parent = e.parentNode;
    
  151.       expect(parent.childNodes[0].tagName).toBe('DIV');
    
  152.       expect(parent.childNodes[1].tagName).toBe('SPAN');
    
  153.       expect(parent.childNodes[2].tagName).toBe('P');
    
  154.     });
    
  155. 
    
  156.     itRenders('an empty strict mode', async render => {
    
  157.       expect(
    
  158.         (
    
  159.           await render(
    
  160.             <div>
    
  161.               <React.StrictMode />
    
  162.             </div>,
    
  163.           )
    
  164.         ).firstChild,
    
  165.       ).toBe(null);
    
  166.     });
    
  167.   });
    
  168. });