set('hashing', ['driver' => 'bcrypt']); } 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']); } } }