diff --git a/src/Limit.php b/src/Limit.php index 3d4bfe9..7d82c85 100644 --- a/src/Limit.php +++ b/src/Limit.php @@ -130,8 +130,10 @@ public function exceeded(?int $releaseInSeconds = null): void $this->hits = $this->allow; - if (isset($releaseInSeconds)) { - $interval = DateInterval::createFromDateString($releaseInSeconds . ' seconds'); + $seconds = $releaseInSeconds ?? $this->releaseInSeconds; + + if ($seconds > 0) { + $interval = DateInterval::createFromDateString($seconds . ' seconds'); if ($interval === false) { return; diff --git a/tests/Unit/LimitTest.php b/tests/Unit/LimitTest.php index e77bd59..b1a4c48 100644 --- a/tests/Unit/LimitTest.php +++ b/tests/Unit/LimitTest.php @@ -100,3 +100,31 @@ expect($limit->getReleaseInSeconds())->toEqual($seconds); }); + +test('exceeded without releaseInSeconds falls back to the configured interval', function () { + $limit = Limit::allow(10)->everySeconds(120); + + $limit->exceeded(); + + expect($limit->wasManuallyExceeded())->toBeTrue() + ->and($limit->getHits())->toBe(10) + ->and($limit->getRemainingSeconds())->toBe(120); +}); + +test('exceeded with explicit releaseInSeconds uses the provided value', function () { + $limit = Limit::allow(10)->everySeconds(120); + + $limit->exceeded(releaseInSeconds: 300); + + expect($limit->wasManuallyExceeded())->toBeTrue() + ->and($limit->getRemainingSeconds())->toBe(300); +}); + +test('custom limiter exceeded without releaseInSeconds falls back to default 60 seconds', function () { + $limit = Limit::custom(function () {}); + + $limit->exceeded(); + + expect($limit->wasManuallyExceeded())->toBeTrue() + ->and($limit->getRemainingSeconds())->toBe(60); +});