/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow */ import typeof ReactTestRenderer from 'react-test-renderer'; import type {Element} from 'react-devtools-shared/src/devtools/views/Components/types'; import type {FrontendBridge} from 'react-devtools-shared/src/bridge'; import type Store from 'react-devtools-shared/src/devtools/store'; describe('OwnersListContext', () => { let React; let ReactDOM; let TestRenderer: ReactTestRenderer; let bridge: FrontendBridge; let store: Store; let utils; let BridgeContext; let OwnersListContext; let OwnersListContextController; let StoreContext; let TreeContextController; beforeEach(() => { utils = require('./utils'); utils.beforeEachProfiling(); bridge = global.bridge; store = global.store; store.collapseNodesByDefault = false; React = require('react'); ReactDOM = require('react-dom'); TestRenderer = utils.requireTestRenderer(); BridgeContext = require('react-devtools-shared/src/devtools/views/context') .BridgeContext; OwnersListContext = require('react-devtools-shared/src/devtools/views/Components/OwnersListContext') .OwnersListContext; OwnersListContextController = require('react-devtools-shared/src/devtools/views/Components/OwnersListContext') .OwnersListContextController; StoreContext = require('react-devtools-shared/src/devtools/views/context') .StoreContext; TreeContextController = require('react-devtools-shared/src/devtools/views/Components/TreeContext') .TreeContextController; }); const Contexts = ({children, defaultOwnerID = null}) => ( {children} ); it('should fetch the owners list for the selected element', async done => { const Grandparent = () => ; const Parent = () => { return ( ); }; const Child = () => null; utils.act(() => ReactDOM.render(, document.createElement('div')), ); expect(store).toMatchSnapshot('mount'); const parent = ((store.getElementAtIndex(1): any): Element); const firstChild = ((store.getElementAtIndex(2): any): Element); let didFinish = false; function Suspender({owner}) { const read = React.useContext(OwnersListContext); const owners = read(owner.id); expect(owners).toMatchSnapshot( `owners for "${(owner && owner.displayName) || ''}"`, ); didFinish = true; return null; } await utils.actAsync(() => TestRenderer.create( , ), ); expect(didFinish).toBe(true); didFinish = false; await utils.actAsync(() => TestRenderer.create( , ), ); expect(didFinish).toBe(true); done(); }); it('should fetch the owners list for the selected element that includes filtered components', async done => { store.componentFilters = [utils.createDisplayNameFilter('^Parent$')]; const Grandparent = () => ; const Parent = () => { return ( ); }; const Child = () => null; utils.act(() => ReactDOM.render(, document.createElement('div')), ); expect(store).toMatchSnapshot('mount'); const firstChild = ((store.getElementAtIndex(1): any): Element); let didFinish = false; function Suspender({owner}) { const read = React.useContext(OwnersListContext); const owners = read(owner.id); expect(owners).toMatchSnapshot( `owners for "${(owner && owner.displayName) || ''}"`, ); didFinish = true; return null; } await utils.actAsync(() => TestRenderer.create( , ), ); expect(didFinish).toBe(true); done(); }); it('should include the current element even if there are no other owners', async done => { store.componentFilters = [utils.createDisplayNameFilter('^Parent$')]; const Grandparent = () => ; const Parent = () => null; utils.act(() => ReactDOM.render(, document.createElement('div')), ); expect(store).toMatchSnapshot('mount'); const grandparent = ((store.getElementAtIndex(0): any): Element); let didFinish = false; function Suspender({owner}) { const read = React.useContext(OwnersListContext); const owners = read(owner.id); expect(owners).toMatchSnapshot( `owners for "${(owner && owner.displayName) || ''}"`, ); didFinish = true; return null; } await utils.actAsync(() => TestRenderer.create( , ), ); expect(didFinish).toBe(true); done(); }); });