import * as React from 'react'; import { isConformant } from 'test/specs/commonTests'; import { Carousel, CarouselProps, carouselSlotClassNames } from 'src/components/Carousel/Carousel'; import { Button } from 'src/components/Button/Button'; import { carouselNavigationClassName } from 'src/components/Carousel/CarouselNavigation'; import { carouselNavigationItemClassName } from 'src/components/Carousel/CarouselNavigationItem'; import { Text } from 'src/components/Text/Text'; import { ReactWrapper, CommonWrapper } from 'enzyme'; import { findIntrinsicElement, mountWithProvider } from 'test/utils'; const buttonName = 'button-to-test'; const items = [ { key: 'item1', content: (
), }, { key: 'item2', content: , }, { key: 'item3', content: , }, { key: 'item4', content: , }, ]; function renderCarousel(props?: CarouselProps): ReactWrapper { return mountWithProvider( `${index + 1} of ${length}`} {...props} />, ); } const getItemsContainer = (wrapper: ReactWrapper): CommonWrapper => findIntrinsicElement(wrapper, `.${carouselSlotClassNames.itemsContainer}`); const getPaddleNextWrapper = (wrapper: ReactWrapper): CommonWrapper => findIntrinsicElement(wrapper, `.${carouselSlotClassNames.paddleNext}`); const getPaddlePreviousWrapper = (wrapper: ReactWrapper): CommonWrapper => findIntrinsicElement(wrapper, `.${carouselSlotClassNames.paddlePrevious}`); const getPaginationWrapper = (wrapper: ReactWrapper): CommonWrapper => findIntrinsicElement(wrapper, `.${carouselSlotClassNames.pagination}`); const getNavigationNavigationWrapper = (wrapper: ReactWrapper): CommonWrapper => findIntrinsicElement(wrapper, `.${carouselNavigationClassName}`); const getNavigationNavigationItemAtIndexWrapper = (wrapper: ReactWrapper, index: number): CommonWrapper => findIntrinsicElement(wrapper, `.${carouselNavigationItemClassName}`).at(index); const getButtonWrapper = (wrapper: ReactWrapper): CommonWrapper => findIntrinsicElement(wrapper, `#${buttonName}`); jest.useFakeTimers(); describe('Carousel', () => { isConformant(Carousel, { constructorName: 'Carousel', autoControlledProps: ['activeIndex'] }); describe('activeIndex', () => { it('should increase at paddle next press', () => { const wrapper = renderCarousel(); const paddleNext = getPaddleNextWrapper(wrapper); const pagination = getPaginationWrapper(wrapper); paddleNext.simulate('click'); expect(pagination.getDOMNode().textContent).toBe(`2 of ${items.length}`); }); it('should decrese at paddle previous press', () => { const wrapper = renderCarousel({ defaultActiveIndex: 3 }); const paddlePrevious = getPaddlePreviousWrapper(wrapper); const pagination = getPaginationWrapper(wrapper); paddlePrevious.simulate('click'); expect(pagination.getDOMNode().textContent).toBe(`3 of ${items.length}`); }); it('should wrap at paddle next press if last and circular', () => { const wrapper = renderCarousel({ circular: true, defaultActiveIndex: 3 }); const paddleNext = getPaddleNextWrapper(wrapper); const pagination = getPaginationWrapper(wrapper); paddleNext.simulate('click'); expect(pagination.getDOMNode().textContent).toBe(`1 of ${items.length}`); }); it('should wrap at paddle previous press if first and circular', () => { const wrapper = renderCarousel({ circular: true }); const paddlePrevious = getPaddlePreviousWrapper(wrapper); const pagination = getPaginationWrapper(wrapper); paddlePrevious.simulate('click'); expect(pagination.getDOMNode().textContent).toBe(`4 of ${items.length}`); }); it('should increment at arrow right', () => { const wrapper = renderCarousel({ circular: true }); const pagination = getPaginationWrapper(wrapper); const itemsContainer = getItemsContainer(wrapper); itemsContainer.simulate('keydown', { key: 'ArrowRight' }); expect(pagination.getDOMNode().textContent).toBe(`2 of ${items.length}`); }); it('should decrement at arrow left', () => { const wrapper = renderCarousel({ circular: true, defaultActiveIndex: 3 }); const pagination = getPaginationWrapper(wrapper); const itemsContainer = getItemsContainer(wrapper); itemsContainer.simulate('keydown', { key: 'ArrowLeft' }); expect(pagination.getDOMNode().textContent).toBe(`3 of ${items.length}`); }); it('should not increment at arrow right if last and not circular', () => { const wrapper = renderCarousel({ defaultActiveIndex: 3 }); const pagination = getPaginationWrapper(wrapper); const itemsContainer = getItemsContainer(wrapper); itemsContainer.simulate('keydown', { key: 'ArrowRight' }); expect(pagination.getDOMNode().textContent).toBe(`4 of ${items.length}`); }); it('should not decrement at arrow left if first and not circular', () => { const wrapper = renderCarousel(); const pagination = getPaginationWrapper(wrapper); const itemsContainer = getItemsContainer(wrapper); itemsContainer.simulate('keydown', { key: 'ArrowLeft' }); expect(pagination.getDOMNode().textContent).toBe(`1 of ${items.length}`); }); it('should not change at arrow left if event is invoked on child element', () => { const wrapper = renderCarousel({ circular: true }); const button = getButtonWrapper(wrapper); const pagination = getPaginationWrapper(wrapper); button.simulate('keydown', { key: 'ArrowLeft' }); expect(pagination.getDOMNode().textContent).toBe(`1 of ${items.length}`); }); it('should not change at arrow right if event is invoked on child element', () => { const wrapper = renderCarousel(); const button = getButtonWrapper(wrapper); const pagination = getPaginationWrapper(wrapper); button.simulate('keydown', { key: 'ArrowRight' }); expect(pagination.getDOMNode().textContent).toBe(`1 of ${items.length}`); }); }); describe('paddle', () => { it('next should be hidden on last element if not circular', () => { const wrapper = renderCarousel({ defaultActiveIndex: 3, circular: true }); expect(!wrapper.exists(`.${carouselSlotClassNames.paddleNext}`)); expect(wrapper.exists(`.${carouselSlotClassNames.paddlePrevious}`)); }); it('previous should be hidden on last element if not circular', () => { const wrapper = renderCarousel({ circular: true }); expect(!wrapper.exists(`.${carouselSlotClassNames.paddlePrevious}`)); expect(wrapper.exists(`.${carouselSlotClassNames.paddleNext}`)); }); it('next should not be hidden on last element if circular', () => { const wrapper = renderCarousel({ defaultActiveIndex: 3, circular: true }); expect(wrapper.exists(`.${carouselSlotClassNames.paddleNext}`)); expect(wrapper.exists(`.${carouselSlotClassNames.paddlePrevious}`)); }); it('previous should not be hidden on last element if circular', () => { const wrapper = renderCarousel({ circular: true }); expect(wrapper.exists(`.${carouselSlotClassNames.paddlePrevious}`)); expect(wrapper.exists(`.${carouselSlotClassNames.paddleNext}`)); }); it('next should be focused on last slide transition if pagination and not circular', () => { const wrapper = renderCarousel({ defaultActiveIndex: 1 }); const paddleNext = getPaddleNextWrapper(wrapper); const paddlePrevios = getPaddlePreviousWrapper(wrapper); paddlePrevios.simulate('keydown', { key: 'Enter' }); expect(document.activeElement).toEqual(paddleNext.getDOMNode()); }); it('previous should be focused on first slide transition if pagination and not circular', () => { const wrapper = renderCarousel({ defaultActiveIndex: 2 }); const paddleNext = getPaddleNextWrapper(wrapper); const paddlePrevios = getPaddlePreviousWrapper(wrapper); paddleNext.simulate('keydown', { key: 'Enter' }); expect(document.activeElement).toEqual(paddlePrevios.getDOMNode()); }); }); describe('navigation', () => { const navigation = { items: items.map(item => ({ key: item.key, icon: { name: 'icon-circle' } })), }; afterEach(() => { jest.runAllTimers(); }); it('should not show pagination if navigation prop is passed', () => { const wrapper = renderCarousel({ navigation }); const navigationWrapper = getNavigationNavigationWrapper(wrapper); const paginationWrapper = getPaginationWrapper(wrapper); expect(paginationWrapper.exists()).toBe(false); expect(navigationWrapper.exists()).toBe(true); expect(navigationWrapper.getDOMNode().children.length).toBe(4); }); it('should show pagination if navigation prop is not passed', () => { const wrapper = renderCarousel(); const navigationWrapper = getNavigationNavigationWrapper(wrapper); const paginationWrapper = getPaginationWrapper(wrapper); expect(paginationWrapper.exists()).toBe(true); expect(navigationWrapper.exists()).toBe(false); }); it('should show and focus the appropriate slide when clicked', () => { const wrapper = renderCarousel({ navigation }); const secondNavigationItemWrapper = getNavigationNavigationItemAtIndexWrapper(wrapper, 1); secondNavigationItemWrapper.simulate('click'); jest.runAllTimers(); expect(document.activeElement.firstElementChild.innerHTML).toEqual('item2'); }); it('should show no pagination if getItemPositionText is not passed', () => { const wrapper = renderCarousel({ getItemPositionText: undefined }); const paginationWrapper = getPaginationWrapper(wrapper); expect(paginationWrapper.exists()).toBe(false); }); }); });