public function testAuthenticationFailsAndThrownExceptionIsHandled() { $request = Request::create('/', 'GET'); $route = new Route('GET', '/', ['protected']); $auth = m::mock('Dingo\\Api\\Auth\\Shield'); $auth->shouldReceive('user')->once()->andReturn(false); $this->container->shouldReceive('make')->once()->with('router')->andReturn($this->router); $this->container->shouldReceive('make')->once()->once('dingo.api.auth')->andReturn($auth); $this->router->shouldReceive('getApiRouteCollectionFromRequest')->once()->with($request)->andReturn($this->collection); $this->collection->shouldReceive('match')->once()->with($request)->andReturn($route); $auth->shouldReceive('authenticate')->once()->with($request, $route)->andThrow($exception = new UnauthorizedHttpException(null, 'test')); $this->router->shouldReceive('handleException')->once()->with($exception)->andReturn(new Response(['message' => 'test'], 401)); $this->router->shouldReceive('parseAcceptHeader')->once()->with($request)->andReturn(['v1', 'json']); Dingo\Api\Http\Response::setFormatters(['json' => new JsonResponseFormat()]); $this->assertEquals('{"message":"test"}', $this->middleware->handle($request)->getContent()); }
public function testForbiddenResponseIsReturnedWhenRateLimitIsExceeded() { $request = Request::create('/', 'GET'); $this->auth->shouldReceive('check')->once()->andReturn(false); $this->container->shouldReceive('make')->once()->with('config')->andReturn(m::mock(['get' => ['unauthenticated' => ['limit' => 1, 'reset' => 1]]])); $this->container->shouldReceive('make')->once()->with('router')->andReturn($this->router); $this->container->shouldReceive('make')->once()->with('cache')->andReturn($this->cache); $this->router->shouldReceive('parseAcceptHeader')->once()->with($request)->andReturn(['v1', 'json']); $this->router->shouldReceive('requestTargettingApi')->once()->with($request)->andReturn(true); $ip = $request->getClientIp(); $this->cache->shouldReceive('add')->once()->with('dingo:api:requests:' . $ip, 0, 1); $this->cache->shouldReceive('add')->once(); $this->cache->shouldReceive('increment')->once()->with('dingo:api:requests:' . $ip); $this->cache->shouldReceive('get')->twice()->with('dingo:api:requests:' . $ip)->andReturn(2); $this->cache->shouldReceive('get')->once()->with('dingo:api:reset:' . $ip); Dingo\Api\Http\Response::setTransformer(m::mock('Dingo\\Api\\Transformer\\Transformer')->shouldReceive('transformableResponse')->andReturn(false)->getMock()); Dingo\Api\Http\Response::setFormatters(['json' => new Dingo\Api\Http\ResponseFormat\JsonResponseFormat()]); $response = $this->middleware->handle($request); $this->assertEquals(1, $response->headers->get('X-RateLimit-Limit')); $this->assertEquals(0, $response->headers->get('X-RateLimit-Remaining')); $this->assertEquals('{"message":"API rate limit has been exceeded."}', $response->getContent()); $this->assertEquals(403, $response->getStatusCode()); }