// @vitest-environment jsdom import { afterEach, describe, expect, it, vi } from 'vitest' import { cleanup, fireEvent, render } from '@testing-library/react' import { Toast } from '../src/Toast.tsx' afterEach(cleanup) describe('Toast', () => { it('announces its text and reports done after the hold-and-fade lifetime', () => { vi.useFakeTimers() try { const onDone = vi.fn() const view = render(} onDone={onDone} />) const banner = view.getByRole('alert') expect(banner.textContent).toContain('最多添加 50 张图片') expect(view.getByTestId('icon')).toBeTruthy() vi.advanceTimersByTime(3999) expect(onDone).not.toHaveBeenCalled() vi.advanceTimersByTime(1) expect(onDone).toHaveBeenCalledTimes(1) } finally { vi.useRealTimers() } }) it('centers over its anchor and re-measures on window resize', () => { vi.useFakeTimers() try { const anchor = document.createElement('div') document.body.appendChild(anchor) anchor.getBoundingClientRect = () => ({ left: 100, width: 400 }) as DOMRect const view = render() expect(view.getByRole('alert').style.left).toBe('300px') anchor.getBoundingClientRect = () => ({ left: 200, width: 400 }) as DOMRect fireEvent(window, new Event('resize')) expect(view.getByRole('alert').style.left).toBe('400px') anchor.remove() } finally { vi.useRealTimers() } }) it('renders without an icon and cancels its timer on unmount', () => { vi.useFakeTimers() try { const onDone = vi.fn() const view = render() expect(view.getByRole('alert').querySelector('[aria-hidden]')).toBeNull() view.unmount() vi.advanceTimersByTime(10_000) expect(onDone).not.toHaveBeenCalled() } finally { vi.useRealTimers() } }) })