main
js 115 lines 3 KB
Raw
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 ReactDOMClient;
17 let ReactDOMServer;
18
19 function initModules() {
20 // Reset warning cache.
21 jest.resetModules();
22 React = require('react');
23 ReactDOMClient = require('react-dom/client');
24 ReactDOMServer = require('react-dom/server');
25
26 // Make them available to the helpers.
27 return {
28 ReactDOMClient,
29 ReactDOMServer,
30 };
31 }
32
33 const {resetModules, itRenders} = ReactDOMServerIntegrationUtils(initModules);
34
35 describe('ReactDOMServerIntegration', () => {
36 beforeEach(() => {
37 resetModules();
38 });
39
40 describe('React.StrictMode', () => {
41 itRenders('a strict mode with one child', async render => {
42 const e = await render(
43 <React.StrictMode>
44 <div>text1</div>
45 </React.StrictMode>,
46 );
47 const parent = e.parentNode;
48 expect(parent.childNodes[0].tagName).toBe('DIV');
49 });
50
51 itRenders('a strict mode with several children', async render => {
52 const Header = props => {
53 return <p>header</p>;
54 };
55 const Footer = props => {
56 return (
57 <React.StrictMode>
58 <h2>footer</h2>
59 <h3>about</h3>
60 </React.StrictMode>
61 );
62 };
63 const e = await render(
64 <React.StrictMode>
65 <div>text1</div>
66 <span>text2</span>
67 <Header />
68 <Footer />
69 </React.StrictMode>,
70 );
71 const parent = e.parentNode;
72 expect(parent.childNodes[0].tagName).toBe('DIV');
73 expect(parent.childNodes[1].tagName).toBe('SPAN');
74 expect(parent.childNodes[2].tagName).toBe('P');
75 expect(parent.childNodes[3].tagName).toBe('H2');
76 expect(parent.childNodes[4].tagName).toBe('H3');
77 });
78
79 itRenders('a nested strict mode', async render => {
80 const e = await render(
81 <React.StrictMode>
82 <React.StrictMode>
83 <div>text1</div>
84 </React.StrictMode>
85 <span>text2</span>
86 <React.StrictMode>
87 <React.StrictMode>
88 <React.StrictMode>
89 {null}
90 <p />
91 </React.StrictMode>
92 {false}
93 </React.StrictMode>
94 </React.StrictMode>
95 </React.StrictMode>,
96 );
97 const parent = e.parentNode;
98 expect(parent.childNodes[0].tagName).toBe('DIV');
99 expect(parent.childNodes[1].tagName).toBe('SPAN');
100 expect(parent.childNodes[2].tagName).toBe('P');
101 });
102
103 itRenders('an empty strict mode', async render => {
104 expect(
105 (
106 await render(
107 <div>
108 <React.StrictMode />
109 </div>,
110 )
111 ).firstChild,
112 ).toBe(null);
113 });
114 });
115 });