skolplattformen-backup/libs/hooks/src/fake.test.js

200 lines
4.9 KiB
JavaScript

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 }) => (
<ApiProvider api={api} storage={storage}>
{children}
</ApiProvider>
)
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')
})
})
})