import React, { useRef, useState } from 'react'; import { render, fireEvent, act } from '@testing-library/react'; import { useLoader, createApp } from '../src'; const loaderCount = jest.fn(); const sleep = (t: number): Promise => new Promise(resolve => setTimeout(resolve, t)); const App = () => { const countRef = useRef(0); const { data, loading, reloading, error, reload } = useLoader( async () => { loaderCount(); await sleep(800); return Promise.resolve(++countRef.current); }, { params: '1' }, ); return (
{ reload(); }}> reload
{JSON.stringify({ data, loading, reloading, error })}
); }; function App1() { const countRef = useRef(0); const { reloading, data, loading, error, reload } = useLoader( async () => { loaderCount(); return Promise.resolve(++countRef.current); }, { params: '1' }, ); return (
reload()}>reload1
{JSON.stringify({ data, loading, reloading, error })}
); } function App2() { const countRef = useRef(0); const [params, setParams] = useState('2'); const { reloading, data, loading, error, reload } = useLoader( async () => { loaderCount(); return Promise.resolve(++countRef.current); }, { params }, ); return (
setParams('3')}>update params
reload()}>reload2
{JSON.stringify({ data, loading, reloading, error })}
); } function App3() { const { data, loading, reloading, error, reload } = useLoader( async (_, params) => { loaderCount(); return Promise.resolve(params); }, { params: 55555 }, ); return (
reload(666666)}>reload3
{JSON.stringify({ data, loading, reloading, error })}
); } beforeEach(() => loaderCount.mockReset()); describe('test useLoader', () => { test('userLoader return data、loading、error', async () => { const AppWrapper = createApp({ plugins: [] })(App); const result = render(); expect(result.asFragment()).toMatchSnapshot(); await act(() => sleep(1000)); expect(result.asFragment()).toMatchSnapshot(); expect(loaderCount).toBeCalledTimes(1); }); test('reload should works', async () => { const AppWrapper = createApp({ plugins: [] })(App); const result = render(); await act(() => sleep(1000)); fireEvent.click(result.getAllByText(/^reload$/)[0]); await act(() => sleep(1000)); expect(result.asFragment()).toMatchSnapshot(); }); test('same loader will integrate to one', async () => { const AppWrapper = createApp({ plugins: [] })(() => ( <> )); const result = render(); await act(() => sleep(1000)); expect(result.asFragment()).toMatchSnapshot(); fireEvent.click(result.getByText('reload1')); await act(() => sleep(1000)); expect(loaderCount).toBeCalledTimes(2); expect(result.asFragment()).toMatchSnapshot(); }); test('it should exec loader two times when has two diffrent key', async () => { const AppWrapper = createApp({ plugins: [] })(() => ( <> )); const result = render(); await act(() => sleep(1000)); expect(result.asFragment()).toMatchSnapshot(); expect(loaderCount).toBeCalledTimes(2); fireEvent.click(result.getByText('reload1')); await act(() => sleep(1000)); expect(loaderCount).toBeCalledTimes(3); expect(result.asFragment()).toMatchSnapshot(); fireEvent.click(result.getByText('reload2')); await act(() => sleep(1000)); expect(loaderCount).toBeCalledTimes(4); expect(result.asFragment()).toMatchSnapshot(); }); test('should re-execute loader when params updated', async () => { const AppWrapper = createApp({ plugins: [] })(() => ( <> )); const result = render(); await act(() => sleep(1000)); fireEvent.click(result.getByText('update params')); await act(() => sleep(1000)); expect(result.asFragment()).toMatchSnapshot(); }); test('reload can pass params', async () => { const AppWrapper = createApp({ plugins: [] })(() => ); const result = render(); await act(() => sleep(1000)); fireEvent.click(result.getByText('reload3')); await act(() => sleep(1000)); expect(result.asFragment()).toMatchSnapshot(); }); test('reloading should be true when reload', async () => { const AppWrapper = createApp({ plugins: [] })(() => ); const result = render(); expect(result.asFragment()).toMatchSnapshot(); await act(() => sleep(1000)); fireEvent.click(result.getAllByText(/^reload$/)[0]); expect(result.asFragment()).toMatchSnapshot(); }); });