5180 fichiers 38.5 Mo 0 téléchargements 246 vues mis à jour il y a 5 heures ui
nitro-v36-with-renderer-v36 / src / hooks / catalog / useScrollWindow.test.tsx
useScrollWindow.test.tsx 2.5 Ko Télécharger le fichier
/* @vitest-environment jsdom */
import { act, renderHook } from '@testing-library/react';
import { useRef } from 'react';
import { describe, expect, it, vi } from 'vitest';
import { useScrollWindow } from './useScrollWindow';

const withElement = (enabled = true) => {
    const element = document.createElement('div');
    Object.defineProperty(element, 'clientHeight', { value: 200, configurable: true });
    const hook = renderHook(() => useScrollWindow(useRef(element), enabled));
    return { element, hook };
};

describe('useScrollWindow', () => {
    it('reports the viewport height on mount and follows scroll events on the next frame', () => {
        vi.useFakeTimers({ toFake: ['requestAnimationFrame', 'setTimeout'] });
        const { element, hook } = withElement();
        expect(hook.result.current.viewportHeight).toBe(200);
        element.scrollTop = 150;
        act(() => {
            element.dispatchEvent(new Event('scroll'));
            vi.runAllTimers();
        });
        expect(hook.result.current.scrollTop).toBe(150);
        vi.useRealTimers();
    });

    it('coalesces several scroll events into one update', () => {
        vi.useFakeTimers({ toFake: ['requestAnimationFrame', 'setTimeout'] });
        const element = document.createElement('div');
        Object.defineProperty(element, 'clientHeight', { value: 200, configurable: true });
        let renderCount = 0;
        const hook = renderHook(() => {
            renderCount++;
            return useScrollWindow(useRef(element), true);
        });
        const countAfterMount = renderCount;
        element.scrollTop = 10;
        act(() => {
            for (let i = 0; i < 5; i++) element.dispatchEvent(new Event('scroll'));
            vi.runAllTimers();
        });
        expect(renderCount).toBe(countAfterMount + 1);
        expect(hook.result.current.scrollTop).toBe(10);
        vi.useRealTimers();
    });

    it('does nothing while disabled', () => {
        const { element, hook } = withElement(false);
        element.scrollTop = 99;
        act(() => element.dispatchEvent(new Event('scroll')));
        expect(hook.result.current.scrollTop).toBe(0);
        expect(hook.result.current.viewportHeight).toBe(0);
    });

    it('removes the listener on unmount', () => {
        const { element, hook } = withElement();
        const spy = vi.spyOn(element, 'removeEventListener');
        hook.unmount();
        expect(spy).toHaveBeenCalledWith('scroll', expect.any(Function), expect.anything());
    });
});
15Sujets
1Dépôts
20Membres
2En ligne
Profile
Inscrit
Dernière visite
Messages
0
Votes positifs
0
Votes négatifs
0

Nous utilisons des cookies pour assurer le bon fonctionnement du site et améliorer votre expérience. en savoir plus

Autoriser