Algorithm-RateLimiter-TokenBucket

 view release on metacpan or  search on metacpan

t/basics.t  view on Meta::CPAN

    note 'tick( 0.5 )';    # Tick 0.5 seconds -> should add 500 tokens
    $rl->tick(0.5);
    is $rl->available, 500, 'Added 500 tokens after 0.5s';
    note 'tick( 2.0 )';    # Tick another 1.0 seconds -> should hit max_burst (limit * 2 = 2000)
    $rl->tick(2.0);
    is $rl->available, 2000, 'Capped at max_burst (2000)';
};
subtest 'Dynamic Limit Updates' => sub {
    isa_ok my $rl = Algorithm::RateLimiter::TokenBucket->new( limit => 1000 ), ['Algorithm::RateLimiter::TokenBucket'];
    ok $rl->set_limit(5000), 'set_limit( 5000 )';
    is $rl->limit, 5000, 'limit updated';
    ok $rl->consume(5000), 'consume( 5000 )';    # Simulate an initial burst
    note 'tick( 1.0 )';
    $rl->tick(1.0), is $rl->available, 5000, 'accumulated at new rate';
};
subtest 'Unlimited Mode' => sub {
    isa_ok my $rl = Algorithm::RateLimiter::TokenBucket->new( limit => 0 ), ['Algorithm::RateLimiter::TokenBucket'];
    is $rl->limit,              0,             'Limit is 0 (unlimited)';
    is $rl->consume(1_000_000), 1_000_000,     'Can consume massive amounts';
    is $rl->available,          1_000_000_000, 'Available returns high default';
};



( run in 0.684 second using v1.01-cache-2.11-cpan-e1769b4cff6 )