main
js 102 lines 2.72 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 let React = require('react');
13 let ReactDOM = require('react-dom');
14
15 describe('root level refs with legacy APIs', () => {
16 beforeEach(() => {
17 jest.resetModules();
18 React = require('react');
19 ReactDOM = require('react-dom');
20 });
21
22 // @gate !disableLegacyMode
23 it('attaches and detaches root refs', () => {
24 let inst = null;
25
26 // host node
27 let ref = jest.fn(value => (inst = value));
28 const container = document.createElement('div');
29 let result = ReactDOM.render(<div ref={ref} />, container);
30 expect(ref).toHaveBeenCalledTimes(1);
31 expect(ref.mock.calls[0][0]).toBeInstanceOf(HTMLDivElement);
32 expect(result).toBe(ref.mock.calls[0][0]);
33 ReactDOM.unmountComponentAtNode(container);
34 expect(ref).toHaveBeenCalledTimes(2);
35 expect(ref.mock.calls[1][0]).toBe(null);
36
37 // composite
38 class Comp extends React.Component {
39 method() {
40 return true;
41 }
42 render() {
43 return <div>Comp</div>;
44 }
45 }
46
47 inst = null;
48 ref = jest.fn(value => (inst = value));
49 result = ReactDOM.render(<Comp ref={ref} />, container);
50
51 expect(ref).toHaveBeenCalledTimes(1);
52 expect(inst).toBeInstanceOf(Comp);
53 expect(result).toBe(inst);
54
55 // ensure we have the correct instance
56 expect(result.method()).toBe(true);
57 expect(inst.method()).toBe(true);
58
59 ReactDOM.unmountComponentAtNode(container);
60 expect(ref).toHaveBeenCalledTimes(2);
61 expect(ref.mock.calls[1][0]).toBe(null);
62
63 // fragment
64 inst = null;
65 ref = jest.fn(value => (inst = value));
66 let divInst = null;
67 const ref2 = jest.fn(value => (divInst = value));
68 result = ReactDOM.render(
69 [
70 <Comp ref={ref} key="a" />,
71 5,
72 <div ref={ref2} key="b">
73 Hello
74 </div>,
75 ],
76 container,
77 );
78
79 // first call should be `Comp`
80 expect(ref).toHaveBeenCalledTimes(1);
81 expect(ref.mock.calls[0][0]).toBeInstanceOf(Comp);
82 expect(result).toBe(ref.mock.calls[0][0]);
83
84 expect(ref2).toHaveBeenCalledTimes(1);
85 expect(divInst).toBeInstanceOf(HTMLDivElement);
86 expect(result).not.toBe(divInst);
87
88 ReactDOM.unmountComponentAtNode(container);
89 expect(ref).toHaveBeenCalledTimes(2);
90 expect(ref.mock.calls[1][0]).toBe(null);
91 expect(ref2).toHaveBeenCalledTimes(2);
92 expect(ref2.mock.calls[1][0]).toBe(null);
93
94 // null
95 result = ReactDOM.render(null, container);
96 expect(result).toBe(null);
97
98 // primitives
99 result = ReactDOM.render(5, container);
100 expect(result).toBeInstanceOf(Text);
101 });
102 });