import { describe, expect, it } from 'vitest'; import { act, render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { ToastProvider, useToast } from '@/hooks/useToast'; import { ToastViewport } from '@/components/Toast'; function Pusher() { const { push } = useToast(); return (
); } describe('Toast', () => { it('renders pushed toasts and lets the user dismiss them manually', async () => { const user = userEvent.setup(); render( , ); await user.click(screen.getByRole('button', { name: /push session/i })); const toast = await screen.findByTestId('toast'); expect(toast).toHaveTextContent('Session expirée'); expect(toast).toHaveAttribute('data-kind', 'error'); await user.click(screen.getByRole('button', { name: /dismiss/i })); await waitFor(() => { expect(screen.queryByTestId('toast')).toBeNull(); }); }); it('auto-dismisses after the timeout', async () => { // Override the 4s default by polling the DOM up to 6s. Real timers keep // user-event happy; the toast hook clears itself via setTimeout. const user = userEvent.setup(); render( , ); await user.click(screen.getByRole('button', { name: /push session/i })); expect(await screen.findByTestId('toast')).toBeInTheDocument(); await waitFor( () => { expect(screen.queryByTestId('toast')).toBeNull(); }, { timeout: 6000 }, ); // Quiet act() warning by flushing any pending state. await act(async () => { await Promise.resolve(); }); }, 10_000); });