5180 fichiers 38.5 Mo 0 téléchargements 143 vues mis à jour il y a 4 heures ui
nitro-v36-with-renderer-v36 / src / state / useSharedHook.test.tsx
useSharedHook.test.tsx 1.9 Ko Télécharger le fichier
import { act, render, screen, waitFor } from '@testing-library/react';
import { useEffect, useState } from 'react';
import { describe, expect, it, vi } from 'vitest';
import { registerSharedHook, SharedHookRegistry, useSharedHook } from './useSharedHook';

describe('useSharedHook', () => {
    it('runs the source hook once and shares its Zustand-backed snapshot', async () => {
        const mounted = vi.fn();

        const useCounterSource = () => {
            const [count, setCount] = useState(0);

            useEffect(() => {
                mounted();
            }, []);

            return { count, setCount };
        };

        const Counter = ({ label }: { label: string }) => {
            const { count, setCount } = useSharedHook(useCounterSource);

            return (
                <button data-testid={label} onClick={() => setCount((value) => value + 1)}>
                    {count}
                </button>
            );
        };

        registerSharedHook(useCounterSource);

        const view = render(
            <SharedHookRegistry fallback={<span>loading</span>}>
                <span>shell</span>
            </SharedHookRegistry>
        );

        await waitFor(() => expect(mounted).toHaveBeenCalledTimes(1));

        view.rerender(
            <SharedHookRegistry fallback={<span>loading</span>}>
                <Counter label="first" />
                <Counter label="second" />
            </SharedHookRegistry>
        );

        expect(screen.queryByText('loading')).not.toBeInTheDocument();
        expect(screen.getByTestId('first')).toHaveTextContent('0');
        expect(screen.getByTestId('second')).toHaveTextContent('0');
        expect(mounted).toHaveBeenCalledTimes(1);

        act(() => screen.getByTestId('first').click());

        expect(screen.getByTestId('first')).toHaveTextContent('1');
        expect(screen.getByTestId('second')).toHaveTextContent('1');
    });
});
15Sujets
1Dépôts
20Membres
7En 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