attributes->set('_route', 'app_home'); $kernel = $this->createMock(HttpKernelInterface::class); $event = new RequestEvent($kernel, $request, HttpKernelInterface::MAIN_REQUEST); $subscriber->onKernelRequest($event); self::assertNull($event->getResponse()); } public function testIgnoresSubRequests(): void { $subscriber = new RateLimiterSubscriber([]); $request = new Request(); $request->attributes->set('_route', 'app_order_create'); $kernel = $this->createMock(HttpKernelInterface::class); $event = new RequestEvent($kernel, $request, HttpKernelInterface::SUB_REQUEST); $subscriber->onKernelRequest($event); self::assertNull($event->getResponse()); } public function testIgnoresMappedRouteWithMissingLimiter(): void { $subscriber = new RateLimiterSubscriber([]); $request = new Request(); $request->attributes->set('_route', 'app_order_create'); $kernel = $this->createMock(HttpKernelInterface::class); $event = new RequestEvent($kernel, $request, HttpKernelInterface::MAIN_REQUEST); $subscriber->onKernelRequest($event); self::assertNull($event->getResponse()); } public function testIgnoresTestEnvironment(): void { $subscriber = new RateLimiterSubscriber([], 'test'); $request = new Request(); $request->attributes->set('_route', 'app_order_create'); $kernel = $this->createMock(HttpKernelInterface::class); $event = new RequestEvent($kernel, $request, HttpKernelInterface::MAIN_REQUEST); $subscriber->onKernelRequest($event); self::assertNull($event->getResponse()); } public function testAllowsRequestWhenLimiterAccepts(): void { $rateLimit = $this->createMock(RateLimit::class); $rateLimit->method('isAccepted')->willReturn(true); $limiter = $this->createMock(LimiterInterface::class); $limiter->method('consume')->willReturn($rateLimit); $factory = $this->createMock(RateLimiterFactoryInterface::class); $factory->method('create')->willReturn($limiter); $subscriber = new RateLimiterSubscriber(['order_create' => $factory], 'prod'); $request = new Request(); $request->attributes->set('_route', 'app_order_create'); $kernel = $this->createMock(HttpKernelInterface::class); $event = new RequestEvent($kernel, $request, HttpKernelInterface::MAIN_REQUEST); $subscriber->onKernelRequest($event); self::assertNull($event->getResponse()); } public function testReturns429WhenLimiterRejects(): void { $rateLimit = $this->createMock(RateLimit::class); $rateLimit->method('isAccepted')->willReturn(false); $limiter = $this->createMock(LimiterInterface::class); $limiter->method('consume')->willReturn($rateLimit); $factory = $this->createMock(RateLimiterFactoryInterface::class); $factory->method('create')->willReturn($limiter); $subscriber = new RateLimiterSubscriber(['order_create' => $factory], 'prod'); $request = new Request(); $request->attributes->set('_route', 'app_order_create'); $kernel = $this->createMock(HttpKernelInterface::class); $event = new RequestEvent($kernel, $request, HttpKernelInterface::MAIN_REQUEST); $subscriber->onKernelRequest($event); $response = $event->getResponse(); self::assertNotNull($response); self::assertSame(429, $response->getStatusCode()); self::assertSame('Trop de requetes. Reessayez plus tard.', $response->getContent()); } }