Files
web-core/tests/hooks/useCooldownTimer.test.tsx
Beatrice Dellacà d7e144620e
All checks were successful
continuous-integration/drone/push Build is passing
add unit tests
2026-02-24 11:14:24 +01:00

65 lines
1.7 KiB
TypeScript

import { act } from 'react';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { useCooldownTimer } from '../../src/hooks/useCooldownTimer';
import { renderHook } from '../helpers/renderHook';
describe('useCooldownTimer', () => {
beforeEach(() => {
vi.useFakeTimers();
});
afterEach(() => {
vi.useRealTimers();
});
it('decrements cooldown every second while enabled', () => {
const { result } = renderHook(() => useCooldownTimer(2, true));
expect(result.current.cooldown).toBe(2);
act(() => {
vi.advanceTimersByTime(1000);
});
expect(result.current.cooldown).toBe(1);
act(() => {
vi.advanceTimersByTime(1000);
});
expect(result.current.cooldown).toBe(0);
});
it('does not decrement when disabled', () => {
const { result } = renderHook(() => useCooldownTimer(2, false));
act(() => {
vi.advanceTimersByTime(3000);
});
expect(result.current.cooldown).toBe(2);
});
it('startCooldown floors values and clamps negatives', () => {
const { result } = renderHook(() => useCooldownTimer(0, true));
act(() => {
result.current.startCooldown(2.8);
});
expect(result.current.cooldown).toBe(2);
act(() => {
result.current.startCooldown(-4);
});
expect(result.current.cooldown).toBe(0);
});
it('stays at zero when already expired', () => {
const { result } = renderHook(() => useCooldownTimer(0, true));
act(() => {
vi.advanceTimersByTime(2000);
});
expect(result.current.cooldown).toBe(0);
});
});