Files
data-collection-terminal/vendor/danharrin/livewire-rate-limiting/tests/RateLimitingTest.php

125 lines
2.9 KiB
PHP

<?php
namespace DanHarrin\LivewireRateLimiting\Tests;
use DanHarrin\LivewireRateLimiting\Exceptions\TooManyRequestsException;
use Livewire\Livewire;
use Livewire\Volt\Volt;
class RateLimitingTest extends TestCase
{
/** @test */
public function can_rate_limit()
{
$component = Livewire::test(Component::class);
$component
->call('limit')
->assertSet('secondsUntilAvailable', 0)
->call('limit')
->assertSet('secondsUntilAvailable', 0)
->call('limit')
->assertSet('secondsUntilAvailable', 0)
->call('limit')
->assertNotSet('secondsUntilAvailable', 0);
sleep(1);
$component
->call('limit')
->assertSet('secondsUntilAvailable', 0);
}
/** @test */
public function can_hit_and_clear_rate_limiter()
{
Livewire::test(Component::class)
->call('hit')
->call('hit')
->call('hit')
->call('limit')
->assertNotSet('secondsUntilAvailable', 0)
->call('clear')
->call('limit')
->assertSet('secondsUntilAvailable', 0);
}
/** @test */
public function can_rate_limit_volt()
{
$this->mountVolt();
$component = Volt::test('volt-component');
$component
->call('limit')
->assertSet('secondsUntilAvailable', 0)
->call('limit')
->assertSet('secondsUntilAvailable', 0)
->call('limit')
->assertSet('secondsUntilAvailable', 0)
->call('limit')
->assertNotSet('secondsUntilAvailable', 0);
sleep(1);
$component
->call('limit')
->assertSet('secondsUntilAvailable', 0);
}
/** @test */
public function can_hit_and_clear_rate_limiter_volt()
{
$this->mountVolt();
Volt::test('volt-component')
->call('hit')
->call('hit')
->call('hit')
->call('limit')
->assertNotSet('secondsUntilAvailable', 0)
->call('clear')
->call('limit')
->assertSet('secondsUntilAvailable', 0);
}
protected function mountVolt()
{
Volt::mount([
__DIR__ . '/views',
]);
}
}
class Component extends \Livewire\Component
{
use \DanHarrin\LivewireRateLimiting\WithRateLimiting;
public $secondsUntilAvailable;
public function clear()
{
$this->clearRateLimiter('limit');
}
public function hit()
{
$this->hitRateLimiter('limit', 1);
}
public function limit()
{
try {
$this->rateLimit(3, 1);
} catch (TooManyRequestsException $exception) {
return $this->secondsUntilAvailable = $exception->secondsUntilAvailable;
}
$this->secondsUntilAvailable = 0;
}
public function render()
{
return view('component');
}
}