import _ from 'lodash'; import assert from 'assert'; import React from 'react'; import { mount, shallow } from 'enzyme'; import { common } from '../../util/generic-tests'; import { AccordionDumb as Accordion } from './Accordion'; import { ExpanderPanelDumb as ExpanderPanel } from '../ExpanderPanel/ExpanderPanel'; describe('Accordion', () => { common(Accordion, { exemptChildComponents: ['Header'] as any }); describe('props', () => { describe('Item', () => { it('renders ExpanderPanel components on it', () => { const wrapper = mount( One Two ); assert(wrapper.find(ExpanderPanel), 2 as any); }); it('Item as children', () => { const wrapper = shallow( One Two ); assert.strictEqual(wrapper.find('.lucid-Accordion-Item').length, 2); }); }); describe('Header', () => { it('Header as props', () => { const wrapper = mount( Yolo fo sho Broyoyo ); const firstItem = wrapper.find('.lucid-Accordion-Item').first(); assert.strictEqual( firstItem.find('.lucid-ExpanderPanel-header').first().text(), 'Froyo' ); }); it('Header as children', () => { const wrapper = mount( Froyo Yolo fo sho Broyoyo ); const firstItem = wrapper.find('.lucid-Accordion-Item').first(); assert.strictEqual( firstItem.find('.lucid-ExpanderPanel-header').first().text(), 'Froyo' ); }); }); describe('selectedIndex', () => { it('should have an expanded item when set via props', () => { const wrapper = mount( test test test ); assert( wrapper.find('.lucid-ExpanderPanel-content-is-expanded'), 1 as any ); }); }); describe('pass throughs', () => { it('passes through all props not defined in `propTypes` to the root element', () => { const wrapper = shallow( ); const rootProps = wrapper.find('.lucid-Accordion').props(); assert(_.has(rootProps, 'foo'), 'props missing "foo" prop'); assert(_.has(rootProps, 'bar'), 'props missing "bar" prop'); }); it('passes through Item className to the rendered item element', () => { const wrapper = shallow( One Two ); const itemsWrapper = wrapper.find('.lucid-Accordion-Item'); assert.strictEqual( itemsWrapper.find('.TestOne').length, 1, 'must find one item with className `TestOne`' ); assert.strictEqual( itemsWrapper.find('.TestTwo').length, 1, 'must find one item with className `TestTwo`' ); }); }); }); }); describe('Accordion', () => { let wrapper: any; const onSelectMock: any = jest.fn(); let mountTestDiv: any; describe('user picks one of the items', () => { beforeEach(() => { mountTestDiv = document.createElement('div'); document.body.appendChild(mountTestDiv); wrapper = mount( One Two , { attachTo: mountTestDiv, } ); }); afterEach(() => { onSelectMock.mockClear(); wrapper && wrapper.unmount(); mountTestDiv && mountTestDiv.parentNode.removeChild(mountTestDiv); }); it('should call the function passed in as the `onSelect` prop', () => { const firstPanel = wrapper.find('.lucid-ExpanderPanel').at(0); firstPanel.find('.lucid-ExpanderPanel-header').first().simulate('click'); firstPanel.find('.lucid-ExpanderPanel-icon').first().simulate('click'); expect(onSelectMock).toBeCalledTimes(2); }); it('should not call the function passed in as the `onSelect` prop when Item is disabled', () => { const secondPanel = wrapper.find('.lucid-ExpanderPanel').at(2); secondPanel.find('.lucid-ExpanderPanel-header').first().simulate('click'); secondPanel.find('.lucid-ExpanderPanel-icon').first().simulate('click'); expect(onSelectMock).toBeCalledTimes(0); }); }); });