import {mount, shallow} from 'enzyme'; import React from 'react'; import {Popup} from 'src/Popup'; class Wrapper extends React.Component { constructor (props) { super(props); this.anchorRef = React.createRef(); this.state = { popupVisible: false }; } render () { const buttonStyle = { left: '10px', position: 'relative', top: '10px' }; return (
HERE POPUP CONTENT BE
); } } describe('Popup', () => { let mountNode = null; let onLayout = null; let onOverlayClick = null; beforeEach(() => { onLayout = jasmine.createSpy('fakeOnLayout'); onOverlayClick = jasmine.createSpy('fakeOnOverlayClick'); mountNode = document.createElement('div'); document.body.appendChild(mountNode); }); afterEach(() => { document.body.removeChild(mountNode); }); describe('componentDidUpdate', () => { it('should not layout if visibility did not change', () => { const component = shallow( HERE POPUP CONTENT BE ); spyOn(component.instance(), 'layout'); component.instance().componentDidUpdate({visible: false}); expect(component.instance().layout).not.toHaveBeenCalled(); }); it('should not layout if it became hidden', () => { const component = shallow( HERE POPUP CONTENT BE ); spyOn(component.instance(), 'layout'); component.instance().componentDidUpdate({visible: true}); expect(component.instance().layout).not.toHaveBeenCalled(); }); it('should not layout if it became visible', () => { const component = shallow( HERE POPUP CONTENT BE ); spyOn(component.instance(), 'layout'); component.instance().componentDidUpdate({visible: false}); expect(component.instance().layout).toHaveBeenCalled(); }); }); describe('layout', () => { it('should apply default layout if rendering without anchor', () => { const component = shallow( HERE POPUP CONTENT BE ); component.instance().layout(); expect(component.state('layout')).toEqual([0, 0]); }); it('should not call onLayout when invisible', () => { const component = shallow( HERE POPUP CONTENT BE ); component.instance().layout(); expect(onLayout).not.toHaveBeenCalled(); }); it('should layout according to the anchor', () => { const component = mount(, {attachTo: mountNode}); component.setState({popupVisible: true}); const popup = component.find(Popup); expect(popup.instance().state.layout).not.toEqual([0, 0]); component.unmount(); }); it('should call onLayout to allow for customization of the inner layer layout', () => { onLayout = onLayout.and.returnValue([20, 20]); const component = shallow( HERE POPUP CONTENT BE ); component.instance().layout(); expect(onLayout).toHaveBeenCalledWith([0, 0]); expect(component.state('layout')).toEqual([20, 20]); }); it('should allow the onLayout callback to specify height and width', () => { onLayout = onLayout.and.returnValue([20, 20, 100, 100]); const component = shallow( HERE POPUP CONTENT BE ); component.instance().layout(); expect(component.state('layout')).toEqual([20, 20, 100, 100]); }); }); describe('render', () => { it('should render with a custom class', () => { const component = shallow( HERE POPUP CONTENT BE ); const popup = component.find('.bthlabs-react-custom-popup'); expect(popup.hasClass('spam')).toBe(true); }); it('should render as invisible', () => { const component = shallow( HERE POPUP CONTENT BE ); const popup = component.find('.bthlabs-react-custom-popup'); expect(popup.hasClass('bthlabs-rcp-visible')).toBe(false); }); it('should render as visible', () => { const component = shallow( HERE POPUP CONTENT BE ); const popup = component.find('.bthlabs-react-custom-popup'); expect(popup.hasClass('bthlabs-rcp-visible')).toBe(true); }); it('should allow hiding the overlay', () => { const component = shallow( HERE POPUP CONTENT BE ); const overlay = component.find('.bthlabs-rcp-overlay'); expect(overlay.exists()).toBe(false); }); it('should configure and render the overlay', () => { const component = shallow( HERE POPUP CONTENT BE ); const overlay = component.find('.bthlabs-rcp-overlay'); expect(overlay.exists()).toBe(true); expect(overlay.prop('onClick')).toBe(onOverlayClick); }); it('should not apply layout style on the inner layer when invisible', () => { const component = shallow( HERE POPUP CONTENT BE ); const inner = component.find('.bthlabs-rcp-inner'); expect(inner.prop('style')).toEqual({}); }); it('should apply layout style on the inner layer when visible', () => { const component = shallow( HERE POPUP CONTENT BE ); component.setState({layout: [20, 20]}); const inner = component.find('.bthlabs-rcp-inner'); expect(inner.prop('style').left).toEqual('20px'); expect(inner.prop('style').top).toEqual('20px'); }); it('should set the inner layer height and width if onLayout specified them', () => { const component = shallow( HERE POPUP CONTENT BE ); component.setState({layout: [20, 20, 100, 100]}); const inner = component.find('.bthlabs-rcp-inner'); expect(inner.prop('style').height).toEqual('100px'); expect(inner.prop('style').width).toEqual('100px'); }); it('should render the children in the inner layer', () => { const component = shallow( HERE POPUP CONTENT BE ); const inner = component.find('.bthlabs-rcp-inner'); expect(inner.contains(HERE POPUP CONTENT BE)).toBe(true); }); }); });