- /**
- * Copyright (c) Meta Platforms, Inc. and affiliates.
- *
- * 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'; 
- let ReactDOM; 
- let React; 
- let ReactCache; 
- let ReactTestRenderer; 
- let waitForAll; 
- describe('ReactTestRenderer', () => { 
- beforeEach(() => { 
- jest.resetModules(); 
- ReactDOM = require('react-dom'); 
- // Isolate test renderer. 
- jest.resetModules(); 
- React = require('react'); 
- ReactCache = require('react-cache'); 
- ReactTestRenderer = require('react-test-renderer'); 
- const InternalTestUtils = require('internal-test-utils'); 
- waitForAll = InternalTestUtils.waitForAll; 
- });
- it('should warn if used to render a ReactDOM portal', () => { 
- const container = document.createElement('div'); 
- expect(() => { 
- let error; 
- try { 
- ReactTestRenderer.create(ReactDOM.createPortal('foo', container)); 
- } catch (e) { 
- error = e; 
- }
- // After the update throws, a subsequent render is scheduled to 
- // unmount the whole tree. This update also causes an error, so React 
- // throws an AggregateError. 
- const errors = error.errors; 
- expect(errors.length).toBe(2); 
- expect(errors[0].message.includes('indexOf is not a function')).toBe( 
- true, 
- );
- expect(errors[1].message.includes('indexOf is not a function')).toBe( 
- true, 
- );
- }).toErrorDev('An invalid container has been provided.', { 
- withoutStack: true, 
- });
- });
- describe('timed out Suspense hidden subtrees should not be observable via toJSON', () => { 
- let AsyncText; 
- let PendingResources; 
- let TextResource; 
- beforeEach(() => { 
- PendingResources = {}; 
- TextResource = ReactCache.unstable_createResource( 
- text => 
- new Promise(resolve => { 
- PendingResources[text] = resolve; 
- }),
- text => text, 
- );
- AsyncText = ({text}) => { 
- const value = TextResource.read(text); 
- return value; 
- };
- });
- it('for root Suspense components', async () => { 
- const App = ({text}) => { 
- return ( 
- <React.Suspense fallback="fallback"> 
- <AsyncText text={text} /> 
- </React.Suspense> 
- );
- };
- const root = ReactTestRenderer.create(<App text="initial" />); 
- PendingResources.initial('initial'); 
- await waitForAll([]); 
- expect(root.toJSON()).toEqual('initial'); 
- root.update(<App text="dynamic" />); 
- expect(root.toJSON()).toEqual('fallback'); 
- PendingResources.dynamic('dynamic'); 
- await waitForAll([]); 
- expect(root.toJSON()).toEqual('dynamic'); 
- });
- it('for nested Suspense components', async () => {
- const App = ({text}) => {
- return (
- <div>
- <React.Suspense fallback="fallback"> 
- <AsyncText text={text} />
- </React.Suspense> 
- </div>
- );
- };
- const root = ReactTestRenderer.create(<App text="initial" />); 
- PendingResources.initial('initial'); 
- await waitForAll([]); 
- expect(root.toJSON().children).toEqual(['initial']); 
- root.update(<App text="dynamic" />); 
- expect(root.toJSON().children).toEqual(['fallback']); 
- PendingResources.dynamic('dynamic'); 
- await waitForAll([]); 
- expect(root.toJSON().children).toEqual(['dynamic']); 
- });
- });
- });