import * as React from 'react'; import expect from 'expect'; import { fireEvent, render, waitFor, screen } from '@testing-library/react'; import { Basic, SelectAll, Sort } from './useList.stories'; describe('', () => { it('should apply sorting correctly', async () => { const callback = jest.fn(); const data = [ { id: 1, title: 'hello' }, { id: 2, title: 'world' }, ]; const { getByText } = render( ); await waitFor(() => { expect(callback).toHaveBeenCalledWith( expect.objectContaining({ sort: { field: 'title', order: 'DESC' }, isFetching: false, isLoading: false, data: [ { id: 2, title: 'world' }, { id: 1, title: 'hello' }, ], error: null, total: 2, }) ); }); fireEvent.click(getByText('Sort by title ASC')); await waitFor(() => { expect(callback).toHaveBeenCalledWith( expect.objectContaining({ sort: { field: 'title', order: 'ASC' }, isFetching: false, isLoading: false, data: [ { id: 1, title: 'hello' }, { id: 2, title: 'world' }, ], error: null, total: 2, }) ); }); }); it('should apply pagination correctly', async () => { const callback = jest.fn(); render(); await waitFor(() => { expect(callback).toHaveBeenCalledWith( expect.objectContaining({ sort: { field: 'id', order: 'ASC' }, isFetching: false, isLoading: false, data: [ { id: 6, title: 'And Then There Were None' }, { id: 7, title: 'Dream of the Red Chamber' }, { id: 8, title: 'The Hobbit' }, { id: 9, title: 'She: A History of Adventure' }, { id: 10, title: 'The Lion, the Witch and the Wardrobe', }, ], page: 2, perPage: 5, error: null, total: 10, }) ); }); }); it('should be usable with asynchronously fetched data', () => { const callback = jest.fn(); const data = [ { id: 1, title: 'hello' }, { id: 2, title: 'world' }, ]; const { rerender } = render( ); rerender( ); expect(callback).toHaveBeenCalledWith( expect.objectContaining({ sort: { field: 'id', order: 'ASC' }, isFetching: true, isLoading: false, data: [{ id: 2, title: 'world' }], error: null, total: 1, }) ); }); describe('filter', () => { it('should filter string data based on the filter props', () => { const callback = jest.fn(); render( ); expect(callback).toHaveBeenCalledWith( expect.objectContaining({ sort: { field: 'id', order: 'ASC' }, isFetching: false, isLoading: false, data: [{ id: 8, title: 'The Hobbit' }], error: null, total: 1, }) ); }); it('should filter array data based on the filter props', async () => { const callback = jest.fn(); const data = [ { id: 1, items: ['one', 'two'] }, { id: 2, items: ['three'] }, { id: 3, items: 'four' }, { id: 4, items: ['five'] }, ]; render( ); await waitFor(() => { expect(callback).toHaveBeenCalledWith( expect.objectContaining({ sort: { field: 'id', order: 'ASC' }, isFetching: false, isLoading: false, data: [ { id: 1, items: ['one', 'two'] }, { id: 3, items: 'four' }, { id: 4, items: ['five'] }, ], error: null, total: 3, }) ); }); }); it('should filter array data based on the custom filter', async () => { const callback = jest.fn(); const data = [ { id: 1, items: ['one', 'two'] }, { id: 2, items: ['three'] }, { id: 3, items: 'four' }, { id: 4, items: ['five'] }, ]; render( record.id > 2} callback={callback} /> ); await waitFor(() => { expect(callback).toHaveBeenCalledWith( expect.objectContaining({ sort: { field: 'id', order: 'ASC' }, isFetching: false, isLoading: false, data: [ { id: 3, items: 'four' }, { id: 4, items: ['five'] }, ], error: null, total: 2, }) ); }); }); it('should filter data based on a custom filter with nested objects', () => { const callback = jest.fn(); const data = [ { id: 1, title: { name: 'hello' } }, { id: 2, title: { name: 'world' } }, ]; render( children ); expect(callback).toHaveBeenCalledWith( expect.objectContaining({ sort: { field: 'id', order: 'ASC' }, isFetching: false, isLoading: false, data: [{ id: 2, title: { name: 'world' } }], error: null, total: 1, }) ); }); it('should apply the q filter as a full-text filter', () => { const callback = jest.fn(); render(); expect(callback).toHaveBeenCalledWith( expect.objectContaining({ data: [ { id: 2, title: 'The Little Prince' }, { id: 5, title: 'The Lord of the Rings' }, { id: 6, title: 'And Then There Were None' }, { id: 7, title: 'Dream of the Red Chamber' }, { id: 8, title: 'The Hobbit' }, { id: 10, title: 'The Lion, the Witch and the Wardrobe', }, ], }) ); }); }); describe('onSelectAll', () => { it('should select all records', async () => { render(); await waitFor(() => { expect(screen.getByTestId('selected_ids').textContent).toBe( 'Selected ids: []' ); }); fireEvent.click(screen.getByRole('button', { name: 'Select All' })); await waitFor(() => { expect(screen.getByTestId('selected_ids').textContent).toBe( 'Selected ids: [1,2,3,4,5,6,7,8,9,10]' ); }); }); it('should select all records even though some records are already selected', async () => { render(); await waitFor(() => { expect(screen.getByTestId('selected_ids').textContent).toBe( 'Selected ids: []' ); }); fireEvent.click( screen.getByRole('button', { name: 'Select item 1' }) ); await waitFor(() => { expect(screen.getByTestId('selected_ids').textContent).toBe( 'Selected ids: [1]' ); }); fireEvent.click(screen.getByRole('button', { name: 'Select All' })); await waitFor(() => { expect(screen.getByTestId('selected_ids').textContent).toBe( 'Selected ids: [1,2,3,4,5,6,7,8,9,10]' ); }); }); }); });