@targetprocess/tabs
Version: 
162 lines (139 loc) • 4.68 kB
JSX
/* eslint-env jest */
import React from 'react'
import {mount} from 'enzyme'
import {Tabs} from '../Tabs'
import {TabPanel} from '../TabPanel'
describe('Tabs', () => {
  it('should render tabs and only render content of an active tab', () => {
    const wrapper = mount(
      <Tabs activeTabId="2">
        <Tabs.Tab header="fooTab" id="1">
          foo
        </Tabs.Tab>
        <Tabs.Tab header="barTab" id="2">
          bar
        </Tabs.Tab>
      </Tabs>
    )
    const tabItems = wrapper.find('.tabs__header__tab-item')
    expect(tabItems).toHaveLength(2)
    expect(tabItems.at(0).text()).toBe('fooTab')
    expect(tabItems.at(1).text()).toBe('barTab')
    expect(tabItems.at(1).hasClass('tabs__header__tab-item--active')).toBeTruthy()
    const tabsContent = wrapper.find('.tabs__body')
    expect(tabsContent.text()).toEqual('bar')
  })
  it('should trigger onActiveTabChanged on click but only for non-disabled tabs', () => {
    const onActiveTabChangedMock = jest.fn()
    const wrapper = mount(
      <Tabs activeTabId="1" onActiveTabChanged={onActiveTabChangedMock}>
        <Tabs.Tab header="fooTab" id="1">
          foo
        </Tabs.Tab>
        <Tabs.Tab header="barTab" id="2">
          bar
        </Tabs.Tab>
        <Tabs.Tab header="barTab" id="3" disabled>
          bar
        </Tabs.Tab>
      </Tabs>
    )
    const tabs = wrapper.find('.tabs__header__tab-item')
    tabs.at(1).simulate('click')
    expect(onActiveTabChangedMock).toHaveBeenCalledWith('2')
    onActiveTabChangedMock.mockClear()
    tabs.at(2).simulate('click')
    expect(onActiveTabChangedMock).not.toHaveBeenCalled()
  })
  it('should handle header as render prop', () => {
    const renderHeader = ({onResize}) => {
      expect(typeof onResize).toBe('function')
      return 'testTab'
    }
    const wrapper = mount(
      <Tabs activeTabId="1">
        <Tabs.Tab header={renderHeader} id="1">
          foo
        </Tabs.Tab>
      </Tabs>
    )
    const tabItems = wrapper.find('.tabs__header__tab-item')
    expect(tabItems.at(0).text()).toBe('testTab')
  })
  it('should use provided `activeTabId` in controlled model as `activeTabId`', () => {
    const onActiveTabChangedMock = jest.fn()
    const wrapper = mount(
      <Tabs activeTabId="2" onActiveTabChanged={onActiveTabChangedMock}>
        <Tabs.Tab header="fooTab" id="1">
          foo
        </Tabs.Tab>
        <Tabs.Tab header="barTab" id="2">
          bar
        </Tabs.Tab>
        <Tabs.Tab header="bazTab" id="3" disabled>
          baz
        </Tabs.Tab>
      </Tabs>
    )
    const tabPanel = wrapper.find(TabPanel)
    expect(tabPanel).toHaveLength(1)
    expect(tabPanel.text()).toEqual('bar')
  })
  it('should open first tab in controlled mode if `activeTabId` is not provided', () => {
    const onActiveTabChangedMock = jest.fn()
    const wrapper = mount(
      <Tabs activeTabId={null} onActiveTabChanged={onActiveTabChangedMock}>
        <Tabs.Tab header="fooTab" id="1">
          foo
        </Tabs.Tab>
        <Tabs.Tab header="barTab" id="2">
          bar
        </Tabs.Tab>
        <Tabs.Tab header="bazTab" id="3" disabled>
          baz
        </Tabs.Tab>
      </Tabs>
    )
    const tabPanel = wrapper.find(TabPanel)
    expect(tabPanel).toHaveLength(1)
    expect(tabPanel.text()).toEqual('foo')
  })
  it('should open first tab if provided `activeTabId` does not exists', () => {
    const onActiveTabChangedMock = jest.fn()
    const wrapper = mount(
      <Tabs activeTabId="4" onActiveTabChanged={onActiveTabChangedMock}>
        <Tabs.Tab header="fooTab" id="1">
          foo
        </Tabs.Tab>
        <Tabs.Tab header="barTab" id="2">
          bar
        </Tabs.Tab>
        <Tabs.Tab header="bazTab" id="3">
          baz
        </Tabs.Tab>
      </Tabs>
    )
    const tabPanel = wrapper.find(TabPanel)
    expect(tabPanel).toHaveLength(1)
    expect(tabPanel.text()).toEqual('foo')
  })
  it('should open first tab if `activeTabId` is not provided', () => {
    const onActiveTabChangedMock = jest.fn()
    const wrapper = mount(
      <Tabs onActiveTabChanged={onActiveTabChangedMock}>
        <Tabs.Tab header="fooTab" id="1">
          foo
        </Tabs.Tab>
        <Tabs.Tab header="barTab" id="2">
          bar
        </Tabs.Tab>
        <Tabs.Tab header="bazTab" id="3">
          baz
        </Tabs.Tab>
      </Tabs>
    )
    const tabPanel = wrapper.find(TabPanel)
    expect(tabPanel).toHaveLength(1)
    expect(tabPanel.text()).toEqual('foo')
  })
})