refactor(updated tests)

Co-authored-by: Sebastian Palmqvist <PalmN72@users.noreply.github.com>
This commit is contained in:
Lee 2023-10-16 16:26:58 +02:00
parent 76c9ca80dc
commit f95842e2e4
1 changed files with 245 additions and 0 deletions

View File

@ -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',
);
});
// });
});
});