Files
fusion/packages/dashboard/app/hooks/useFlashOnIncrease.test.ts
Dustin Byrne 133fc59297 feat(HAI-051): add column flash animation on count increase
- Create useFlashOnIncrease hook to detect count increases
- Wire useFlashOnIncrease hook into Column component
- Add CSS flash animation keyframes and styles
- Add unit tests for useFlashOnIncrease hook
- Add Column component flash behavior tests
2026-03-25 23:31:16 -04:00

79 lines
2.0 KiB
TypeScript

import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import { renderHook, act } from "@testing-library/react";
import { useFlashOnIncrease } from "./useFlashOnIncrease";
describe("useFlashOnIncrease", () => {
beforeEach(() => {
vi.useFakeTimers();
});
afterEach(() => {
vi.useRealTimers();
});
it("does not flash on initial render", () => {
const { result } = renderHook(() => useFlashOnIncrease(3));
expect(result.current).toBe(false);
});
it("flashes when count increases", () => {
const { result, rerender } = renderHook(
({ count }) => useFlashOnIncrease(count),
{ initialProps: { count: 3 } },
);
rerender({ count: 5 });
expect(result.current).toBe(true);
});
it("resets flashing after duration", () => {
const { result, rerender } = renderHook(
({ count }) => useFlashOnIncrease(count, 700),
{ initialProps: { count: 3 } },
);
rerender({ count: 5 });
expect(result.current).toBe(true);
act(() => {
vi.advanceTimersByTime(700);
});
expect(result.current).toBe(false);
});
it("does not flash when count decreases", () => {
const { result, rerender } = renderHook(
({ count }) => useFlashOnIncrease(count),
{ initialProps: { count: 5 } },
);
rerender({ count: 2 });
expect(result.current).toBe(false);
});
it("does not flash when count stays the same", () => {
const { result, rerender } = renderHook(
({ count }) => useFlashOnIncrease(count),
{ initialProps: { count: 5 } },
);
rerender({ count: 5 });
expect(result.current).toBe(false);
});
it("cleans up timer on unmount", () => {
const clearTimeoutSpy = vi.spyOn(global, "clearTimeout");
const { rerender, unmount } = renderHook(
({ count }) => useFlashOnIncrease(count),
{ initialProps: { count: 3 } },
);
rerender({ count: 5 });
unmount();
expect(clearTimeoutSpy).toHaveBeenCalled();
clearTimeoutSpy.mockRestore();
});
});