import { act, renderHook } from '@testing-library/react-hooks' import React from 'react' import { ApiProvider } from '.' import { useCalendar, useClassmates, useEtjanstChildren, useMenu, useNews, useNotifications, useSchedule, useUser, } from './hooks' import store from './store' import createStorage from './__mocks__/AsyncStorage' const { default: init } = jest.requireActual( '@skolplattformen/api-skolplattformen' ) const wait = (ms) => new Promise((res) => setTimeout(res, ms)) describe('hooks with fake data', () => { let api let storage const wrapper = ({ children }) => ( {children} ) beforeEach(async () => { api = init( () => { // noop }, () => { //noop } ) await api.login('121212121212') storage = createStorage({}) }) it('does not use cache', async () => { storage.cache.user = JSON.stringify({ user: 'cached' }) await act(async () => { const { result, waitForNextUpdate } = renderHook(() => useUser(), { wrapper, }) await waitForNextUpdate() await waitForNextUpdate() await waitForNextUpdate() expect(result.current.data).toEqual({ firstName: 'Namn', lastName: 'Namnsson', isAuthenticated: true, personalNumber: '195001182046', }) }) }) it('returns user', async () => { await act(async () => { const { result, waitForNextUpdate } = renderHook(() => useUser(), { wrapper, }) await waitForNextUpdate() await waitForNextUpdate() expect(result.current.data).toEqual({ firstName: 'Namn', lastName: 'Namnsson', isAuthenticated: true, personalNumber: '195001182046', }) }) }) it('returns child list', async () => { await act(async () => { const { result, waitForNextUpdate } = renderHook( () => useEtjanstChildren(), { wrapper } ) await waitForNextUpdate() await waitForNextUpdate() await waitForNextUpdate() expect(result.current.data).toHaveLength(2) }) }) describe('data belonging to one child', () => { let child beforeEach(async () => { ;[child] = await api.getChildren() }) it('returns calendar', async () => { await act(async () => { const { result, waitForNextUpdate } = renderHook( () => useCalendar(child), { wrapper } ) await waitForNextUpdate() await waitForNextUpdate() expect(result.current.data.length).toBeGreaterThan(1) }) }) it('returns classmates', async () => { await act(async () => { const { result, waitForNextUpdate } = renderHook( () => useClassmates(child), { wrapper } ) await waitForNextUpdate() await waitForNextUpdate() expect(result.current.data.length).toBeGreaterThan(1) }) }) it('returns menu', async () => { await act(async () => { const { result, waitForNextUpdate } = renderHook(() => useMenu(child), { wrapper, }) await waitForNextUpdate() await waitForNextUpdate() expect(result.current.data.length).toBeGreaterThan(1) }) }) it('returns news', async () => { await act(async () => { const { result, waitForNextUpdate } = renderHook(() => useNews(child), { wrapper, }) await waitForNextUpdate() await waitForNextUpdate() expect(result.current.data.length).toBeGreaterThan(1) }) }) it('returns notifications', async () => { await act(async () => { const { result, waitForNextUpdate } = renderHook( () => useNotifications(child), { wrapper } ) await waitForNextUpdate() await waitForNextUpdate() expect(result.current.data.length).toBeGreaterThan(1) }) }) it('returns schedule', async () => { const from = '2021-01-01' const to = '2021-01-08' await act(async () => { const { result, waitForNextUpdate } = renderHook( () => useSchedule(child, from, to), { wrapper } ) await waitForNextUpdate() await waitForNextUpdate() // No fake schedule in embedded-api yet expect(result.current.data.length).not.toBeGreaterThan(1) }) }) }) it('handles reloads', async () => { await act(async () => { store.dispatch({ type: 'CLEAR' }) const [child] = await api.getChildren() const { result, waitForNextUpdate } = renderHook( () => useNotifications(child), { wrapper } ) await waitForNextUpdate() expect(result.current.status).toEqual('loaded') result.current.reload() await wait(30) expect(result.current.status).toEqual('loaded') }) }) })