import _, { forEach, has, noop } from 'lodash'; import React from 'react'; import { shallow } from 'enzyme'; import { common } from '../../util/generic-tests'; import InfiniteSlidePanel from './InfiniteSlidePanel'; import ImageIcon from '../Icon/ImageIcon/ImageIcon'; import SlidePanel from '../SlidePanel/SlidePanel'; describe('InfiniteSlidePanel', () => { common(InfiniteSlidePanel, { getDefaultProps() { return { children: (slideOffset: any) => {slideOffset}, }; }, }); describe('props', () => { describe('root pass throughs', () => { let wrapper: any; const Slide = SlidePanel.Slide; beforeEach(() => { const props = { ...InfiniteSlidePanel.defaultProps, totalSlides: 11, className: 'wut', style: { marginRight: 10 }, initialState: { test: true }, callbackId: 1, 'data-testid': 10, }; wrapper = shallow( {(slideOffset) => {
{slideOffset}
; }}
); }); afterEach(() => { if (wrapper) { wrapper.unmount(); } }); it('passes through props not defined in `propTypes` to the root element.', () => { const rootProps = wrapper.find('.lucid-InfiniteSlidePanel').props(); expect(wrapper.first().prop(['className'])).toContain('wut'); expect(wrapper.first().prop(['style'])).toMatchObject({ marginRight: 10, }); expect(wrapper.first().prop(['data-testid'])).toBe(10); expect(wrapper.first().prop(['callbackId'])).toBe(1); // 'className', 'offset', 'slidesToShow' and 'onSwipe' are plucked from the pass through object // but still appears becuase each one is also directly added to the root element as a prop // callbackId is not omitted because the root element is not a DOM element forEach( [ 'isAnimated', 'isLooped', 'offset', 'slidesToShow', 'onSwipe', 'className', 'data-testid', 'style', 'children', 'callbackId', ], (prop) => { expect(has(rootProps, prop)).toBe(true); } ); }); it('omits the props defined in `propTypes` (plus, in addition, `initialState`, and `callbackId`) from the root element', () => { const rootProps = wrapper.find('.lucid-InfiniteSlidePanel').props(); forEach(['totalSlides', 'Slide', 'initialState'], (prop) => { expect(has(rootProps, prop)).toBe(false); }); }); }); }); describe('required children', () => { it('should throw if not passed a function or Slide as children', () => { expect(() => { shallow(); }).toThrowErrorMatchingSnapshot(); }); it('should throw if child slide not passed a function child', () => { expect(() => { shallow( foo ); }).toThrowErrorMatchingSnapshot(); }); it('should not throw if passed a Slide child element with function child', () => { expect(() => { shallow( {() => null} ); }).not.toThrow(); }); it('should not throw if passed a function child', () => { expect(() => { shallow({() => null}); }).not.toThrow(); }); }); });