import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; import { act, renderHook } from "@testing-library/react"; import { useFading } from "../../../hooks/feed/useFading.ts"; afterEach(() => vi.useRealTimers()); describe("useFading", () => { beforeEach(() => vi.useFakeTimers()); test("cooldown for 2s, then dismissing for 350ms, then gone", () => { const { result } = renderHook(useFading); act(() => result.current.startFading("a")); expect(result.current.fading).toEqual({ a: "cooldown" }); act(() => vi.advanceTimersByTime(2000)); expect(result.current.fading).toEqual({ a: "dismissing" }); act(() => vi.advanceTimersByTime(350)); expect(result.current.fading).toEqual({}); }); test("starting twice is one animation", () => { const { result } = renderHook(useFading); act(() => result.current.startFading("a")); act(() => vi.advanceTimersByTime(1000)); act(() => result.current.startFading("a")); act(() => vi.advanceTimersByTime(1000)); expect(result.current.fading).toEqual({ a: "dismissing" }); }); test("cancel during cooldown and during dismissal", () => { const { result } = renderHook(useFading); act(() => result.current.startFading("a")); act(() => result.current.cancelFading("a")); expect(result.current.fading).toEqual({}); act(() => vi.advanceTimersByTime(5000)); expect(result.current.fading).toEqual({}); act(() => result.current.startFading("b")); act(() => vi.advanceTimersByTime(2100)); act(() => result.current.cancelFading("b")); expect(result.current.fading).toEqual({}); // Cancelled means it can start over. act(() => result.current.startFading("b")); expect(result.current.fading).toEqual({ b: "cooldown" }); }); test("cancelAll", () => { const { result } = renderHook(useFading); act(() => { result.current.startFading("a"); result.current.startFading("b"); }); act(() => result.current.cancelAll()); expect(result.current.fading).toEqual({}); }); test("onFaded hears of a fade that ended, not of a cancelled one", () => { const onFaded = vi.fn(); const { result } = renderHook(() => useFading(onFaded)); act(() => { result.current.startFading("a"); result.current.startFading("b"); }); act(() => vi.advanceTimersByTime(2100)); act(() => result.current.cancelFading("b")); act(() => vi.advanceTimersByTime(250)); expect(onFaded.mock.calls).toEqual([["a"]]); }); });