51 lines
1.3 KiB
TypeScript
51 lines
1.3 KiB
TypeScript
import { act, renderHook } from '@testing-library/react'
|
|
import { vi } from 'vitest'
|
|
import { useTimeout } from '../src/utils/useTimeout'
|
|
|
|
describe('useTimeout', () => {
|
|
it('fires the callback after the delay', () => {
|
|
vi.useFakeTimers()
|
|
const { result } = renderHook(() => useTimeout())
|
|
const fn = vi.fn()
|
|
act(() => {
|
|
result.current.schedule(fn, 1000)
|
|
})
|
|
expect(fn).not.toHaveBeenCalled()
|
|
act(() => {
|
|
vi.advanceTimersByTime(1000)
|
|
})
|
|
expect(fn).toHaveBeenCalledTimes(1)
|
|
vi.useRealTimers()
|
|
})
|
|
|
|
it('clear() cancels pending timers', () => {
|
|
vi.useFakeTimers()
|
|
const { result } = renderHook(() => useTimeout())
|
|
const fn = vi.fn()
|
|
act(() => {
|
|
result.current.schedule(fn, 1000)
|
|
result.current.clear()
|
|
})
|
|
act(() => {
|
|
vi.advanceTimersByTime(5000)
|
|
})
|
|
expect(fn).not.toHaveBeenCalled()
|
|
vi.useRealTimers()
|
|
})
|
|
|
|
it('clears pending timers on unmount (no setState-after-unmount leaks)', () => {
|
|
vi.useFakeTimers()
|
|
const { result, unmount } = renderHook(() => useTimeout())
|
|
const fn = vi.fn()
|
|
act(() => {
|
|
result.current.schedule(fn, 1000)
|
|
})
|
|
unmount()
|
|
act(() => {
|
|
vi.advanceTimersByTime(5000)
|
|
})
|
|
expect(fn).not.toHaveBeenCalled()
|
|
vi.useRealTimers()
|
|
})
|
|
})
|