import * as React from 'react'; import ReactDOM, { findDOMNode } from 'react-dom'; import AutoSizer from '../autoSizer'; function render(markup) { if (!render._mountNode) { render._mountNode = document.createElement('div'); // Unless we attach the mount-node to body, getBoundingClientRect() won't work document.body.appendChild(render._mountNode); afterEach(render.unmount); // window.ResizeObserver = ResizeObserver; } return ReactDOM.render(markup, render._mountNode); } render.unmount = function () { if (render._mountNode) { ReactDOM.unmountComponentAtNode(render._mountNode); document.body.removeChild(render._mountNode); render._mountNode = null; } }; describe('AutoSizer', () => { function getAutoSizer({ defaultHeight = undefined, defaultWidth = undefined, height = 100, width = 200, } = {}) { const wrapperStyle = { boxSizing: 'border-box', height, width, }; mockOffsetSize(width, height); return (
{({ height, width }) => (
{`width:${width}, height:${height}`}
)}
); } // AutoSizer uses offsetWidth and offsetHeight. // Jest runs in JSDom which doesn't support measurements APIs. // refer to https://github.com/bvaughn/react-virtualized-auto-sizer/blob/master/src/__tests__/AutoSizer.js function mockOffsetSize(width, height) { Object.defineProperty(HTMLElement.prototype, 'offsetHeight', { configurable: true, value: height, }); } it('should set the correct initial width and height of ChildComponent or React child', () => { const rendered = findDOMNode(render(getAutoSizer())); // TODO // expect(rendered.textContent).toContain('height:100'); // expect(rendered.textContent).toContain('width:100%'); }); async function simulateResize({ element, height, width }) { mockOffsetSize(width, height); window.dispatchEvent(new Event('resize')); // Allow requestAnimationFrame to be invoked before continuing await new Promise(resolve => setTimeout(resolve, 100)); } it('should update :height after a resize event', async done => { const rendered = findDOMNode( render( getAutoSizer({ height: 100, }), ), ); // expect(rendered.textContent).toContain('height:100'); await simulateResize({ element: rendered, height: 400, }); // TODO // expect(rendered.textContent).toContain('height:400'); done(); }); });