refactor(updated tests)
Co-authored-by: Sebastian Palmqvist <PalmN72@users.noreply.github.com>
This commit is contained in:
parent
76c9ca80dc
commit
f95842e2e4
|
@ -0,0 +1,245 @@
|
|||
import React from 'react';
|
||||
import {renderHook, act, waitFor} from '@testing-library/react';
|
||||
import {ApiProvider} from './provider';
|
||||
import {useEtjanstChildren} from './hooks';
|
||||
import store from './store';
|
||||
import init from './__mocks__/@skolplattformen/embedded-api';
|
||||
import createStorage from './__mocks__/AsyncStorage';
|
||||
import reporter from './__mocks__/reporter';
|
||||
|
||||
const pause = (ms = 0) => new Promise(r => setTimeout(r, ms));
|
||||
|
||||
describe('useEtjanstChildren()', () => {
|
||||
let api;
|
||||
let storage;
|
||||
let response;
|
||||
const wrapper = ({children}) => (
|
||||
<ApiProvider api={api} storage={storage} reporter={reporter}>
|
||||
{children}
|
||||
</ApiProvider>
|
||||
);
|
||||
beforeEach(() => {
|
||||
response = [{id: 1}];
|
||||
api = init();
|
||||
api.getPersonalNumber.mockReturnValue('123');
|
||||
api.getChildren.mockImplementation(
|
||||
() =>
|
||||
new Promise(res => {
|
||||
setTimeout(() => res(response), 50);
|
||||
}),
|
||||
);
|
||||
storage = createStorage(
|
||||
{
|
||||
'123_etjanst_children': [{id: 2}],
|
||||
},
|
||||
2,
|
||||
);
|
||||
});
|
||||
afterEach(async () => {
|
||||
await act(async () => {
|
||||
await pause(70);
|
||||
store.dispatch({entity: 'ALL', type: 'CLEAR'});
|
||||
});
|
||||
});
|
||||
it('returns correct initial value', () => {
|
||||
const {result} = renderHook(() => useEtjanstChildren(), {wrapper});
|
||||
|
||||
expect(result.current.status).toEqual('pending');
|
||||
});
|
||||
|
||||
it('calls api', async () => {
|
||||
//await act(async () => {
|
||||
api.isLoggedIn = true;
|
||||
renderHook(() => useEtjanstChildren(), {
|
||||
wrapper,
|
||||
});
|
||||
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
await waitFor(() => expect(api.getChildren).toHaveBeenCalled());
|
||||
|
||||
// });
|
||||
});
|
||||
it('only calls api once', async () => {
|
||||
//await act(async () => {
|
||||
api.isLoggedIn = true;
|
||||
renderHook(() => useEtjanstChildren(), {wrapper});
|
||||
renderHook(() => useEtjanstChildren(), {
|
||||
wrapper,
|
||||
});
|
||||
|
||||
//await waitForNextUpdate();
|
||||
renderHook(() => useEtjanstChildren(), {wrapper});
|
||||
//await waitForNextUpdate();
|
||||
renderHook(() => useEtjanstChildren(), {wrapper});
|
||||
//await waitForNextUpdate();
|
||||
|
||||
const {result} = renderHook(() => useEtjanstChildren(), {wrapper});
|
||||
await waitFor(() => {
|
||||
expect(api.getChildren).toHaveBeenCalledTimes(1);
|
||||
expect(result.current.status).toEqual('loaded');
|
||||
});
|
||||
|
||||
// });
|
||||
});
|
||||
|
||||
it('calls cache', async () => {
|
||||
//await act(async () => {
|
||||
api.isLoggedIn = true;
|
||||
const {result} = renderHook(() => useEtjanstChildren(), {wrapper});
|
||||
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
await waitFor(() => expect(result.current.data).toEqual([{id: 2}]));
|
||||
|
||||
// });
|
||||
});
|
||||
it('updates status to loading', async () => {
|
||||
//await act(async () => {
|
||||
api.isLoggedIn = true;
|
||||
const {result} = renderHook(() => useEtjanstChildren(), {wrapper});
|
||||
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
await waitFor(() => expect(result.current.status).toEqual('loading'));
|
||||
|
||||
// });
|
||||
});
|
||||
|
||||
it('updates status to loaded', async () => {
|
||||
//await act(async () => {
|
||||
api.isLoggedIn = true;
|
||||
const {result} = renderHook(() => useEtjanstChildren(), {wrapper});
|
||||
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
|
||||
await waitFor(() => {
|
||||
expect(result.current.status).toEqual('loaded');
|
||||
});
|
||||
// });
|
||||
});
|
||||
|
||||
it('stores in cache if not fake', async () => {
|
||||
//await act(async () => {
|
||||
api.isLoggedIn = true;
|
||||
api.isFake = false;
|
||||
|
||||
renderHook(() => useEtjanstChildren(), {
|
||||
wrapper,
|
||||
});
|
||||
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
// await pause(20);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(storage.cache['123_etjanst_children']).toEqual('[{"id":1}]');
|
||||
});
|
||||
// });
|
||||
});
|
||||
|
||||
it('does not store in cache if fake', async () => {
|
||||
//await act(async () => {
|
||||
api.isLoggedIn = true;
|
||||
api.isFake = true;
|
||||
|
||||
// renderHook(() => useEtjanstChildren(), {
|
||||
// wrapper,
|
||||
// });
|
||||
|
||||
renderHook(() => useEtjanstChildren(), {
|
||||
wrapper,
|
||||
});
|
||||
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
// await pause(20);
|
||||
await waitFor(() => {
|
||||
expect(storage.cache['123_etjanst_children']).toEqual('[{"id":2}]');
|
||||
});
|
||||
// });
|
||||
});
|
||||
|
||||
it('retries if api fails', async () => {
|
||||
//await act(async () => {
|
||||
api.isLoggedIn = true;
|
||||
const error = new Error('fail');
|
||||
api.getChildren.mockRejectedValueOnce(error);
|
||||
|
||||
const {result} = renderHook(() => useEtjanstChildren(), {wrapper});
|
||||
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
await waitFor(() => {
|
||||
expect(result.current.error).toEqual(error);
|
||||
expect(result.current.status).toEqual('loading');
|
||||
expect(result.current.data).toEqual([{id: 2}]);
|
||||
});
|
||||
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
await waitFor(() => {
|
||||
expect(result.current.status).toEqual('loaded');
|
||||
expect(result.current.data).toEqual([{id: 1}]);
|
||||
});
|
||||
// });
|
||||
});
|
||||
|
||||
it('gives up after 3 retries', async () => {
|
||||
//await act(async () => {
|
||||
api.isLoggedIn = true;
|
||||
const error = new Error('fail');
|
||||
api.getChildren.mockRejectedValueOnce(error);
|
||||
api.getChildren.mockRejectedValueOnce(error);
|
||||
api.getChildren.mockRejectedValueOnce(error);
|
||||
|
||||
const {result} = renderHook(() => useEtjanstChildren(), {wrapper});
|
||||
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
await waitFor(() => {
|
||||
expect(result.current.error).toEqual(error);
|
||||
expect(result.current.status).toEqual('loading');
|
||||
expect(result.current.data).toEqual([{id: 2}]);
|
||||
});
|
||||
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
//await waitForNextUpdate();
|
||||
await waitFor(() => {
|
||||
expect(result.current.error).toEqual(error);
|
||||
expect(result.current.status).toEqual('error');
|
||||
expect(result.current.data).toEqual([{id: 2}]);
|
||||
});
|
||||
// });
|
||||
});
|
||||
|
||||
it('reports if api fails', async () => {
|
||||
//await act(async () => {
|
||||
api.isLoggedIn = true;
|
||||
const error = new Error('fail');
|
||||
api.getChildren.mockRejectedValueOnce(error);
|
||||
|
||||
const {result} = renderHook(() => useEtjanstChildren(), {wrapper});
|
||||
|
||||
// //await waitForNextUpdate();
|
||||
// //await waitForNextUpdate();
|
||||
// //await waitForNextUpdate();
|
||||
|
||||
await waitFor(() => {
|
||||
expect(result.current.error).toEqual(error);
|
||||
|
||||
expect(reporter.error).toHaveBeenCalledWith(
|
||||
error,
|
||||
'Error getting ETJANST_CHILDREN from API',
|
||||
);
|
||||
});
|
||||
// });
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue