import { describe, it, expect, vi } from 'vitest'; import { ThrottleBlocker } from './ThrottleBlocker'; describe('ThrottleBlocker', () => { let blocker: ThrottleBlocker; beforeEach(() => { vi.useFakeTimers(); blocker = new ThrottleBlocker(100); // 100ms delay }); afterEach(() => { vi.restoreAllMocks(); }); it('should allow execution initially', () => { expect(blocker.canExecute()).toBe(true); }); it('should block execution immediately after block() is called', () => { blocker.block(); expect(blocker.canExecute()).toBe(false); }); it('should allow execution again after the delay has passed', () => { blocker.block(); expect(blocker.canExecute()).toBe(false); // Advance time by 100ms vi.advanceTimersByTime(100); expect(blocker.canExecute()).toBe(true); }); it('should handle multiple block calls', () => { blocker.block(); expect(blocker.canExecute()).toBe(false); vi.advanceTimersByTime(50); expect(blocker.canExecute()).toBe(false); // Still blocked vi.advanceTimersByTime(50); expect(blocker.canExecute()).toBe(true); blocker.block(); // Block again expect(blocker.canExecute()).toBe(false); vi.advanceTimersByTime(100); expect(blocker.canExecute()).toBe(true); }); it('should work with different delay values', () => { const fastBlocker = new ThrottleBlocker(50); fastBlocker.block(); expect(fastBlocker.canExecute()).toBe(false); vi.advanceTimersByTime(50); expect(fastBlocker.canExecute()).toBe(true); }); });