/** * Copyright (c) 2013-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @emails react-core */ 'use strict'; const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegrationTestUtils'); let React; let ReactDOM; let ReactDOMServer; function initModules() { // Reset warning cache. jest.resetModuleRegistry(); React = require('react'); ReactDOM = require('react-dom'); ReactDOMServer = require('react-dom/server'); // Make them available to the helpers. return { ReactDOM, ReactDOMServer, }; } const { resetModules, asyncReactDOMRender, clientRenderOnServerString, expectMarkupMatch, } = ReactDOMServerIntegrationUtils(initModules); describe('ReactDOMServerIntegration', () => { beforeEach(() => { resetModules(); }); describe('refs', function() { it('should not run ref code on server', async () => { let refCount = 0; class RefsComponent extends React.Component { render() { return
refCount++} />; } } await expectMarkupMatch(,
); expect(refCount).toBe(0); }); it('should run ref code on client', async () => { let refCount = 0; class RefsComponent extends React.Component { render() { return
refCount++} />; } } await expectMarkupMatch(
, ); expect(refCount).toBe(1); }); it('should send the correct element to ref functions on client', async () => { let refElement = null; class RefsComponent extends React.Component { render() { return
(refElement = e)} />; } } const e = await clientRenderOnServerString(); expect(refElement).not.toBe(null); expect(refElement).toBe(e); }); it('should have string refs on client when rendered over server markup', async () => { class RefsComponent extends React.Component { render() { return
; } } const markup = ReactDOMServer.renderToString(); const root = document.createElement('div'); root.innerHTML = markup; let component = null; resetModules(); await asyncReactDOMRender( (component = e)} />, root, true, ); expect(component.refs.myDiv).toBe(root.firstChild); }); }); it('should forward refs', async () => { const divRef = React.createRef(); class InnerComponent extends React.Component { render() { return
{this.props.value}
; } } const OuterComponent = React.forwardRef((props, ref) => ( )); await clientRenderOnServerString( , ); expect(divRef.current).not.toBe(null); expect(divRef.current.textContent).toBe('hello'); }); });