import { act, fireEvent, render } from '@testing-library/react'
import { SWRConfig } from 'swr'
export function sleep(time: number) {
return new Promise(resolve => setTimeout(resolve, time))
}
export const createResponse = (
response: T,
{ delay } = { delay: 10 }
): Promise =>
new Promise((resolve, reject) =>
setTimeout(() => {
if (response instanceof Error) {
reject(response)
} else {
resolve(response)
}
}, delay)
)
export const nextTick = () => act(() => sleep(1))
export const focusOn = (element: any) =>
act(async () => {
fireEvent.focus(element)
})
export const createKey = () => 'swr-key-' + ~~(Math.random() * 1e7)
const _renderWithConfig = (
element: React.ReactElement,
config: Parameters[0]['value']
): ReturnType => {
const TestSWRConfig = ({ children }: { children: React.ReactNode }) => (
{children}
)
return render(element, { wrapper: TestSWRConfig })
}
export const renderWithConfig = (
element: React.ReactElement,
config?: Parameters[1]
): ReturnType => {
const provider = () => new Map()
return _renderWithConfig(element, { provider, ...config })
}
export const renderWithGlobalCache = (
element: React.ReactElement,
config?: Parameters[1]
): ReturnType => {
return _renderWithConfig(element, { ...config })
}
export const hydrateWithConfig = (
element: React.ReactElement,
container: HTMLElement,
config?: Parameters[1]
): ReturnType => {
const provider = () => new Map()
const TestSWRConfig = ({ children }: { children: React.ReactNode }) => (
{children}
)
return render(element, { container, wrapper: TestSWRConfig, hydrate: true })
}
export const mockVisibilityHidden = () => {
const mockVisibilityState = jest.spyOn(document, 'visibilityState', 'get')
mockVisibilityState.mockImplementation(() => 'hidden')
return () => mockVisibilityState.mockRestore()
}
// Using `act()` will cause React 18 to batch updates.
// https://github.com/reactwg/react-18/discussions/102
export async function executeWithoutBatching(fn: () => any) {
const prev = global.IS_REACT_ACT_ENVIRONMENT
global.IS_REACT_ACT_ENVIRONMENT = false
await fn()
global.IS_REACT_ACT_ENVIRONMENT = prev
}
export const mockConsoleForHydrationErrors = () => {
jest.spyOn(console, 'error').mockImplementation(() => {})
return () => {
// It should not have any hydration warnings.
expect(
// @ts-expect-error
console.error.mock.calls.find(([err]) => {
return (
err?.message?.includes(
'Text content does not match server-rendered HTML.'
) ||
err?.message?.includes(
'Hydration failed because the initial UI does not match what was rendered on the server.'
)
)
})
).toBeFalsy()
// @ts-expect-error
console.error.mockRestore()
}
}