import React from 'react';
import { fireEvent } from '@testing-library/react';
import { act } from 'react-dom/test-utils';
import renderWithTheme from '../../../testUtils/renderWithTheme';
import * as tabUtils from '../utils';
import SubTabs from '../SubTabs';
describe('SubTabs', () => {
const onChange = jest.fn();
const tabs = [
{ id: 1, title: 'Tab 1', panel: 'Tab content 1' },
{ id: 2, title: 'Tab 2', panel: 'Tab content 2' },
{ id: 3, title: 'Tab 3', panel: 'Tab content 3', disabled: true },
];
it('renders correct selected tab', () => {
const { getByText, queryByText } = renderWithTheme(
);
expect(getByText('Tab 1')).toBeInTheDocument();
expect(getByText('Tab 2')).toBeInTheDocument();
expect(getByText('Tab 3')).toBeInTheDocument();
expect(getByText('Tab content 1')).toBeInTheDocument();
expect(queryByText('Tab content 2')).not.toBeInTheDocument();
expect(queryByText('Tab content 3')).not.toBeInTheDocument();
fireEvent.click(getByText('Tab 3'));
expect(onChange).not.toHaveBeenCalled();
fireEvent.click(getByText('Tab 2'));
expect(onChange).toHaveBeenCalledWith(2);
});
it('renders correct selected tab and hide inactive tabs', () => {
const { getByText } = renderWithTheme(
);
expect(getByText('Tab 1')).toBeInTheDocument();
expect(getByText('Tab 2')).toBeInTheDocument();
expect(getByText('Tab 3')).toBeInTheDocument();
expect(getByText('Tab content 1')).toBeInTheDocument();
expect(getByText('Tab content 2')).toBeInTheDocument();
expect(getByText('Tab content 3')).toBeInTheDocument();
expect(getByText('Tab content 2')).not.toBeVisible();
expect(getByText('Tab content 3')).not.toBeVisible();
});
it('allows to hover tab using keyboard', () => {
const WithHookSubTabs = () => {
const [selectedTabId, setSelectedTabId] = React.useState(
1
);
return (
);
};
const { getByText } = renderWithTheme();
const tab1 = getByText('Tab 1');
const tab2 = getByText('Tab 2');
const tab3 = getByText('Tab 3');
// Focus tab 1
fireEvent.click(tab1);
expect(tab1.tabIndex).toBe(0);
expect(tab2.tabIndex).toBe(-1);
expect(tab3.tabIndex).toBe(-1);
// Use arrow key to go right
fireEvent.keyDown(tab1, { key: 'ArrowRight', keyCode: 39 });
expect(tab1.tabIndex).toBe(-1);
expect(tab2.tabIndex).toBe(0);
expect(tab3.tabIndex).toBe(-1);
// Use arrow key to go left
fireEvent.keyDown(tab2, { key: 'ArrowLeft', keyCode: 37 });
expect(tab1.tabIndex).toBe(0);
expect(tab2.tabIndex).toBe(-1);
expect(tab3.tabIndex).toBe(-1);
});
it('has active tab indicator', async () => {
jest.useFakeTimers();
const spiedGetTabWidth = jest.spyOn(tabUtils, 'getTabWidth');
const { getByTestId } = renderWithTheme(
);
const activeTabIndicator = getByTestId('active-tab-indicator');
expect(activeTabIndicator).toBeInTheDocument();
await act(async () => {
jest.runAllTimers();
});
expect(spiedGetTabWidth).toHaveBeenCalledTimes(3);
});
});