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.   describe('React.Fragment', () => {
    
  44.     itRenders('a fragment with one child', async render => {
    
  45.       const e = await render(
    
  46.         <>
    
  47.           <div>text1</div>
    
  48.         </>,
    
  49.       );
    
  50.       const parent = e.parentNode;
    
  51.       expect(parent.childNodes[0].tagName).toBe('DIV');
    
  52.     });
    
  53. 
    
  54.     itRenders('a fragment with several children', async render => {
    
  55.       const Header = props => {
    
  56.         return <p>header</p>;
    
  57.       };
    
  58.       const Footer = props => {
    
  59.         return (
    
  60.           <>
    
  61.             <h2>footer</h2>
    
  62.             <h3>about</h3>
    
  63.           </>
    
  64.         );
    
  65.       };
    
  66.       const e = await render(
    
  67.         <>
    
  68.           <div>text1</div>
    
  69.           <span>text2</span>
    
  70.           <Header />
    
  71.           <Footer />
    
  72.         </>,
    
  73.       );
    
  74.       const parent = e.parentNode;
    
  75.       expect(parent.childNodes[0].tagName).toBe('DIV');
    
  76.       expect(parent.childNodes[1].tagName).toBe('SPAN');
    
  77.       expect(parent.childNodes[2].tagName).toBe('P');
    
  78.       expect(parent.childNodes[3].tagName).toBe('H2');
    
  79.       expect(parent.childNodes[4].tagName).toBe('H3');
    
  80.     });
    
  81. 
    
  82.     itRenders('a nested fragment', async render => {
    
  83.       const e = await render(
    
  84.         <>
    
  85.           <>
    
  86.             <div>text1</div>
    
  87.           </>
    
  88.           <span>text2</span>
    
  89.           <>
    
  90.             <>
    
  91.               <>
    
  92.                 {null}
    
  93.                 <p />
    
  94.               </>
    
  95.               {false}
    
  96.             </>
    
  97.           </>
    
  98.         </>,
    
  99.       );
    
  100.       const parent = e.parentNode;
    
  101.       expect(parent.childNodes[0].tagName).toBe('DIV');
    
  102.       expect(parent.childNodes[1].tagName).toBe('SPAN');
    
  103.       expect(parent.childNodes[2].tagName).toBe('P');
    
  104.     });
    
  105. 
    
  106.     itRenders('an empty fragment', async render => {
    
  107.       expect(
    
  108.         (
    
  109.           await render(
    
  110.             <div>
    
  111.               <React.Fragment />
    
  112.             </div>,
    
  113.           )
    
  114.         ).firstChild,
    
  115.       ).toBe(null);
    
  116.     });
    
  117.   });
    
  118. });