1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
<?php
namespace Illuminate\Tests\Integration\Http;
use Illuminate\Cache\RateLimiter;
use Illuminate\Cache\RateLimiting\GlobalLimit;
use Illuminate\Container\Container;
use Illuminate\Http\Exceptions\ThrottleRequestsException;
use Illuminate\Routing\Middleware\ThrottleRequests;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Route;
use Orchestra\Testbench\Attributes\WithConfig;
use Orchestra\Testbench\TestCase;
use Throwable;
#[WithConfig('hashing.driver', 'bcrypt')]
class ThrottleRequestsTest extends TestCase
{
public function testLockOpensImmediatelyAfterDecay()
{
Carbon::setTestNow(Carbon::create(2018, 1, 1, 0, 0, 0));
Route::get('/', function () {
return 'yes';
})->middleware(ThrottleRequests::class.':2,1');
$response = $this->withoutExceptionHandling()->get('/');
$this->assertSame('yes', $response->getContent());
$this->assertEquals(2, $response->headers->get('X-RateLimit-Limit'));
$this->assertEquals(1, $response->headers->get('X-RateLimit-Remaining'));
$response = $this->withoutExceptionHandling()->get('/');
$this->assertSame('yes', $response->getContent());
$this->assertEquals(2, $response->headers->get('X-RateLimit-Limit'));
$this->assertEquals(0, $response->headers->get('X-RateLimit-Remaining'));
Carbon::setTestNow(Carbon::create(2018, 1, 1, 0, 0, 58));
try {
$this->withoutExceptionHandling()->get('/');
} catch (Throwable $e) {
$this->assertInstanceOf(ThrottleRequestsException::class, $e);
$this->assertEquals(429, $e->getStatusCode());
$this->assertEquals(2, $e->getHeaders()['X-RateLimit-Limit']);
$this->assertEquals(0, $e->getHeaders()['X-RateLimit-Remaining']);
$this->assertEquals(2, $e->getHeaders()['Retry-After']);
$this->assertEquals(Carbon::now()->addSeconds(2)->getTimestamp(), $e->getHeaders()['X-RateLimit-Reset']);
}
}
public function testLimitingUsingNamedLimiter()
{
$rateLimiter = Container::getInstance()->make(RateLimiter::class);
$rateLimiter->for('test', function ($request) {
return new GlobalLimit(2, 1);
});
Carbon::setTestNow(Carbon::create(2018, 1, 1, 0, 0, 0));
Route::get('/', function () {
return 'yes';
})->middleware(ThrottleRequests::class.':test');
$response = $this->withoutExceptionHandling()->get('/');
$this->assertSame('yes', $response->getContent());
$this->assertEquals(2, $response->headers->get('X-RateLimit-Limit'));
$this->assertEquals(1, $response->headers->get('X-RateLimit-Remaining'));
$response = $this->withoutExceptionHandling()->get('/');
$this->assertSame('yes', $response->getContent());
$this->assertEquals(2, $response->headers->get('X-RateLimit-Limit'));
$this->assertEquals(0, $response->headers->get('X-RateLimit-Remaining'));
Carbon::setTestNow(Carbon::create(2018, 1, 1, 0, 0, 58));
try {
$this->withoutExceptionHandling()->get('/');
} catch (Throwable $e) {
$this->assertInstanceOf(ThrottleRequestsException::class, $e);
$this->assertEquals(429, $e->getStatusCode());
$this->assertEquals(2, $e->getHeaders()['X-RateLimit-Limit']);
$this->assertEquals(0, $e->getHeaders()['X-RateLimit-Remaining']);
$this->assertEquals(2, $e->getHeaders()['Retry-After']);
$this->assertEquals(Carbon::now()->addSeconds(2)->getTimestamp(), $e->getHeaders()['X-RateLimit-Reset']);
}
}
public function testItCanGenerateDefinitionViaStaticMethod()
{
$signature = (string) ThrottleRequests::using('gold-tier');
$this->assertSame('Illuminate\Routing\Middleware\ThrottleRequests:gold-tier', $signature);
$signature = (string) ThrottleRequests::with(25);
$this->assertSame('Illuminate\Routing\Middleware\ThrottleRequests:25', $signature);
$signature = (string) ThrottleRequests::with(25, 2);
$this->assertSame('Illuminate\Routing\Middleware\ThrottleRequests:25,2', $signature);
$signature = (string) ThrottleRequests::with(25, 2, 'foo');
$this->assertSame('Illuminate\Routing\Middleware\ThrottleRequests:25,2,foo', $signature);
$signature = (string) ThrottleRequests::with(maxAttempts: 25, decayMinutes: 2, prefix: 'foo');
$this->assertSame('Illuminate\Routing\Middleware\ThrottleRequests:25,2,foo', $signature);
$signature = (string) ThrottleRequests::with(prefix: 'foo');
$this->assertSame('Illuminate\Routing\Middleware\ThrottleRequests:60,1,foo', $signature);
}
}
|