import * as React from 'react'; import { composeStories } from '@storybook/testing-react'; import * as stories from './Table.stories'; import { render, fireEvent, screen } from '@testing-library/react'; const { DefaultTable, NoPagination, NoData, FrozenPageTable, OutOfRangeFrozenTable, NoDataCustomComponent, NoDataCustomText, LoadingTable, } = composeStories(stories); const testOnChangeEvent = jest.fn(); describe('Table - DefaultTable', () => { // Arguments const header = DefaultTable?.args?.header ? DefaultTable?.args?.header : []; const pageSize = DefaultTable?.args?.pageSize ? DefaultTable?.args?.pageSize : 0; const maxPages = DefaultTable?.args?.maxPages ? DefaultTable?.args?.maxPages : 0; it('renders the component', () => { render(); const element = screen.getByTestId('test-table-parent'); expect(element).not.toBeNull(); }); it('Defines proper sub headings', () => { render(); const element = screen.getAllByRole('table-header'); expect(element.length).toEqual(header?.length); }); it('Computes Correct Number of table items', () => { render(); const element = screen.getAllByRole('table-item'); expect(element.length).toEqual(pageSize * header?.length); }); it('Computes Correct Number of Pagination', () => { render(); const element = screen.getAllByRole('pagination-item'); expect(element.length).toBeLessThan(maxPages + 1); }); it('Always one pagination visible', () => { render(); const element = screen.getByTestId('pagination_true'); expect(element).toBeDefined(); }); it('Should call back on page change', () => { const { rerender } = render( , ); const next: HTMLElement = screen.getByTestId('pagination-next'); fireEvent.click(next); rerender(); expect(testOnChangeEvent).toBeCalled(); }); it('Should change pagination to next on Click', () => { const { rerender } = render(); let element: any = screen.getByTestId('pagination_true'); const next: HTMLElement = screen.getByTestId('pagination-next'); const keys: string[] = [...Object.keys(element)]; const firstPaginationKey: string = `${element[keys[0]].return.key}`; fireEvent.click(next); rerender(); element = screen.getByTestId('pagination_true'); const Skeys: any = [...Object.keys(element)]; const SeccondPaginationKey: string = `${ (element[Skeys[0]] as any).return?.key }`; const getNumber = (state: string): number => { return parseInt(state.charAt(state.length - 1)); }; expect(getNumber(firstPaginationKey) + 1).toEqual( getNumber(SeccondPaginationKey), ); }); it('Should Disable Previous on Render', () => { const { rerender } = render(); let element = screen.getByTestId('pagination_true') ? screen.getByTestId('pagination_true') : ({} as any); const next: HTMLElement = screen.getByTestId('pagination-prev'); const keys: string[] = [...Object.keys(element)]; const firstPaginationKey: string = `${ (element[keys[0]] as any).return.key }`; fireEvent.click(next); rerender(); element = screen.getByTestId('pagination_true'); const Skeys = Object.keys(element); const SeccondPaginationKey: string = element[Skeys[0]].return.key; const getNumber = (state: string): number => { return parseInt(state.charAt(state.length - 1)); }; expect(getNumber(firstPaginationKey)).toEqual( getNumber(SeccondPaginationKey), ); }); it('Should Naviagte to new page on Tag Click', () => { const { rerender } = render(); let element = screen.getByTestId('pagination_true') as any; const findTag: HTMLElement = screen.getAllByTestId('pagination_false')[0]; const currentPagination: string = element[Object.keys(element)[0]].return.key; fireEvent.click(findTag); rerender(); element = screen.getByTestId('pagination_true'); const newPagination: string = element[Object.keys(element)[0]].return.key; expect(newPagination).not.toEqual(currentPagination); }); }); describe('Table - NoPagination', () => { // Arguments const header = DefaultTable?.args?.header ? DefaultTable?.args?.header : []; const data = DefaultTable?.args?.data ? DefaultTable?.args?.data : []; it('renders the component', () => { render(); const element = screen.getByTestId('test-table-parent'); expect(element).not.toBeNull(); }); it('Defines proper sub headings', () => { render(); const element = screen.getAllByRole('table-header'); expect(element.length).toEqual(header?.length); }); it('Computes Correct Number of table items', () => { render(); const element = screen.getAllByRole('table-item'); expect(element.length).toEqual(data?.length * header?.length); }); it('Should Not Render Pagination', () => { render(); const prevElement = screen.queryAllByRole('pagination-prev'); const nextElement = screen.queryAllByRole('pagination-next'); const paginationTag = screen.queryAllByRole('pagination-item'); expect(prevElement).toEqual([]); expect(nextElement).toEqual([]); expect(paginationTag).toEqual([]); }); }); describe('Table - NoData', () => { // Arguments const header = DefaultTable?.args?.header; it('renders the component', () => { render(); const element = screen.getByTestId('test-table-parent'); expect(element).not.toBeNull(); }); it('Defines proper sub headings', () => { render(); const element = screen.getAllByRole('table-header'); expect(element.length).toEqual(header?.length); }); it('Should render no data', () => { render(); const element = screen.queryAllByText('No Data'); expect(element.length).toEqual(1); }); it('Should not have any items', () => { render(); const element = screen.queryAllByRole('table-item'); expect(element.length).toEqual(0); }); it('Should Not Render Pagination', () => { render(); const prevElement = screen.queryAllByRole('pagination-prev'); const nextElement = screen.queryAllByRole('pagination-next'); const paginationTag = screen.queryAllByRole('pagination-item'); expect(prevElement).toEqual([]); expect(nextElement).toEqual([]); expect(paginationTag).toEqual([]); }); }); describe('Table - NoDataCustomComponent', () => { // Arguments const header = DefaultTable?.args?.header; it('renders the component', () => { render(); const element = screen.getByTestId('test-table-parent'); expect(element).not.toBeNull(); }); it('Defines proper sub headings', () => { render(); const element = screen.getAllByRole('table-header'); expect(element.length).toEqual(header?.length); }); it('Should not have any items', () => { render(); const element = screen.queryAllByRole('table-item'); expect(element.length).toEqual(0); }); it('Should Not Render Pagination', () => { render(); const prevElement = screen.queryAllByRole('pagination-prev'); const nextElement = screen.queryAllByRole('pagination-next'); const paginationTag = screen.queryAllByRole('pagination-item'); expect(prevElement).toEqual([]); expect(nextElement).toEqual([]); expect(paginationTag).toEqual([]); }); }); describe('Table - NoDataCustomText', () => { // Arguments const header = DefaultTable?.args?.header; const text = DefaultTable?.args?.customNoDataText ? DefaultTable?.args?.customNoDataText : ''; it('renders the component', () => { render(); const element = screen.getByTestId('test-table-parent'); expect(element).not.toBeNull(); }); it('Defines proper sub headings', () => { render(); const element = screen.getAllByRole('table-header'); expect(element.length).toEqual(header?.length); }); it('Should render no data', () => { render(); const element = screen.queryAllByText(text); expect(element).toBeDefined(); }); it('Should not have any items', () => { render(); const element = screen.queryAllByRole('table-item'); expect(element.length).toEqual(0); }); it('Should Not Render Pagination', () => { render(); const prevElement = screen.queryAllByRole('pagination-prev'); const nextElement = screen.queryAllByRole('pagination-next'); const paginationTag = screen.queryAllByRole('pagination-item'); expect(prevElement).toEqual([]); expect(nextElement).toEqual([]); expect(paginationTag).toEqual([]); }); }); describe('Table - FrozenPage', () => { // Arguments const header = DefaultTable?.args?.header ? DefaultTable?.args?.header : []; const pageSize = DefaultTable?.args?.pageSize ? DefaultTable?.args?.pageSize : 0; const maxPages = DefaultTable?.args?.maxPages ? DefaultTable?.args?.maxPages : 0; it('renders the component', () => { render(); const element = screen.getByTestId('test-table-parent'); expect(element).not.toBeNull(); }); it('Defines proper sub headings', () => { render(); const element = screen.getAllByRole('table-header'); expect(element.length).toEqual(header?.length); }); it('Computes Correct Number of table items', () => { render(); const element = screen.getAllByRole('table-item'); expect(element.length).toEqual(pageSize * header?.length); }); it('Computes Correct Number of Pagination', () => { render(); const element = screen.getAllByRole('pagination-item'); expect(element.length).toBeLessThan(maxPages + 1); }); it('Should call back on page change', () => { const { rerender } = render( , ); const next: HTMLElement = screen.getByTestId('pagination-next'); fireEvent.click(next); rerender(); expect(testOnChangeEvent).toBeCalled(); }); it('Should not change pagination to next on Click', () => { const { rerender } = render(); let element: any = screen.getByTestId('pagination_true'); const next: HTMLElement = screen.getByTestId('pagination-next'); const keys = Object.keys(element); const firstPaginationKey: string = element[keys[0]].return.key; fireEvent.click(next); rerender(); element = screen.getByTestId('pagination_true'); const Skeys = Object.keys(element); const SeccondPaginationKey: string = element[Skeys[0]].return.key; const getNumber = (state: string): number => { return parseInt(state.charAt(state.length - 1)); }; expect(getNumber(firstPaginationKey)).toEqual( getNumber(SeccondPaginationKey), ); }); it('Should not Naviagte to new page on Tag Click', () => { const { rerender } = render(); let element: any = screen.getByTestId('pagination_true'); const findTag: HTMLElement = screen.getAllByTestId('pagination_false')[0]; const currentPagination: string = element[Object.keys(element)[0]].return.key; fireEvent.click(findTag); rerender(); element = screen.getByTestId('pagination_true'); const newPagination: string = element[Object.keys(element)[0]].return.key; expect(newPagination).toEqual(currentPagination); }); }); describe('Table - FrozenPageOutOfRange', () => { //Arguments const header = DefaultTable?.args?.header; it('renders the component', () => { render(); const element = screen.getByTestId('test-table-parent'); expect(element).not.toBeNull(); }); it('Defines proper sub headings', () => { render(); const element = screen.getAllByRole('table-header'); expect(element.length).toEqual(header?.length); }); it('Should render no data', () => { render(); const element = screen.queryAllByText('No Data'); expect(element.length).toEqual(1); }); it('Should not have any items', () => { render(); const element = screen.queryAllByRole('table-item'); expect(element.length).toEqual(0); }); it('Should Still Render Pagination', () => { render(); const prevElement = screen.queryAllByTestId('pagination-prev'); const nextElement = screen.queryAllByTestId('pagination-next'); const paginationTag = screen.queryAllByRole('pagination-item'); expect(prevElement).not.toEqual([]); expect(nextElement).not.toEqual([]); expect(paginationTag).not.toEqual([]); }); }); describe('Table- Table Loader', () => { it('Should Render Loader', () => { render(); const element = screen.getByRole('spinner'); expect(element).toBeDefined(); }); });