/**
  * {@inheritdoc}
  */
 public function call(Identity $identity, Request $request, callable $next)
 {
     if (!$this->router->supports($request)) {
         return $next($identity, $request);
     }
     $callable = $this->router->get($request);
     return $this->normalizeResponse($callable($identity, $request));
 }
 /**
  * {@inheritdoc}
  */
 public function get(Request $request)
 {
     $callable = $this->inner->get($request);
     foreach ($this->decorators as $decorator) {
         $callable = $decorator($callable);
     }
     return $callable;
 }
 /**
  * @param mixed $response
  *
  * @dataProvider provideDenormalizedResponses
  */
 public function testCallResponseNormalization($response)
 {
     $this->router->expects(self::once())->method('supports')->with(new Request('foo'))->willReturn(true);
     $this->router->expects(self::once())->method('get')->with(new Request('foo'))->willReturn($this->getCallableMock(self::once(), function () use($response) {
         return $response;
     }));
     $promise = $this->middleware->call(new Identity('foo', []), new Request('foo'), $this->getCallableMock(self::never()));
     self::assertInstanceOf(Promise::class, $promise);
     $response = $promise->resolve();
     self::assertInstanceOf(Response::class, $response);
     self::assertEquals('abc', $response->getValue());
 }
 public function testGetWithDecoration()
 {
     $request = new Request('foo');
     $inner = $this->getCallableMock(self::once(), function (Identity $identity, Request $request) {
         return sprintf('<inner request="%s" identity="%s">', $request->getMethod(), $identity->getName());
     });
     $this->innerRouter->expects(self::once())->method('get')->with($request)->willReturn($inner);
     $this->router->decorate($this->getCallableMock(self::once(), function ($callable) {
         return function (Identity $identity, Request $request) use($callable) {
             return '<outer>' . $callable($identity, $request) . '</outer>';
         };
     }));
     $callable = $this->router->get($request);
     $result = $callable(new Identity('baz'), $request);
     self::assertEquals('<outer><inner request="foo" identity="baz"></outer>', $result);
 }
 /**
  * {@inheritdoc}
  */
 public function get(Request $request)
 {
     return $this->router->get($request);
 }