function it_doesnt_error_if_the_response_type_is_fine(ContainerInterface $container, Route $route, ControllerClosureBuilder $thingBeingDecorated, ServerRequestInterface $request, ResponseInterface $initialResponseObject)
 {
     // ARRANGE
     $controllerClosureWithWrongReturnType = function ($requestPassedIn, $responsePassedIn) {
         return new JsonResponse([]);
     };
     $thingBeingDecorated->buildControllerClosure($container, $route)->willReturn($controllerClosureWithWrongReturnType);
     // ACT
     $controllerClosureProduced = $this->buildControllerClosure($container, $route);
     // ASSERT
     $controllerClosureProduced($request, $initialResponseObject)->shouldHaveType('\\Zend\\Diactoros\\Response\\JsonResponse');
 }
 function it_can_build_a_controller_closure(ServerRequestInterface $initialRequest, ResponseInterface $initialResponse, RequestAndResponse $requestAndResponseBeforeUserController, ServerRequestInterface $requestPassedToUserController, ResponseInterface $responsePassedToUserController, ResponseInterface $responseReturnedByUserController, ResponseInterface $finalResponse, MiddlewareManager $middlewareManager, ContainerInterface $container, Route $route, ControllerClosureBuilder $thingBeingDecorated)
 {
     // ARRANGE
     $middlewareManager->applyBeforeMiddlewares(Argument::type('\\Sainsburys\\HttpService\\Components\\Middlewares\\Http\\RequestAndResponse'))->willReturn($requestAndResponseBeforeUserController);
     $requestAndResponseBeforeUserController->request()->willReturn($requestPassedToUserController);
     $requestAndResponseBeforeUserController->response()->willReturn($responsePassedToUserController);
     $controllerClosureBeingDecorated = function ($requestPassedIn, $responsePassedIn) use($responseReturnedByUserController) {
         return new JsonResponse([]);
     };
     $middlewareManager->applyAfterMiddlewares(Argument::any())->willReturn($finalResponse);
     $thingBeingDecorated->buildControllerClosure($container, $route)->willReturn($controllerClosureBeingDecorated);
     // ACT
     $decoratedClosure = $this->buildControllerClosure($container, $route);
     $result = $decoratedClosure($initialRequest, $initialResponse);
     // ASSERT
     $result->shouldBe($finalResponse);
 }
 function it_can_apply_routes_to_the_slim_application(ControllerClosureBuilder $controllerClosureBuilder, SlimAppAdapter $slimAppAdapter, Route $route, ContainerInterface $container, SlimRoute $slimRoute)
 {
     // ARRANGE
     // The controller closure builder builds the thing
     $controllerClosure = function () {
     };
     $controllerClosureBuilder->buildControllerClosure($container, $route)->willReturn($controllerClosure);
     // Route has stuff on it
     $route->controllerServiceId()->willReturn('controller-service-id');
     $route->httpVerb()->willReturn('GET');
     $route->name()->willReturn('route-name');
     $route->pathExpression()->willReturn('/path/');
     // Controller is in container
     $container->has('controller-service-id')->willReturn(true);
     // ACT
     $this->configureApplicationWithRoutes($slimAppAdapter, [$route], $container);
     // ASSERT
     $slimAppAdapter->addRoute($route, $controllerClosure)->shouldHaveBeenCalled();
 }
 private function configureApplicationWithRoute(SlimAppAdapter $slimAppAdapter, Route $route, ContainerInterface $container)
 {
     $this->validateControllerIsInDiConfig($route, $container);
     $controllerClosure = $this->controllerClosureBuilder->buildControllerClosure($container, $route);
     $this->applyRouteToSlimApplication($slimAppAdapter, $route, $controllerClosure);
 }
 public function buildControllerClosure(ContainerInterface $container, Route $route) : \Closure
 {
     $rawControllerClosure = $this->thingBeingDecorated->buildControllerClosure($container, $route);
     $closureWhichAlsoDoesTypeChecking = $this->decorateWithResponseTypeChecking($rawControllerClosure);
     return $closureWhichAlsoDoesTypeChecking;
 }
 public function buildControllerClosure(ContainerInterface $container, Route $route) : \Closure
 {
     $rawControllerClosure = $this->thingBeingDecorated->buildControllerClosure($container, $route);
     $closureWhichAppliesMiddlewares = $this->decorateWithMiddlewares($rawControllerClosure, $this->middlewareManager);
     return $closureWhichAppliesMiddlewares;
 }