main
js 101 lines 2.64 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 */
9
10 'use strict';
11
12 import {insertNodesAndExecuteScripts} from '../test-utils/FizzTestUtils';
13 import {patchMessageChannel} from '../../../../scripts/jest/patchMessageChannel';
14
15 // Polyfills for test environment
16 global.ReadableStream =
17 require('web-streams-polyfill/ponyfill/es6').ReadableStream;
18 global.TextEncoder = require('util').TextEncoder;
19
20 let React;
21 let ReactDOMServer;
22 let Scheduler;
23 let assertLog;
24 let container;
25 let serverAct;
26
27 describe('ReactClassComponentPropResolutionFizz', () => {
28 beforeEach(() => {
29 jest.resetModules();
30 Scheduler = require('scheduler');
31 patchMessageChannel();
32
33 React = require('react');
34 ReactDOMServer = require('react-dom/server.browser');
35 assertLog = require('internal-test-utils').assertLog;
36 serverAct = require('internal-test-utils').serverAct;
37 container = document.createElement('div');
38 document.body.appendChild(container);
39 });
40
41 afterEach(() => {
42 document.body.removeChild(container);
43 });
44
45 async function readIntoContainer(stream) {
46 const reader = stream.getReader();
47 let result = '';
48 while (true) {
49 const {done, value} = await reader.read();
50 if (done) {
51 break;
52 }
53 result += Buffer.from(value).toString('utf8');
54 }
55 const temp = document.createElement('div');
56 temp.innerHTML = result;
57 insertNodesAndExecuteScripts(temp, container, null);
58 }
59
60 function Text({text}) {
61 Scheduler.log(text);
62 return text;
63 }
64
65 it('resolves ref and default props before calling lifecycle methods', async () => {
66 function getPropKeys(props) {
67 return Object.keys(props).join(', ');
68 }
69
70 class Component extends React.Component {
71 constructor(props) {
72 super(props);
73 Scheduler.log('constructor: ' + getPropKeys(props));
74 }
75 UNSAFE_componentWillMount() {
76 Scheduler.log('componentWillMount: ' + getPropKeys(this.props));
77 }
78 render() {
79 return <Text text={'render: ' + getPropKeys(this.props)} />;
80 }
81 }
82
83 Component.defaultProps = {
84 default: 'yo',
85 };
86
87 // `ref` should never appear as a prop. `default` always should.
88
89 const ref = React.createRef();
90 const stream = await serverAct(() =>
91 ReactDOMServer.renderToReadableStream(<Component text="Yay" ref={ref} />),
92 );
93 await readIntoContainer(stream);
94
95 assertLog([
96 'constructor: text, default',
97 'componentWillMount: text, default',
98 'render: text, default',
99 ]);
100 });
101 });