From b2782d4f2d1f8010824fd27cb9504baa3e12bf91 Mon Sep 17 00:00:00 2001 From: Danny van Wijk Date: Mon, 11 Dec 2017 12:22:08 +0000 Subject: [PATCH] Return event response for initialize update event --- Controller/ResourceController.php | 10 +- spec/Controller/ResourceControllerSpec.php | 121 +++++++++++++++++++++ 2 files changed, 129 insertions(+), 2 deletions(-) diff --git a/Controller/ResourceController.php b/Controller/ResourceController.php index d2e7d97c5af6..1e5c8214a0fc 100644 --- a/Controller/ResourceController.php +++ b/Controller/ResourceController.php @@ -295,7 +295,10 @@ public function createAction(Request $request): Response return $this->viewHandler->handle($configuration, View::create($form, Response::HTTP_BAD_REQUEST)); } - $this->eventDispatcher->dispatchInitializeEvent(ResourceActions::CREATE, $configuration, $newResource); + $initializeEvent = $this->eventDispatcher->dispatchInitializeEvent(ResourceActions::CREATE, $configuration, $newResource); + if ($initializeEvent->hasResponse()) { + return $initializeEvent->getResponse(); + } $view = View::create() ->setData([ @@ -380,7 +383,10 @@ public function updateAction(Request $request): Response return $this->viewHandler->handle($configuration, View::create($form, Response::HTTP_BAD_REQUEST)); } - $this->eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource); + $initializeEvent = $this->eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource); + if ($initializeEvent->hasResponse()) { + return $initializeEvent->getResponse(); + } $view = View::create() ->setData([ diff --git a/spec/Controller/ResourceControllerSpec.php b/spec/Controller/ResourceControllerSpec.php index 06e19485cb1b..f4257db80442 100644 --- a/spec/Controller/ResourceControllerSpec.php +++ b/spec/Controller/ResourceControllerSpec.php @@ -341,6 +341,8 @@ function it_returns_a_html_response_for_creating_new_resource_form( $resourceFormFactory->create($configuration, $newResource)->willReturn($form); $eventDispatcher->dispatchInitializeEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event); + $event->isStopped()->willReturn(false); + $event->hasResponse()->willReturn(false); $request->isMethod('POST')->willReturn(false); $form->createView()->willReturn($formView); @@ -394,6 +396,8 @@ function it_returns_a_html_response_for_invalid_form_during_resource_creation( $resourceFormFactory->create($configuration, $newResource)->willReturn($form); $eventDispatcher->dispatchInitializeEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event); + $event->isStopped()->willReturn(false); + $event->hasResponse()->willReturn(false); $request->isMethod('POST')->willReturn(true); $form->handleRequest($request)->willReturn($form); @@ -860,6 +864,8 @@ function it_returns_a_html_response_for_updating_resource_form( $resourceFormFactory->create($configuration, $resource)->willReturn($form); $eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event); + $event->isStopped()->willReturn(false); + $event->hasResponse()->willReturn(false); $request->isMethod('PATCH')->willReturn(false); $request->getMethod()->willReturn('GET'); @@ -916,6 +922,8 @@ function it_returns_a_html_response_for_invalid_form_during_resource_update( $resourceFormFactory->create($configuration, $resource)->willReturn($form); $eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event); + $event->isStopped()->willReturn(false); + $event->hasResponse()->willReturn(false); $request->isMethod('PATCH')->willReturn(false); $request->getMethod()->willReturn('PUT'); @@ -1154,6 +1162,119 @@ function it_uses_response_from_post_update_event_if_defined( $this->updateAction($request)->shouldReturn($redirectResponse); } + function it_uses_response_from_initialize_create_event_if_defined( + MetadataInterface $metadata, + RequestConfigurationFactoryInterface $requestConfigurationFactory, + RequestConfiguration $configuration, + AuthorizationCheckerInterface $authorizationChecker, + ViewHandlerInterface $viewHandler, + RedirectHandlerInterface $redirectHandler, + FactoryInterface $factory, + NewResourceFactoryInterface $newResourceFactory, + ResourceInterface $newResource, + ResourceFormFactoryInterface $resourceFormFactory, + EventDispatcherInterface $eventDispatcher, + ResourceControllerEvent $initializeEvent, + Form $form, + FormView $formView, + Request $request, + Response $response + ): void { + $metadata->getApplicationName()->willReturn('sylius'); + $metadata->getName()->willReturn('product'); + + $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration); + $configuration->hasPermission()->willReturn(true); + $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create'); + + $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true); + + $configuration->isHtmlRequest()->willReturn(true); + $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig'); + + $newResourceFactory->create($configuration, $factory)->willReturn($newResource); + $resourceFormFactory->create($configuration, $newResource)->willReturn($form); + + $request->isMethod('POST')->willReturn(false); + $form->createView()->shouldNotBeCalled(); + + $eventDispatcher->dispatchInitializeEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($initializeEvent); + $initializeEvent->hasResponse()->willReturn(true); + $initializeEvent->getResponse()->willReturn($response); + + $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldNotBeCalled(); + $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldNotBeCalled(); + $redirectHandler->redirectToResource($configuration, $newResource)->shouldNotBeCalled(); + + $expectedView = View::create() + ->setData([ + 'configuration' => $configuration, + 'metadata' => $metadata, + 'resource' => $newResource, + 'product' => $newResource, + 'form' => $formView, + ]) + ->setTemplate('SyliusShopBundle:Product:create.html.twig') + ; + $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->shouldNotBeCalled(); + + $this->createAction($request)->shouldReturn($response); + } + + function it_uses_response_from_initialize_update_event_if_defined( + MetadataInterface $metadata, + RequestConfigurationFactoryInterface $requestConfigurationFactory, + RepositoryInterface $repository, + ObjectManager $manager, + SingleResourceProviderInterface $singleResourceProvider, + ResourceFormFactoryInterface $resourceFormFactory, + RedirectHandlerInterface $redirectHandler, + FlashHelperInterface $flashHelper, + AuthorizationCheckerInterface $authorizationChecker, + EventDispatcherInterface $eventDispatcher, + ResourceUpdateHandlerInterface $resourceUpdateHandler, + RequestConfiguration $configuration, + ResourceInterface $resource, + Form $form, + ResourceControllerEvent $initializeEvent, + Request $request, + Response $response + ): void { + $metadata->getApplicationName()->willReturn('sylius'); + $metadata->getName()->willReturn('product'); + + $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration); + $configuration->hasPermission()->willReturn(true); + $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update'); + $configuration->hasStateMachine()->willReturn(false); + + $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true); + + $configuration->isHtmlRequest()->willReturn(true); + $configuration->getTemplate(ResourceActions::UPDATE . '.html')->willReturn('SyliusShopBundle:Product:update.html.twig'); + + $singleResourceProvider->get($configuration, $repository)->willReturn($resource); + $resourceFormFactory->create($configuration, $resource)->willReturn($form); + + $request->getMethod()->willReturn('GET'); + + $form->handleRequest($request)->willReturn($form); + $form->isSubmitted()->willReturn(false); + $form->isValid()->willReturn(false); + + $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldNotBeCalled(); + $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldNotBeCalled(); + $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldNotBeCalled(); + $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldNotBeCalled(); + $redirectHandler->redirectToResource($configuration, $resource)->shouldNotBeCalled(); + + $eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($initializeEvent); + $initializeEvent->hasResponse()->willReturn(true); + $initializeEvent->getResponse()->willReturn($response); + + $this->updateAction($request)->shouldReturn($response); + } + function it_returns_a_non_html_response_for_correctly_updated_resource( MetadataInterface $metadata, ParameterBagInterface $parameterBag,