File size: 1,558 Bytes
5710dd0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import { renderHook, waitFor } from '@testing-library/react';
import { describe, expect, it } from 'vitest';
import { useDebouncedValue } from '@/hooks/useDebouncedValue';

describe('useDebouncedValue', () => {
  it('returns the initial value immediately without debounce', () => {
    const { result } = renderHook(() => useDebouncedValue('a', 100));
    expect(result.current).toBe('a');
  });

  it('keeps the old value during the debounce window and updates after it', async () => {
    const { result, rerender } = renderHook(({ value }) => useDebouncedValue(value, 100), { initialProps: { value: 'a' } });
    rerender({ value: 'ab' });
    expect(result.current).toBe('a');

    await waitFor(() => { expect(result.current).toBe('ab'); });
  });

  it('settles only the final value for rapid successive changes', async () => {
    const { result, rerender } = renderHook(({ value }) => useDebouncedValue(value, 100), { initialProps: { value: 'a' } });
    rerender({ value: 'ab' });
    rerender({ value: 'abc' });
    expect(result.current).toBe('a');

    await new Promise((r) => setTimeout(r, 50));
    expect(result.current).toBe('a');

    await waitFor(() => { expect(result.current).toBe('abc'); });
  });

  it('does not update state after unmount', async () => {
    const { result, rerender, unmount } = renderHook(({ value }) => useDebouncedValue(value, 100), { initialProps: { value: 'a' } });
    rerender({ value: 'ab' });
    unmount();
    await new Promise((r) => setTimeout(r, 150));
    expect(result.current).toBe('a');
  });
});