Completed
Push — 1.0-composer-lock ( 289cb2 )
by Kamil
33:52
created

ResourceControllerSpec::getViewComparingCallback()   C

Complexity

Conditions 8
Paths 1

Size

Total Lines 23
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 23
rs 6.1403
c 0
b 0
f 0
nc 1
cc 8
eloc 15
nop 1
1
<?php
2
3
/*
4
 * This file is part of the Sylius package.
5
 *
6
 * (c) Paweł Jędrzejewski
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
declare(strict_types=1);
13
14
namespace spec\Sylius\Bundle\ResourceBundle\Controller;
15
16
use Doctrine\Common\Persistence\ObjectManager;
17
use FOS\RestBundle\View\View;
18
use PhpSpec\ObjectBehavior;
19
use PhpSpec\Wrapper\Collaborator;
20
use Prophecy\Argument;
21
use Sylius\Bundle\ResourceBundle\Controller\AuthorizationCheckerInterface;
22
use Sylius\Bundle\ResourceBundle\Controller\EventDispatcherInterface;
23
use Sylius\Bundle\ResourceBundle\Controller\FlashHelperInterface;
24
use Sylius\Bundle\ResourceBundle\Controller\NewResourceFactoryInterface;
25
use Sylius\Bundle\ResourceBundle\Controller\RedirectHandlerInterface;
26
use Sylius\Bundle\ResourceBundle\Controller\RequestConfiguration;
27
use Sylius\Bundle\ResourceBundle\Controller\RequestConfigurationFactoryInterface;
28
use Sylius\Bundle\ResourceBundle\Controller\ResourceDeleteHandlerInterface;
29
use Sylius\Bundle\ResourceBundle\Controller\ResourceFormFactoryInterface;
30
use Sylius\Bundle\ResourceBundle\Controller\ResourcesCollectionProviderInterface;
31
use Sylius\Bundle\ResourceBundle\Controller\ResourceUpdateHandlerInterface;
32
use Sylius\Bundle\ResourceBundle\Controller\SingleResourceProviderInterface;
33
use Sylius\Bundle\ResourceBundle\Controller\StateMachineInterface;
34
use Sylius\Bundle\ResourceBundle\Controller\ViewHandlerInterface;
35
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
36
use Sylius\Component\Resource\Exception\DeleteHandlingException;
37
use Sylius\Component\Resource\Factory\FactoryInterface;
38
use Sylius\Component\Resource\Metadata\MetadataInterface;
39
use Sylius\Component\Resource\Model\ResourceInterface;
40
use Sylius\Component\Resource\Repository\RepositoryInterface;
41
use Sylius\Component\Resource\ResourceActions;
42
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
43
use Symfony\Component\DependencyInjection\ContainerInterface;
44
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
45
use Symfony\Component\Form\Form;
46
use Symfony\Component\Form\FormView;
47
use Symfony\Component\HttpFoundation\ParameterBag;
48
use Symfony\Component\HttpFoundation\Request;
49
use Symfony\Component\HttpFoundation\Response;
50
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
51
use Symfony\Component\HttpKernel\Exception\HttpException;
52
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
53
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
54
use Symfony\Component\Security\Csrf\CsrfToken;
55
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
56
57
/**
58
 * @author Paweł Jędrzejewski <[email protected]>
59
 */
60
final class ResourceControllerSpec extends ObjectBehavior
61
{
62
    function let(
63
        MetadataInterface $metadata,
64
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
65
        ViewHandlerInterface $viewHandler,
66
        RepositoryInterface $repository,
67
        FactoryInterface $factory,
68
        NewResourceFactoryInterface $newResourceFactory,
69
        ObjectManager $manager,
70
        SingleResourceProviderInterface $singleResourceProvider,
71
        ResourcesCollectionProviderInterface $resourcesCollectionProvider,
72
        ResourceFormFactoryInterface $resourceFormFactory,
73
        RedirectHandlerInterface $redirectHandler,
74
        FlashHelperInterface $flashHelper,
75
        AuthorizationCheckerInterface $authorizationChecker,
76
        EventDispatcherInterface $eventDispatcher,
77
        StateMachineInterface $stateMachine,
78
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
79
        ResourceDeleteHandlerInterface $resourceDeleteHandler,
80
        ContainerInterface $container
81
    ): void {
82
        $this->beConstructedWith(
83
            $metadata,
84
            $requestConfigurationFactory,
85
            $viewHandler,
86
            $repository,
87
            $factory,
88
            $newResourceFactory,
89
            $manager,
90
            $singleResourceProvider,
91
            $resourcesCollectionProvider,
92
            $resourceFormFactory,
93
            $redirectHandler,
94
            $flashHelper,
95
            $authorizationChecker,
96
            $eventDispatcher,
97
            $stateMachine,
98
            $resourceUpdateHandler,
99
            $resourceDeleteHandler
100
        );
101
102
        $this->setContainer($container);
103
    }
104
105
    function it_extends_base_Symfony_controller(): void
0 ignored issues
show
Coding Style introduced by
function it_extends_base_Symfony_controller() does not seem to conform to the naming convention (^(?:(?:[a-z]|__)[a-zA-Z0-9]*|[a-z][a-z0-9_]*)$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
106
    {
107
        $this->shouldHaveType(Controller::class);
108
    }
109
110
    function it_throws_a_403_exception_if_user_is_unauthorized_to_view_a_single_resource(
111
        MetadataInterface $metadata,
112
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
113
        RequestConfiguration $configuration,
114
        Request $request,
115
        AuthorizationCheckerInterface $authorizationChecker
116
    ): void {
117
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
118
        $configuration->hasPermission()->willReturn(true);
119
        $configuration->getPermission(ResourceActions::SHOW)->willReturn('sylius.product.show');
120
121
        $authorizationChecker->isGranted($configuration, 'sylius.product.show')->willReturn(false);
122
123
        $this
124
            ->shouldThrow(new AccessDeniedException())
125
            ->during('showAction', [$request])
126
        ;
127
    }
128
129
    function it_throws_a_404_exception_if_resource_is_not_found_based_on_configuration(
130
        MetadataInterface $metadata,
131
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
132
        RequestConfiguration $configuration,
133
        Request $request,
134
        AuthorizationCheckerInterface $authorizationChecker,
135
        RepositoryInterface $repository,
136
        SingleResourceProviderInterface $singleResourceProvider
137
    ): void {
138
        $metadata->getHumanizedName()->willReturn('product');
139
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
140
        $configuration->hasPermission()->willReturn(true);
141
        $configuration->getPermission(ResourceActions::SHOW)->willReturn('sylius.product.show');
142
143
        $authorizationChecker->isGranted($configuration, 'sylius.product.show')->willReturn(true);
144
        $singleResourceProvider->get($configuration, $repository)->willReturn(null);
145
146
        $this
147
            ->shouldThrow(new NotFoundHttpException('The "product" has not been found'))
148
            ->during('showAction', [$request])
149
        ;
150
    }
151
152
    function it_returns_a_response_for_html_view_of_a_single_resource(
153
        MetadataInterface $metadata,
154
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
155
        RequestConfiguration $configuration,
156
        AuthorizationCheckerInterface $authorizationChecker,
157
        RepositoryInterface $repository,
158
        SingleResourceProviderInterface $singleResourceProvider,
159
        ResourceInterface $resource,
160
        ViewHandlerInterface $viewHandler,
161
        EventDispatcherInterface $eventDispatcher,
162
        Request $request,
163
        Response $response
164
    ): void {
165
        $metadata->getApplicationName()->willReturn('sylius');
166
        $metadata->getName()->willReturn('product');
167
168
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
169
        $configuration->hasPermission()->willReturn(true);
170
        $configuration->getPermission(ResourceActions::SHOW)->willReturn('sylius.product.show');
171
172
        $authorizationChecker->isGranted($configuration, 'sylius.product.show')->willReturn(true);
173
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
174
175
        $configuration->isHtmlRequest()->willReturn(true);
176
        $configuration->getTemplate(ResourceActions::SHOW . '.html')->willReturn('SyliusShopBundle:Product:show.html.twig');
177
178
        $eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $resource)->shouldBeCalled();
179
180
        $expectedView = View::create()
181
            ->setData([
182
                'configuration' => $configuration,
183
                'metadata' => $metadata,
184
                'resource' => $resource,
185
                'product' => $resource,
186
            ])
187
            ->setTemplateVar('product')
188
            ->setTemplate('SyliusShopBundle:Product:show.html.twig')
189
        ;
190
191
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
192
193
        $this->showAction($request)->shouldReturn($response);
194
    }
195
196
    function it_returns_a_response_for_non_html_view_of_single_resource(
197
        MetadataInterface $metadata,
198
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
199
        RequestConfiguration $configuration,
200
        AuthorizationCheckerInterface $authorizationChecker,
201
        RepositoryInterface $repository,
202
        SingleResourceProviderInterface $singleResourceProvider,
203
        ResourceInterface $resource,
204
        ViewHandlerInterface $viewHandler,
205
        EventDispatcherInterface $eventDispatcher,
206
        Request $request,
207
        Response $response
208
    ): void {
209
        $metadata->getApplicationName()->willReturn('sylius');
210
        $metadata->getName()->willReturn('product');
211
212
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
213
        $configuration->hasPermission()->willReturn(true);
214
        $configuration->getPermission(ResourceActions::SHOW)->willReturn('sylius.product.show');
215
216
        $authorizationChecker->isGranted($configuration, 'sylius.product.show')->willReturn(true);
217
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
218
219
        $configuration->isHtmlRequest()->willReturn(false);
220
221
        $eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $resource)->shouldBeCalled();
222
223
        $expectedView = View::create($resource);
224
225
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
226
227
        $this->showAction($request)->shouldReturn($response);
228
    }
229
230
    function it_throws_a_403_exception_if_user_is_unauthorized_to_view_an_index_of_resources(
231
        MetadataInterface $metadata,
232
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
233
        RequestConfiguration $configuration,
234
        Request $request,
235
        AuthorizationCheckerInterface $authorizationChecker
236
    ): void {
237
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
238
        $configuration->hasPermission()->willReturn(true);
239
        $configuration->getPermission(ResourceActions::INDEX)->willReturn('sylius.product.index');
240
241
        $authorizationChecker->isGranted($configuration, 'sylius.product.index')->willReturn(false);
242
243
        $this
244
            ->shouldThrow(new AccessDeniedException())
245
            ->during('indexAction', [$request])
246
        ;
247
    }
248
249
    function it_returns_a_response_for_html_view_of_paginated_resources(
250
        MetadataInterface $metadata,
251
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
252
        RequestConfiguration $configuration,
253
        AuthorizationCheckerInterface $authorizationChecker,
254
        RepositoryInterface $repository,
255
        ResourcesCollectionProviderInterface $resourcesCollectionProvider,
256
        EventDispatcherInterface $eventDispatcher,
257
        ResourceInterface $resource1,
258
        ResourceInterface $resource2,
259
        ViewHandlerInterface $viewHandler,
260
        Request $request,
261
        Response $response
262
    ): void {
263
        $metadata->getApplicationName()->willReturn('sylius');
264
        $metadata->getName()->willReturn('product');
265
        $metadata->getPluralName()->willReturn('products');
266
267
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
268
        $configuration->hasPermission()->willReturn(true);
269
        $configuration->getPermission(ResourceActions::INDEX)->willReturn('sylius.product.index');
270
271
        $authorizationChecker->isGranted($configuration, 'sylius.product.index')->willReturn(true);
272
273
        $configuration->isHtmlRequest()->willReturn(true);
274
        $configuration->getTemplate(ResourceActions::INDEX . '.html')->willReturn('SyliusShopBundle:Product:index.html.twig');
275
        $resourcesCollectionProvider->get($configuration, $repository)->willReturn([$resource1, $resource2]);
276
277
        $eventDispatcher->dispatchMultiple(ResourceActions::INDEX, $configuration, [$resource1, $resource2])->shouldBeCalled();
278
279
        $expectedView = View::create()
280
            ->setData([
281
                'configuration' => $configuration,
282
                'metadata' => $metadata,
283
                'resources' => [$resource1, $resource2],
284
                'products' => [$resource1, $resource2],
285
            ])
286
            ->setTemplateVar('products')
287
            ->setTemplate('SyliusShopBundle:Product:index.html.twig')
288
        ;
289
290
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
291
292
        $this->indexAction($request)->shouldReturn($response);
293
    }
294
295
    function it_throws_a_403_exception_if_user_is_unauthorized_to_create_a_new_resource(
296
        MetadataInterface $metadata,
297
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
298
        RequestConfiguration $configuration,
299
        Request $request,
300
        AuthorizationCheckerInterface $authorizationChecker
301
    ): void {
302
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
303
        $configuration->hasPermission()->willReturn(true);
304
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
305
306
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(false);
307
308
        $this
309
            ->shouldThrow(new AccessDeniedException())
310
            ->during('createAction', [$request])
311
        ;
312
    }
313
314
    function it_returns_a_html_response_for_creating_new_resource_form(
315
        MetadataInterface $metadata,
316
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
317
        RequestConfiguration $configuration,
318
        AuthorizationCheckerInterface $authorizationChecker,
319
        ViewHandlerInterface $viewHandler,
320
        FactoryInterface $factory,
321
        NewResourceFactoryInterface $newResourceFactory,
322
        ResourceInterface $newResource,
323
        ResourceFormFactoryInterface $resourceFormFactory,
324
        EventDispatcherInterface $eventDispatcher,
325
        ResourceControllerEvent $event,
326
        Form $form,
327
        FormView $formView,
328
        Request $request,
329
        Response $response
330
    ): void {
331
        $metadata->getApplicationName()->willReturn('sylius');
332
        $metadata->getName()->willReturn('product');
333
334
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
335
        $configuration->hasPermission()->willReturn(true);
336
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
337
338
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
339
340
        $configuration->isHtmlRequest()->willReturn(true);
341
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
342
343
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
344
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
345
346
        $eventDispatcher->dispatchInitializeEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
347
348
        $request->isMethod('POST')->willReturn(false);
349
        $form->createView()->willReturn($formView);
350
351
        $expectedView = View::create()
352
            ->setData([
353
                'configuration' => $configuration,
354
                'metadata' => $metadata,
355
                'resource' => $newResource,
356
                'product' => $newResource,
357
                'form' => $formView,
358
            ])
359
            ->setTemplate('SyliusShopBundle:Product:create.html.twig')
360
        ;
361
362
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
363
364
        $this->createAction($request)->shouldReturn($response);
365
    }
366
367
    function it_returns_a_html_response_for_invalid_form_during_resource_creation(
368
        MetadataInterface $metadata,
369
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
370
        RequestConfiguration $configuration,
371
        AuthorizationCheckerInterface $authorizationChecker,
372
        ViewHandlerInterface $viewHandler,
373
        FactoryInterface $factory,
374
        NewResourceFactoryInterface $newResourceFactory,
375
        ResourceInterface $newResource,
376
        ResourceFormFactoryInterface $resourceFormFactory,
377
        EventDispatcherInterface $eventDispatcher,
378
        ResourceControllerEvent $event,
379
        Form $form,
380
        FormView $formView,
381
        Request $request,
382
        Response $response
383
    ): void {
384
        $metadata->getApplicationName()->willReturn('sylius');
385
        $metadata->getName()->willReturn('product');
386
387
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
388
        $configuration->hasPermission()->willReturn(true);
389
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
390
391
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
392
393
        $configuration->isHtmlRequest()->willReturn(true);
394
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
395
396
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
397
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
398
399
        $eventDispatcher->dispatchInitializeEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
400
401
        $request->isMethod('POST')->willReturn(true);
402
        $form->handleRequest($request)->willReturn($form);
403
        $form->isValid()->willReturn(false);
404
        $form->createView()->willReturn($formView);
405
406
        $expectedView = View::create()
407
            ->setData([
408
                'configuration' => $configuration,
409
                'metadata' => $metadata,
410
                'resource' => $newResource,
411
                'product' => $newResource,
412
                'form' => $formView,
413
            ])
414
            ->setTemplate('SyliusShopBundle:Product:create.html.twig')
415
        ;
416
417
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
418
419
        $this->createAction($request)->shouldReturn($response);
420
    }
421
422
    function it_returns_a_non_html_response_for_invalid_form_during_resource_creation(
423
        MetadataInterface $metadata,
424
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
425
        RequestConfiguration $configuration,
426
        AuthorizationCheckerInterface $authorizationChecker,
427
        ViewHandlerInterface $viewHandler,
428
        FactoryInterface $factory,
429
        NewResourceFactoryInterface $newResourceFactory,
430
        ResourceInterface $newResource,
431
        ResourceFormFactoryInterface $resourceFormFactory,
432
        Form $form,
433
        Request $request,
434
        Response $response
435
    ): void {
436
        $metadata->getApplicationName()->willReturn('sylius');
437
        $metadata->getName()->willReturn('product');
438
439
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
440
        $configuration->hasPermission()->willReturn(true);
441
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
442
443
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
444
445
        $configuration->isHtmlRequest()->willReturn(false);
446
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
447
448
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
449
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
450
451
        $request->isMethod('POST')->willReturn(true);
452
        $form->handleRequest($request)->willReturn($form);
453
        $form->isValid()->willReturn(false);
454
455
        $expectedView = View::create($form, 400);
456
457
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
458
459
        $this->createAction($request)->shouldReturn($response);
460
    }
461
462
    function it_does_not_create_the_resource_and_redirects_to_index_for_html_requests_stopped_via_events(
463
        MetadataInterface $metadata,
464
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
465
        RequestConfiguration $configuration,
466
        AuthorizationCheckerInterface $authorizationChecker,
467
        ViewHandlerInterface $viewHandler,
0 ignored issues
show
Unused Code introduced by
The parameter $viewHandler is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
468
        FactoryInterface $factory,
469
        NewResourceFactoryInterface $newResourceFactory,
470
        RepositoryInterface $repository,
471
        ResourceInterface $newResource,
472
        ResourceFormFactoryInterface $resourceFormFactory,
473
        Form $form,
474
        RedirectHandlerInterface $redirectHandler,
475
        FlashHelperInterface $flashHelper,
476
        EventDispatcherInterface $eventDispatcher,
477
        ResourceControllerEvent $event,
478
        Request $request,
479
        Response $redirectResponse
480
    ): void {
481
        $metadata->getApplicationName()->willReturn('sylius');
482
        $metadata->getName()->willReturn('product');
483
484
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
485
        $configuration->hasPermission()->willReturn(true);
486
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
487
488
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
489
490
        $configuration->isHtmlRequest()->willReturn(true);
491
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
492
493
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
494
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
495
496
        $request->isMethod('POST')->willReturn(true);
497
        $form->handleRequest($request)->willReturn($form);
498
        $form->isValid()->willReturn(true);
499
        $form->getData()->willReturn($newResource);
500
501
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
502
        $event->isStopped()->willReturn(true);
503
504
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
505
506
        $event->hasResponse()->willReturn(false);
507
508
        $repository->add($newResource)->shouldNotBeCalled();
509
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldNotBeCalled();
510
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
511
512
        $redirectHandler->redirectToIndex($configuration, $newResource)->willReturn($redirectResponse);
513
514
        $this->createAction($request)->shouldReturn($redirectResponse);
515
    }
516
517
    function it_does_not_create_the_resource_and_return_response_for_html_requests_stopped_via_events(
518
        MetadataInterface $metadata,
519
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
520
        RequestConfiguration $configuration,
521
        AuthorizationCheckerInterface $authorizationChecker,
522
        FactoryInterface $factory,
523
        NewResourceFactoryInterface $newResourceFactory,
524
        RepositoryInterface $repository,
525
        ResourceInterface $newResource,
526
        ResourceFormFactoryInterface $resourceFormFactory,
527
        Form $form,
528
        FlashHelperInterface $flashHelper,
529
        EventDispatcherInterface $eventDispatcher,
530
        ResourceControllerEvent $event,
531
        Request $request,
532
        Response $response
533
    ): void {
534
        $metadata->getApplicationName()->willReturn('sylius');
535
        $metadata->getName()->willReturn('product');
536
537
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
538
        $configuration->hasPermission()->willReturn(true);
539
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
540
541
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
542
543
        $configuration->isHtmlRequest()->willReturn(true);
544
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
545
546
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
547
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
548
549
        $request->isMethod('POST')->willReturn(true);
550
        $form->handleRequest($request)->willReturn($form);
551
        $form->isValid()->willReturn(true);
552
        $form->getData()->willReturn($newResource);
553
554
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
555
        $event->isStopped()->willReturn(true);
556
557
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
558
559
        $event->hasResponse()->willReturn(true);
560
        $event->getResponse()->willReturn($response);
561
562
        $repository->add($newResource)->shouldNotBeCalled();
563
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldNotBeCalled();
564
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
565
566
        $this->createAction($request)->shouldReturn($response);
567
    }
568
569
    function it_redirects_to_newly_created_resource(
570
        MetadataInterface $metadata,
571
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
572
        RequestConfiguration $configuration,
573
        AuthorizationCheckerInterface $authorizationChecker,
574
        ViewHandlerInterface $viewHandler,
0 ignored issues
show
Unused Code introduced by
The parameter $viewHandler is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
575
        FactoryInterface $factory,
576
        NewResourceFactoryInterface $newResourceFactory,
577
        RepositoryInterface $repository,
578
        ResourceInterface $newResource,
579
        ResourceFormFactoryInterface $resourceFormFactory,
580
        StateMachineInterface $stateMachine,
581
        Form $form,
582
        RedirectHandlerInterface $redirectHandler,
583
        FlashHelperInterface $flashHelper,
584
        EventDispatcherInterface $eventDispatcher,
585
        ResourceControllerEvent $event,
586
        ResourceControllerEvent $postEvent,
587
        Request $request,
588
        Response $redirectResponse
589
    ): void {
590
        $metadata->getApplicationName()->willReturn('sylius');
591
        $metadata->getName()->willReturn('product');
592
593
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
594
        $configuration->hasPermission()->willReturn(true);
595
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
596
        $configuration->hasStateMachine()->willReturn(true);
597
598
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
599
600
        $configuration->isHtmlRequest()->willReturn(true);
601
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
602
603
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
604
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
605
606
        $request->isMethod('POST')->willReturn(true);
607
        $form->handleRequest($request)->willReturn($form);
608
        $form->isValid()->willReturn(true);
609
        $form->getData()->willReturn($newResource);
610
611
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
612
        $event->isStopped()->willReturn(false);
613
614
        $stateMachine->apply($configuration, $newResource)->shouldBeCalled();
615
616
        $repository->add($newResource)->shouldBeCalled();
617
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($postEvent);
618
619
        $postEvent->hasResponse()->willReturn(false);
620
621
        $flashHelper->addSuccessFlash($configuration, ResourceActions::CREATE, $newResource)->shouldBeCalled();
622
        $redirectHandler->redirectToResource($configuration, $newResource)->willReturn($redirectResponse);
623
624
        $this->createAction($request)->shouldReturn($redirectResponse);
625
    }
626
627
    function it_uses_response_from_post_create_event_if_defined(
628
        MetadataInterface $metadata,
629
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
630
        RequestConfiguration $configuration,
631
        AuthorizationCheckerInterface $authorizationChecker,
632
        FactoryInterface $factory,
633
        NewResourceFactoryInterface $newResourceFactory,
634
        RepositoryInterface $repository,
635
        ResourceInterface $newResource,
636
        ResourceFormFactoryInterface $resourceFormFactory,
637
        StateMachineInterface $stateMachine,
638
        Form $form,
639
        FlashHelperInterface $flashHelper,
640
        EventDispatcherInterface $eventDispatcher,
641
        ResourceControllerEvent $event,
642
        ResourceControllerEvent $postEvent,
643
        Request $request,
644
        Response $redirectResponse
645
    ): void {
646
        $metadata->getApplicationName()->willReturn('sylius');
647
        $metadata->getName()->willReturn('product');
648
649
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
650
        $configuration->hasPermission()->willReturn(true);
651
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
652
        $configuration->hasStateMachine()->willReturn(true);
653
654
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
655
656
        $configuration->isHtmlRequest()->willReturn(true);
657
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
658
659
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
660
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
661
662
        $request->isMethod('POST')->willReturn(true);
663
        $form->handleRequest($request)->willReturn($form);
664
        $form->isValid()->willReturn(true);
665
        $form->getData()->willReturn($newResource);
666
667
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
668
        $event->isStopped()->willReturn(false);
669
670
        $stateMachine->apply($configuration, $newResource)->shouldBeCalled();
671
672
        $repository->add($newResource)->shouldBeCalled();
673
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($postEvent);
674
        $flashHelper->addSuccessFlash($configuration, ResourceActions::CREATE, $newResource)->shouldBeCalled();
675
676
        $postEvent->hasResponse()->willReturn(true);
677
        $postEvent->getResponse()->willReturn($redirectResponse);
678
679
        $this->createAction($request)->shouldReturn($redirectResponse);
680
    }
681
682
    function it_returns_a_non_html_response_for_correctly_created_resources(
683
        MetadataInterface $metadata,
684
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
685
        RequestConfiguration $configuration,
686
        AuthorizationCheckerInterface $authorizationChecker,
687
        ViewHandlerInterface $viewHandler,
688
        FactoryInterface $factory,
689
        NewResourceFactoryInterface $newResourceFactory,
690
        RepositoryInterface $repository,
691
        ResourceInterface $newResource,
692
        ResourceFormFactoryInterface $resourceFormFactory,
693
        FlashHelperInterface $flashHelper,
694
        EventDispatcherInterface $eventDispatcher,
695
        ResourceControllerEvent $event,
696
        StateMachineInterface $stateMachine,
697
        Form $form,
698
        Request $request,
699
        Response $response
700
    ): void {
701
        $metadata->getApplicationName()->willReturn('sylius');
702
        $metadata->getName()->willReturn('product');
703
704
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
705
        $configuration->hasPermission()->willReturn(true);
706
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
707
        $configuration->hasStateMachine()->willReturn(true);
708
709
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
710
711
        $configuration->isHtmlRequest()->willReturn(false);
712
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
713
714
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
715
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
716
717
        $request->isMethod('POST')->willReturn(true);
718
        $form->handleRequest($request)->willReturn($form);
719
        $form->isValid()->willReturn(true);
720
        $form->getData()->willReturn($newResource);
721
722
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
723
        $event->isStopped()->willReturn(false);
724
725
        $stateMachine->apply($configuration, $newResource)->shouldBeCalled();
726
727
        $repository->add($newResource)->shouldBeCalled();
728
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldBeCalled();
729
730
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
731
732
        $expectedView = View::create($newResource, 201);
733
734
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
735
736
        $this->createAction($request)->shouldReturn($response);
737
    }
738
739
    function it_does_not_create_the_resource_and_throws_http_exception_for_non_html_requests_stopped_via_event(
740
        MetadataInterface $metadata,
741
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
742
        RequestConfiguration $configuration,
743
        AuthorizationCheckerInterface $authorizationChecker,
744
        FactoryInterface $factory,
745
        NewResourceFactoryInterface $newResourceFactory,
746
        RepositoryInterface $repository,
747
        ResourceInterface $newResource,
748
        ResourceFormFactoryInterface $resourceFormFactory,
749
        FlashHelperInterface $flashHelper,
750
        EventDispatcherInterface $eventDispatcher,
751
        Form $form,
752
        Request $request,
753
        ResourceControllerEvent $event
754
    ): void {
755
        $metadata->getApplicationName()->willReturn('sylius');
756
        $metadata->getName()->willReturn('product');
757
758
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
759
        $configuration->hasPermission()->willReturn(true);
760
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
761
762
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
763
764
        $configuration->isHtmlRequest()->willReturn(false);
765
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
766
767
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
768
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
769
770
        $request->isMethod('POST')->willReturn(true);
771
        $form->handleRequest($request)->willReturn($form);
772
        $form->isValid()->willReturn(true);
773
        $form->getData()->willReturn($newResource);
774
775
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
776
        $event->isStopped()->willReturn(true);
777
        $event->getMessage()->willReturn('You cannot add a new product right now.');
778
        $event->getErrorCode()->willReturn(500);
779
780
        $repository->add($newResource)->shouldNotBeCalled();
781
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldNotBeCalled();
782
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
783
784
        $this
785
            ->shouldThrow(new HttpException(500, 'You cannot add a new product right now.'))
786
            ->during('createAction', [$request])
787
        ;
788
    }
789
790
    function it_throws_a_403_exception_if_user_is_unauthorized_to_edit_a_single_resource(
791
        MetadataInterface $metadata,
792
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
793
        RequestConfiguration $configuration,
794
        Request $request,
795
        AuthorizationCheckerInterface $authorizationChecker
796
    ): void {
797
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
798
        $configuration->hasPermission()->willReturn(true);
799
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
800
801
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(false);
802
803
        $this
804
            ->shouldThrow(new AccessDeniedException())
805
            ->during('updateAction', [$request])
806
        ;
807
    }
808
809
    function it_throws_a_404_exception_if_resource_to_update_is_not_found_based_on_configuration(
810
        MetadataInterface $metadata,
811
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
812
        RequestConfiguration $configuration,
813
        Request $request,
814
        AuthorizationCheckerInterface $authorizationChecker,
815
        RepositoryInterface $repository,
816
        SingleResourceProviderInterface $singleResourceProvider
817
    ): void {
818
        $metadata->getHumanizedName()->willReturn('product');
819
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
820
        $configuration->hasPermission()->willReturn(true);
821
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
822
823
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
824
        $singleResourceProvider->get($configuration, $repository)->willReturn(null);
825
826
        $this
827
            ->shouldThrow(new NotFoundHttpException('The "product" has not been found'))
828
            ->during('updateAction', [$request])
829
        ;
830
    }
831
832
    function it_returns_a_html_response_for_updating_resource_form(
833
        MetadataInterface $metadata,
834
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
835
        RequestConfiguration $configuration,
836
        AuthorizationCheckerInterface $authorizationChecker,
837
        ViewHandlerInterface $viewHandler,
838
        RepositoryInterface $repository,
839
        SingleResourceProviderInterface $singleResourceProvider,
840
        ResourceInterface $resource,
841
        ResourceFormFactoryInterface $resourceFormFactory,
842
        EventDispatcherInterface $eventDispatcher,
843
        ResourceControllerEvent $event,
844
        Form $form,
845
        FormView $formView,
846
        Request $request,
847
        Response $response
848
    ): void {
849
        $metadata->getApplicationName()->willReturn('sylius');
850
        $metadata->getName()->willReturn('product');
851
852
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
853
        $configuration->hasPermission()->willReturn(true);
854
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
855
        $configuration->hasStateMachine()->willReturn(false);
856
857
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
858
859
        $configuration->isHtmlRequest()->willReturn(true);
860
        $configuration->getTemplate(ResourceActions::UPDATE . '.html')->willReturn('SyliusShopBundle:Product:update.html.twig');
861
862
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
863
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
864
865
        $eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
866
867
        $request->isMethod('PATCH')->willReturn(false);
868
        $request->getMethod()->willReturn('GET');
869
870
        $form->handleRequest($request)->willReturn($form);
871
        $form->createView()->willReturn($formView);
872
873
        $expectedView = View::create()
874
            ->setData([
875
                'configuration' => $configuration,
876
                'metadata' => $metadata,
877
                'resource' => $resource,
878
                'product' => $resource,
879
                'form' => $formView,
880
            ])
881
            ->setTemplate('SyliusShopBundle:Product:update.html.twig')
882
        ;
883
884
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
885
886
        $this->updateAction($request)->shouldReturn($response);
887
    }
888
889
    function it_returns_a_html_response_for_invalid_form_during_resource_update(
890
        MetadataInterface $metadata,
891
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
892
        RequestConfiguration $configuration,
893
        AuthorizationCheckerInterface $authorizationChecker,
894
        ViewHandlerInterface $viewHandler,
895
        RepositoryInterface $repository,
896
        SingleResourceProviderInterface $singleResourceProvider,
897
        ResourceInterface $resource,
898
        ResourceFormFactoryInterface $resourceFormFactory,
899
        EventDispatcherInterface $eventDispatcher,
900
        ResourceControllerEvent $event,
901
        Form $form,
902
        FormView $formView,
903
        Request $request,
904
        Response $response
905
    ): void {
906
        $metadata->getApplicationName()->willReturn('sylius');
907
        $metadata->getName()->willReturn('product');
908
909
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
910
        $configuration->hasPermission()->willReturn(true);
911
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
912
913
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
914
915
        $configuration->isHtmlRequest()->willReturn(true);
916
        $configuration->getTemplate(ResourceActions::UPDATE . '.html')->willReturn('SyliusShopBundle:Product:update.html.twig');
917
918
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
919
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
920
921
        $eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
922
923
        $request->isMethod('PATCH')->willReturn(false);
924
        $request->getMethod()->willReturn('PUT');
925
926
        $form->handleRequest($request)->willReturn($form);
927
928
        $form->isValid()->willReturn(false);
929
        $form->createView()->willReturn($formView);
930
931
        $expectedView = View::create()
932
            ->setData([
933
                'configuration' => $configuration,
934
                'metadata' => $metadata,
935
                'resource' => $resource,
936
                'product' => $resource,
937
                'form' => $formView,
938
            ])
939
            ->setTemplate('SyliusShopBundle:Product:update.html.twig')
940
        ;
941
942
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
943
944
        $this->updateAction($request)->shouldReturn($response);
945
    }
946
947
    function it_returns_a_non_html_response_for_invalid_form_during_resource_update(
948
        MetadataInterface $metadata,
949
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
950
        RequestConfiguration $configuration,
951
        AuthorizationCheckerInterface $authorizationChecker,
952
        ViewHandlerInterface $viewHandler,
953
        RepositoryInterface $repository,
954
        SingleResourceProviderInterface $singleResourceProvider,
955
        ResourceInterface $resource,
956
        ResourceFormFactoryInterface $resourceFormFactory,
957
        Form $form,
958
        Request $request,
959
        Response $response
960
    ): void {
961
        $metadata->getApplicationName()->willReturn('sylius');
962
        $metadata->getName()->willReturn('product');
963
964
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
965
        $configuration->hasPermission()->willReturn(true);
966
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
967
        $configuration->isHtmlRequest()->willReturn(false);
968
969
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
970
971
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
972
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
973
974
        $request->isMethod('PATCH')->willReturn(true);
975
        $request->getMethod()->willReturn('PATCH');
976
977
        $form->handleRequest($request)->willReturn($form);
978
        $form->isValid()->willReturn(false);
979
980
        $expectedView = View::create($form, 400);
981
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
982
983
        $this->updateAction($request)->shouldReturn($response);
984
    }
985
986
    function it_does_not_update_the_resource_and_redirects_to_resource_for_html_request_if_stopped_via_event(
987
        MetadataInterface $metadata,
988
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
989
        RequestConfiguration $configuration,
990
        AuthorizationCheckerInterface $authorizationChecker,
991
        ObjectManager $manager,
992
        RepositoryInterface $repository,
993
        SingleResourceProviderInterface $singleResourceProvider,
994
        ResourceInterface $resource,
995
        ResourceFormFactoryInterface $resourceFormFactory,
996
        Form $form,
997
        EventDispatcherInterface $eventDispatcher,
998
        RedirectHandlerInterface $redirectHandler,
999
        FlashHelperInterface $flashHelper,
1000
        ResourceControllerEvent $event,
1001
        Request $request,
1002
        Response $redirectResponse
1003
    ): void {
1004
        $metadata->getApplicationName()->willReturn('sylius');
1005
        $metadata->getName()->willReturn('product');
1006
1007
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1008
        $configuration->hasPermission()->willReturn(true);
1009
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1010
1011
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1012
1013
        $configuration->isHtmlRequest()->willReturn(true);
1014
1015
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1016
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
1017
1018
        $request->isMethod('PATCH')->willReturn(false);
1019
        $request->getMethod()->willReturn('PUT');
1020
1021
        $form->handleRequest($request)->willReturn($form);
1022
1023
        $form->isSubmitted()->willReturn(true);
1024
        $form->isValid()->willReturn(true);
1025
        $form->getData()->willReturn($resource);
1026
1027
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1028
        $event->isStopped()->willReturn(true);
1029
        $event->hasResponse()->willReturn(false);
1030
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
1031
1032
        $manager->flush()->shouldNotBeCalled();
1033
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
1034
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
1035
1036
        $redirectHandler->redirectToResource($configuration, $resource)->willReturn($redirectResponse);
1037
1038
        $this->updateAction($request)->shouldReturn($redirectResponse);
1039
    }
1040
1041
    function it_redirects_to_updated_resource(
1042
        MetadataInterface $metadata,
1043
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1044
        RepositoryInterface $repository,
1045
        ObjectManager $manager,
1046
        SingleResourceProviderInterface $singleResourceProvider,
1047
        ResourceFormFactoryInterface $resourceFormFactory,
1048
        RedirectHandlerInterface $redirectHandler,
1049
        FlashHelperInterface $flashHelper,
1050
        AuthorizationCheckerInterface $authorizationChecker,
1051
        EventDispatcherInterface $eventDispatcher,
1052
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
1053
        RequestConfiguration $configuration,
1054
        ResourceInterface $resource,
1055
        Form $form,
1056
        ResourceControllerEvent $preEvent,
1057
        ResourceControllerEvent $postEvent,
1058
        Request $request,
1059
        Response $redirectResponse
1060
    ): void {
1061
        $metadata->getApplicationName()->willReturn('sylius');
1062
        $metadata->getName()->willReturn('product');
1063
1064
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1065
        $configuration->hasPermission()->willReturn(true);
1066
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1067
        $configuration->hasStateMachine()->willReturn(false);
1068
1069
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1070
1071
        $configuration->isHtmlRequest()->willReturn(true);
1072
        $configuration->getTemplate(ResourceActions::UPDATE . '.html')->willReturn('SyliusShopBundle:Product:update.html.twig');
1073
1074
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1075
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
1076
1077
        $request->isMethod('PATCH')->willReturn(false);
1078
        $request->getMethod()->willReturn('PUT');
1079
1080
        $form->handleRequest($request)->willReturn($form);
1081
1082
        $form->isSubmitted()->willReturn(true);
1083
        $form->isValid()->willReturn(true);
1084
        $form->getData()->willReturn($resource);
1085
1086
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($preEvent);
1087
        $preEvent->isStopped()->willReturn(false);
1088
1089
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
1090
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($postEvent);
1091
1092
        $postEvent->hasResponse()->willReturn(false);
1093
1094
        $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldBeCalled();
1095
        $redirectHandler->redirectToResource($configuration, $resource)->willReturn($redirectResponse);
1096
1097
        $this->updateAction($request)->shouldReturn($redirectResponse);
1098
    }
1099
1100
    function it_uses_response_from_post_update_event_if_defined(
1101
        MetadataInterface $metadata,
1102
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1103
        RepositoryInterface $repository,
1104
        ObjectManager $manager,
1105
        SingleResourceProviderInterface $singleResourceProvider,
1106
        ResourceFormFactoryInterface $resourceFormFactory,
1107
        RedirectHandlerInterface $redirectHandler,
1108
        FlashHelperInterface $flashHelper,
1109
        AuthorizationCheckerInterface $authorizationChecker,
1110
        EventDispatcherInterface $eventDispatcher,
1111
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
1112
        RequestConfiguration $configuration,
1113
        ResourceInterface $resource,
1114
        Form $form,
1115
        ResourceControllerEvent $preEvent,
1116
        ResourceControllerEvent $postEvent,
1117
        Request $request,
1118
        Response $redirectResponse
1119
    ): void {
1120
        $metadata->getApplicationName()->willReturn('sylius');
1121
        $metadata->getName()->willReturn('product');
1122
1123
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1124
        $configuration->hasPermission()->willReturn(true);
1125
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1126
        $configuration->hasStateMachine()->willReturn(false);
1127
1128
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1129
1130
        $configuration->isHtmlRequest()->willReturn(true);
1131
        $configuration->getTemplate(ResourceActions::UPDATE . '.html')->willReturn('SyliusShopBundle:Product:update.html.twig');
1132
1133
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1134
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
1135
1136
        $request->isMethod('PATCH')->willReturn(false);
1137
        $request->getMethod()->willReturn('PUT');
1138
1139
        $form->handleRequest($request)->willReturn($form);
1140
1141
        $form->isSubmitted()->willReturn(true);
1142
        $form->isValid()->willReturn(true);
1143
        $form->getData()->willReturn($resource);
1144
1145
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($preEvent);
1146
        $preEvent->isStopped()->willReturn(false);
1147
1148
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
1149
        $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldBeCalled();
1150
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($postEvent);
1151
1152
        $postEvent->hasResponse()->willReturn(true);
1153
        $postEvent->getResponse()->willReturn($redirectResponse);
1154
1155
        $redirectHandler->redirectToResource($configuration, $resource)->shouldNotBeCalled();
1156
1157
        $this->updateAction($request)->shouldReturn($redirectResponse);
1158
    }
1159
1160
    function it_returns_a_non_html_response_for_correctly_updated_resource(
1161
        MetadataInterface $metadata,
1162
        ParameterBagInterface $parameterBag,
1163
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1164
        ViewHandlerInterface $viewHandler,
1165
        RepositoryInterface $repository,
1166
        ObjectManager $manager,
1167
        SingleResourceProviderInterface $singleResourceProvider,
1168
        ResourceFormFactoryInterface $resourceFormFactory,
1169
        AuthorizationCheckerInterface $authorizationChecker,
1170
        EventDispatcherInterface $eventDispatcher,
1171
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
1172
        RequestConfiguration $configuration,
1173
        ResourceInterface $resource,
1174
        ResourceControllerEvent $event,
1175
        Form $form,
1176
        Request $request,
1177
        Response $response
1178
    ): void {
1179
        $metadata->getApplicationName()->willReturn('sylius');
1180
        $metadata->getName()->willReturn('product');
1181
1182
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1183
        $configuration->hasPermission()->willReturn(true);
1184
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1185
        $configuration->isHtmlRequest()->willReturn(false);
1186
        $configuration->hasStateMachine()->willReturn(false);
1187
1188
        $configuration->getParameters()->willReturn($parameterBag);
1189
        $parameterBag->get('return_content', false)->willReturn(false);
1190
1191
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1192
1193
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1194
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
1195
1196
        $request->isMethod('PATCH')->willReturn(false);
1197
        $request->getMethod()->willReturn('PUT');
1198
1199
        $form->handleRequest($request)->willReturn($form);
1200
        $form->isValid()->willReturn(true);
1201
        $form->getData()->willReturn($resource);
1202
1203
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1204
        $event->isStopped()->willReturn(false);
1205
1206
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
1207
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldBeCalled();
1208
1209
        $expectedView = View::create(null, 204);
1210
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
1211
1212
        $this->updateAction($request)->shouldReturn($response);
1213
    }
1214
1215
    function it_does_not_update_the_resource_throws_a_http_exception_for_non_html_requests_stopped_via_event(
1216
        MetadataInterface $metadata,
1217
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1218
        RequestConfiguration $configuration,
1219
        AuthorizationCheckerInterface $authorizationChecker,
1220
        ObjectManager $manager,
1221
        RepositoryInterface $repository,
1222
        SingleResourceProviderInterface $singleResourceProvider,
1223
        ResourceInterface $resource,
1224
        ResourceFormFactoryInterface $resourceFormFactory,
1225
        EventDispatcherInterface $eventDispatcher,
1226
        ResourceControllerEvent $event,
1227
        Form $form,
1228
        Request $request
1229
    ): void {
1230
        $metadata->getApplicationName()->willReturn('sylius');
1231
        $metadata->getName()->willReturn('product');
1232
1233
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1234
        $configuration->hasPermission()->willReturn(true);
1235
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1236
        $configuration->isHtmlRequest()->willReturn(false);
1237
1238
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1239
1240
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1241
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
1242
1243
        $request->isMethod('PATCH')->willReturn(false);
1244
        $request->getMethod()->willReturn('PUT');
1245
1246
        $form->handleRequest($request)->willReturn($form);
1247
        $form->isValid()->willReturn(true);
1248
        $form->getData()->willReturn($resource);
1249
1250
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1251
        $event->isStopped()->willReturn(true);
1252
        $event->getMessage()->willReturn('Cannot update this channel.');
1253
        $event->getErrorCode()->willReturn(500);
1254
1255
        $manager->flush()->shouldNotBeCalled();
1256
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
1257
1258
        $this
1259
            ->shouldThrow(new HttpException(500, 'Cannot update this channel.'))
1260
            ->during('updateAction', [$request])
1261
        ;
1262
    }
1263
1264
    function it_applies_state_machine_transition_to_updated_resource_if_configured(
1265
        MetadataInterface $metadata,
1266
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1267
        RepositoryInterface $repository,
1268
        ObjectManager $manager,
1269
        SingleResourceProviderInterface $singleResourceProvider,
1270
        ResourceFormFactoryInterface $resourceFormFactory,
1271
        RedirectHandlerInterface $redirectHandler,
1272
        FlashHelperInterface $flashHelper,
1273
        AuthorizationCheckerInterface $authorizationChecker,
1274
        EventDispatcherInterface $eventDispatcher,
1275
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
1276
        RequestConfiguration $configuration,
1277
        ResourceInterface $resource,
1278
        Form $form,
1279
        ResourceControllerEvent $preEvent,
1280
        ResourceControllerEvent $postEvent,
1281
        Request $request,
1282
        Response $redirectResponse
1283
    ): void {
1284
        $metadata->getApplicationName()->willReturn('sylius');
1285
        $metadata->getName()->willReturn('product');
1286
1287
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1288
        $configuration->hasPermission()->willReturn(true);
1289
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1290
        $configuration->hasStateMachine()->willReturn(true);
1291
1292
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1293
1294
        $configuration->isHtmlRequest()->willReturn(true);
1295
        $configuration->getTemplate(ResourceActions::UPDATE)->willReturn('SyliusShopBundle:Product:update.html.twig');
1296
1297
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1298
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
1299
1300
        $request->isMethod('PATCH')->willReturn(false);
1301
        $request->getMethod()->willReturn('PUT');
1302
1303
        $form->handleRequest($request)->willReturn($form);
1304
1305
        $form->isSubmitted()->willReturn(true);
1306
        $form->isValid()->willReturn(true);
1307
        $form->getData()->willReturn($resource);
1308
1309
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($preEvent);
1310
        $preEvent->isStopped()->willReturn(false);
1311
1312
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
1313
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($postEvent);
1314
1315
        $postEvent->hasResponse()->willReturn(false);
1316
1317
        $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldBeCalled();
1318
        $redirectHandler->redirectToResource($configuration, $resource)->willReturn($redirectResponse);
1319
1320
        $this->updateAction($request)->shouldReturn($redirectResponse);
1321
    }
1322
1323
    function it_throws_a_403_exception_if_user_is_unauthorized_to_delete_a_single_resource(
1324
        MetadataInterface $metadata,
1325
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1326
        RequestConfiguration $configuration,
1327
        Request $request,
1328
        AuthorizationCheckerInterface $authorizationChecker
1329
    ): void {
1330
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1331
        $configuration->hasPermission()->willReturn(true);
1332
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1333
1334
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(false);
1335
1336
        $this
1337
            ->shouldThrow(new AccessDeniedException())
1338
            ->during('deleteAction', [$request])
1339
        ;
1340
    }
1341
1342
    function it_throws_a_404_exception_if_resource_for_deletion_is_not_found_based_on_configuration(
1343
        MetadataInterface $metadata,
1344
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1345
        RequestConfiguration $configuration,
1346
        Request $request,
1347
        AuthorizationCheckerInterface $authorizationChecker,
1348
        RepositoryInterface $repository,
1349
        SingleResourceProviderInterface $singleResourceProvider
1350
    ): void {
1351
        $metadata->getHumanizedName()->willReturn('product');
1352
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1353
        $configuration->hasPermission()->willReturn(true);
1354
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1355
1356
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1357
        $singleResourceProvider->get($configuration, $repository)->willReturn(null);
1358
1359
        $this
1360
            ->shouldThrow(new NotFoundHttpException('The "product" has not been found'))
1361
            ->during('deleteAction', [$request])
1362
        ;
1363
    }
1364
1365
    function it_deletes_a_resource_and_redirects_to_index_by_for_html_request(
1366
        MetadataInterface $metadata,
1367
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1368
        RequestConfiguration $configuration,
1369
        AuthorizationCheckerInterface $authorizationChecker,
1370
        RepositoryInterface $repository,
1371
        SingleResourceProviderInterface $singleResourceProvider,
1372
        ResourceInterface $resource,
1373
        RedirectHandlerInterface $redirectHandler,
1374
        FlashHelperInterface $flashHelper,
1375
        EventDispatcherInterface $eventDispatcher,
1376
        CsrfTokenManagerInterface $csrfTokenManager,
1377
        ContainerInterface $container,
1378
        ResourceControllerEvent $event,
1379
        ResourceControllerEvent $postEvent,
1380
        ResourceDeleteHandlerInterface $resourceDeleteHandler,
1381
        Request $request,
1382
        Response $redirectResponse
1383
    ): void {
1384
        $metadata->getApplicationName()->willReturn('sylius');
1385
        $metadata->getName()->willReturn('product');
1386
1387
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1388
        $configuration->hasPermission()->willReturn(true);
1389
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1390
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1391
1392
        $container->has('security.csrf.token_manager')->willReturn(true);
1393
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1394
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(true);
1395
1396
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1397
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1398
        $resource->getId()->willReturn(1);
1399
1400
        $configuration->isHtmlRequest()->willReturn(true);
1401
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1402
1403
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1404
        $event->isStopped()->willReturn(false);
1405
1406
        $resourceDeleteHandler->handle($resource, $repository)->shouldBeCalled();
1407
        $eventDispatcher->dispatchPostEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($postEvent);
1408
1409
        $postEvent->hasResponse()->willReturn(false);
1410
1411
        $flashHelper->addSuccessFlash($configuration, ResourceActions::DELETE, $resource)->shouldBeCalled();
1412
        $redirectHandler->redirectToIndex($configuration, $resource)->willReturn($redirectResponse);
1413
1414
        $this->deleteAction($request)->shouldReturn($redirectResponse);
1415
    }
1416
1417
    function it_uses_response_from_post_delete_event_if_defined(
1418
        MetadataInterface $metadata,
1419
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1420
        RequestConfiguration $configuration,
1421
        AuthorizationCheckerInterface $authorizationChecker,
1422
        RepositoryInterface $repository,
1423
        SingleResourceProviderInterface $singleResourceProvider,
1424
        ResourceInterface $resource,
1425
        FlashHelperInterface $flashHelper,
1426
        EventDispatcherInterface $eventDispatcher,
1427
        CsrfTokenManagerInterface $csrfTokenManager,
1428
        ContainerInterface $container,
1429
        ResourceControllerEvent $event,
1430
        ResourceControllerEvent $postEvent,
1431
        ResourceDeleteHandlerInterface $resourceDeleteHandler,
1432
        Request $request,
1433
        Response $redirectResponse
1434
    ): void {
1435
        $metadata->getApplicationName()->willReturn('sylius');
1436
        $metadata->getName()->willReturn('product');
1437
1438
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1439
        $configuration->hasPermission()->willReturn(true);
1440
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1441
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1442
1443
        $container->has('security.csrf.token_manager')->willReturn(true);
1444
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1445
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(true);
1446
1447
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1448
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1449
        $resource->getId()->willReturn(1);
1450
1451
        $configuration->isHtmlRequest()->willReturn(true);
1452
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1453
1454
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1455
        $event->isStopped()->willReturn(false);
1456
1457
        $resourceDeleteHandler->handle($resource, $repository)->shouldBeCalled();
1458
        $eventDispatcher->dispatchPostEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($postEvent);
1459
1460
        $flashHelper->addSuccessFlash($configuration, ResourceActions::DELETE, $resource)->shouldBeCalled();
1461
1462
        $postEvent->hasResponse()->willReturn(true);
1463
        $postEvent->getResponse()->willReturn($redirectResponse);
1464
1465
        $this->deleteAction($request)->shouldReturn($redirectResponse);
1466
    }
1467
1468
    function it_does_not_delete_a_resource_and_redirects_to_index_for_html_requests_stopped_via_event(
1469
        MetadataInterface $metadata,
1470
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1471
        RequestConfiguration $configuration,
1472
        AuthorizationCheckerInterface $authorizationChecker,
1473
        RepositoryInterface $repository,
1474
        SingleResourceProviderInterface $singleResourceProvider,
1475
        ResourceInterface $resource,
1476
        RedirectHandlerInterface $redirectHandler,
1477
        FlashHelperInterface $flashHelper,
1478
        EventDispatcherInterface $eventDispatcher,
1479
        CsrfTokenManagerInterface $csrfTokenManager,
1480
        ContainerInterface $container,
1481
        ResourceControllerEvent $event,
1482
        ResourceDeleteHandlerInterface $resourceDeleteHandler,
1483
        Request $request,
1484
        Response $redirectResponse
1485
    ): void {
1486
        $metadata->getApplicationName()->willReturn('sylius');
1487
        $metadata->getName()->willReturn('product');
1488
1489
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1490
        $configuration->hasPermission()->willReturn(true);
1491
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1492
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1493
1494
        $container->has('security.csrf.token_manager')->willReturn(true);
1495
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1496
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(true);
1497
1498
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1499
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1500
        $resource->getId()->willReturn(1);
1501
1502
        $configuration->isHtmlRequest()->willReturn(true);
1503
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1504
1505
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1506
        $event->isStopped()->willReturn(true);
1507
        $event->hasResponse()->willReturn(false);
1508
1509
        $resourceDeleteHandler->handle($resource, $repository)->shouldNotBeCalled();
1510
        $eventDispatcher->dispatchPostEvent(ResourceActions::DELETE, $configuration, $resource)->shouldNotBeCalled();
1511
        $flashHelper->addSuccessFlash($configuration, ResourceActions::DELETE, $resource)->shouldNotBeCalled();
1512
1513
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
1514
        $redirectHandler->redirectToIndex($configuration, $resource)->willReturn($redirectResponse);
1515
1516
        $this->deleteAction($request)->shouldReturn($redirectResponse);
1517
    }
1518
1519
    function it_does_not_delete_a_resource_and_uses_response_from_event_if_defined(
1520
        MetadataInterface $metadata,
1521
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1522
        RequestConfiguration $configuration,
1523
        AuthorizationCheckerInterface $authorizationChecker,
1524
        RepositoryInterface $repository,
1525
        SingleResourceProviderInterface $singleResourceProvider,
1526
        ResourceInterface $resource,
1527
        RedirectHandlerInterface $redirectHandler,
1528
        FlashHelperInterface $flashHelper,
1529
        EventDispatcherInterface $eventDispatcher,
1530
        CsrfTokenManagerInterface $csrfTokenManager,
1531
        ContainerInterface $container,
1532
        ResourceControllerEvent $event,
1533
        ResourceDeleteHandlerInterface $resourceDeleteHandler,
1534
        Request $request,
1535
        Response $redirectResponse
1536
    ): void {
1537
        $metadata->getApplicationName()->willReturn('sylius');
1538
        $metadata->getName()->willReturn('product');
1539
1540
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1541
        $configuration->hasPermission()->willReturn(true);
1542
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1543
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1544
1545
        $container->has('security.csrf.token_manager')->willReturn(true);
1546
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1547
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(true);
1548
1549
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1550
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1551
        $resource->getId()->willReturn(1);
1552
1553
        $configuration->isHtmlRequest()->willReturn(true);
1554
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1555
1556
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1557
        $event->isStopped()->willReturn(true);
1558
1559
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
1560
1561
        $event->hasResponse()->willReturn(true);
1562
        $event->getResponse()->willReturn($redirectResponse);
1563
1564
        $resourceDeleteHandler->handle($resource, $repository)->shouldNotBeCalled();
1565
        $eventDispatcher->dispatchPostEvent(ResourceActions::DELETE, $configuration, $resource)->shouldNotBeCalled();
1566
        $flashHelper->addSuccessFlash($configuration, ResourceActions::DELETE, $resource)->shouldNotBeCalled();
1567
1568
        $redirectHandler->redirectToIndex($configuration, $resource)->shouldNotBeCalled();
1569
1570
        $this->deleteAction($request)->shouldReturn($redirectResponse);
1571
    }
1572
1573
    function it_does_not_correctly_delete_a_resource_and_returns_500_for_not_html_response(
1574
        MetadataInterface $metadata,
1575
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1576
        RequestConfiguration $configuration,
1577
        AuthorizationCheckerInterface $authorizationChecker,
1578
        ViewHandlerInterface $viewHandler,
1579
        RepositoryInterface $repository,
1580
        SingleResourceProviderInterface $singleResourceProvider,
1581
        ResourceInterface $resource,
1582
        EventDispatcherInterface $eventDispatcher,
1583
        CsrfTokenManagerInterface $csrfTokenManager,
1584
        ContainerInterface $container,
1585
        ResourceControllerEvent $event,
1586
        ResourceDeleteHandlerInterface $resourceDeleteHandler,
1587
        Request $request,
1588
        Response $response
1589
    ): void {
1590
        $metadata->getApplicationName()->willReturn('sylius');
1591
        $metadata->getName()->willReturn('product');
1592
1593
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1594
        $configuration->hasPermission()->willReturn(true);
1595
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1596
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1597
1598
        $container->has('security.csrf.token_manager')->willReturn(true);
1599
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1600
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(true);
1601
1602
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1603
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1604
        $resource->getId()->willReturn(1);
1605
1606
        $configuration->isHtmlRequest()->willReturn(false);
1607
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1608
1609
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1610
        $event->isStopped()->willReturn(false);
1611
1612
        $resourceDeleteHandler->handle($resource, $repository)->willThrow(new DeleteHandlingException());
1613
1614
        $eventDispatcher->dispatchPostEvent(ResourceActions::DELETE, $configuration, $resource)->shouldNotBeCalled();
1615
1616
        $expectedView = View::create(null, 500);
1617
1618
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
1619
1620
        $this->deleteAction($request)->shouldReturn($response);
1621
    }
1622
1623
    function it_deletes_a_resource_and_returns_204_for_non_html_requests(
1624
        MetadataInterface $metadata,
1625
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1626
        RequestConfiguration $configuration,
1627
        AuthorizationCheckerInterface $authorizationChecker,
1628
        ViewHandlerInterface $viewHandler,
1629
        RepositoryInterface $repository,
1630
        SingleResourceProviderInterface $singleResourceProvider,
1631
        ResourceInterface $resource,
1632
        EventDispatcherInterface $eventDispatcher,
1633
        CsrfTokenManagerInterface $csrfTokenManager,
1634
        ContainerInterface $container,
1635
        ResourceControllerEvent $event,
1636
        ResourceDeleteHandlerInterface $resourceDeleteHandler,
1637
        Request $request,
1638
        Response $response
1639
    ): void {
1640
        $metadata->getApplicationName()->willReturn('sylius');
1641
        $metadata->getName()->willReturn('product');
1642
1643
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1644
        $configuration->hasPermission()->willReturn(true);
1645
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1646
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1647
1648
        $container->has('security.csrf.token_manager')->willReturn(true);
1649
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1650
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(true);
1651
1652
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1653
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1654
        $resource->getId()->willReturn(1);
1655
1656
        $configuration->isHtmlRequest()->willReturn(false);
1657
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1658
1659
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1660
        $event->isStopped()->willReturn(false);
1661
1662
        $resourceDeleteHandler->handle($resource, $repository)->shouldBeCalled();
1663
        $eventDispatcher->dispatchPostEvent(ResourceActions::DELETE, $configuration, $resource)->shouldBeCalled();
1664
1665
        $expectedView = View::create(null, 204);
1666
1667
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
1668
1669
        $this->deleteAction($request)->shouldReturn($response);
1670
    }
1671
1672
    function it_does_not_delete_a_resource_and_throws_http_exception_for_non_html_requests_stopped_via_event(
1673
        MetadataInterface $metadata,
1674
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1675
        RequestConfiguration $configuration,
1676
        AuthorizationCheckerInterface $authorizationChecker,
1677
        RepositoryInterface $repository,
1678
        SingleResourceProviderInterface $singleResourceProvider,
1679
        ResourceInterface $resource,
1680
        FlashHelperInterface $flashHelper,
1681
        EventDispatcherInterface $eventDispatcher,
1682
        CsrfTokenManagerInterface $csrfTokenManager,
1683
        ContainerInterface $container,
1684
        ResourceControllerEvent $event,
1685
        ResourceDeleteHandlerInterface $resourceDeleteHandler,
1686
        Request $request
1687
    ): void {
1688
        $metadata->getApplicationName()->willReturn('sylius');
1689
        $metadata->getName()->willReturn('product');
1690
1691
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1692
        $configuration->hasPermission()->willReturn(true);
1693
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1694
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1695
1696
        $container->has('security.csrf.token_manager')->willReturn(true);
1697
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1698
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(true);
1699
1700
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1701
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1702
        $resource->getId()->willReturn(1);
1703
1704
        $configuration->isHtmlRequest()->willReturn(false);
1705
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1706
1707
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1708
        $event->isStopped()->willReturn(true);
1709
        $event->getMessage()->willReturn('Cannot delete this product.');
1710
        $event->getErrorCode()->willReturn(500);
1711
1712
        $resourceDeleteHandler->handle($resource, $repository)->shouldNotBeCalled();
1713
1714
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
1715
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
1716
        $flashHelper->addFlashFromEvent(Argument::any())->shouldNotBeCalled();
1717
1718
        $this
1719
            ->shouldThrow(new HttpException(500, 'Cannot delete this product.'))
1720
            ->during('deleteAction', [$request])
1721
        ;
1722
    }
1723
1724
    function it_throws_a_403_exception_if_csrf_token_is_invalid_during_delete_action(
1725
        MetadataInterface $metadata,
1726
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1727
        RequestConfiguration $configuration,
1728
        AuthorizationCheckerInterface $authorizationChecker,
1729
        RepositoryInterface $repository,
1730
        SingleResourceProviderInterface $singleResourceProvider,
1731
        ResourceInterface $resource,
1732
        FlashHelperInterface $flashHelper,
1733
        EventDispatcherInterface $eventDispatcher,
1734
        CsrfTokenManagerInterface $csrfTokenManager,
1735
        ContainerInterface $container,
1736
        ResourceControllerEvent $event,
1737
        ResourceDeleteHandlerInterface $resourceDeleteHandler,
1738
        Request $request
1739
    ): void {
1740
        $metadata->getApplicationName()->willReturn('sylius');
1741
        $metadata->getName()->willReturn('product');
1742
1743
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1744
        $configuration->hasPermission()->willReturn(true);
1745
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1746
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1747
1748
        $container->has('security.csrf.token_manager')->willReturn(true);
1749
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1750
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(false);
1751
1752
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1753
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1754
        $resource->getId()->willReturn(1);
1755
1756
        $configuration->isHtmlRequest()->willReturn(true);
1757
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1758
1759
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1760
        $event->isStopped()->shouldNotBeCalled();
1761
1762
        $resourceDeleteHandler->handle($resource, $repository)->shouldNotBeCalled();
1763
1764
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
1765
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
1766
        $flashHelper->addFlashFromEvent(Argument::any())->shouldNotBeCalled();
1767
1768
        $this
1769
            ->shouldThrow(new HttpException(403, 'Invalid csrf token.'))
1770
            ->during('deleteAction', [$request])
1771
        ;
1772
    }
1773
1774
    function it_throws_a_403_exception_if_user_is_unauthorized_to_apply_state_machine_transition_on_resource(
1775
        MetadataInterface $metadata,
1776
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1777
        RequestConfiguration $configuration,
1778
        Request $request,
1779
        AuthorizationCheckerInterface $authorizationChecker
1780
    ): void {
1781
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1782
        $configuration->hasPermission()->willReturn(true);
1783
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1784
1785
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(false);
1786
1787
        $this
1788
            ->shouldThrow(new AccessDeniedException())
1789
            ->during('applyStateMachineTransitionAction', [$request])
1790
        ;
1791
    }
1792
1793
    function it_throws_a_404_exception_if_resource_is_not_found_when_trying_to_apply_state_machine_transition(
1794
        MetadataInterface $metadata,
1795
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1796
        RequestConfiguration $configuration,
1797
        Request $request,
1798
        AuthorizationCheckerInterface $authorizationChecker,
1799
        RepositoryInterface $repository,
1800
        SingleResourceProviderInterface $singleResourceProvider
1801
    ): void {
1802
        $metadata->getHumanizedName()->willReturn('product');
1803
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1804
        $configuration->hasPermission()->willReturn(true);
1805
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1806
1807
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1808
        $singleResourceProvider->get($configuration, $repository)->willReturn(null);
1809
1810
        $this
1811
            ->shouldThrow(new NotFoundHttpException('The "product" has not been found'))
1812
            ->during('applyStateMachineTransitionAction', [$request])
1813
        ;
1814
    }
1815
1816
    function it_does_not_apply_state_machine_transition_on_resource_if_not_applicable_and_returns_400_bad_request(
1817
        MetadataInterface $metadata,
1818
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1819
        RequestConfiguration $configuration,
1820
        AuthorizationCheckerInterface $authorizationChecker,
1821
        RepositoryInterface $repository,
1822
        ObjectManager $objectManager,
1823
        StateMachineInterface $stateMachine,
1824
        SingleResourceProviderInterface $singleResourceProvider,
1825
        ResourceInterface $resource,
1826
        FlashHelperInterface $flashHelper,
1827
        EventDispatcherInterface $eventDispatcher,
1828
        ResourceControllerEvent $event,
1829
        Request $request
1830
    ): void {
1831
        $metadata->getApplicationName()->willReturn('sylius');
1832
        $metadata->getName()->willReturn('product');
1833
1834
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1835
        $configuration->hasPermission()->willReturn(true);
1836
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1837
1838
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1839
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1840
1841
        $configuration->isHtmlRequest()->willReturn(true);
1842
1843
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1844
        $event->isStopped()->willReturn(false);
1845
1846
        $stateMachine->can($configuration, $resource)->willReturn(false);
1847
1848
        $stateMachine->apply($configuration, $resource)->shouldNotBeCalled();
1849
        $objectManager->flush()->shouldNotBeCalled();
1850
1851
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
1852
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
1853
        $flashHelper->addFlashFromEvent(Argument::any())->shouldNotBeCalled();
1854
1855
        $this
1856
            ->shouldThrow(new BadRequestHttpException())
1857
            ->during('applyStateMachineTransitionAction', [$request])
1858
        ;
1859
    }
1860
1861
    function it_applies_state_machine_transition_to_resource_and_redirects_for_html_request(
1862
        MetadataInterface $metadata,
1863
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1864
        RepositoryInterface $repository,
1865
        ObjectManager $manager,
1866
        SingleResourceProviderInterface $singleResourceProvider,
1867
        RedirectHandlerInterface $redirectHandler,
1868
        FlashHelperInterface $flashHelper,
1869
        AuthorizationCheckerInterface $authorizationChecker,
1870
        EventDispatcherInterface $eventDispatcher,
1871
        StateMachineInterface $stateMachine,
1872
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
1873
        RequestConfiguration $configuration,
1874
        ResourceInterface $resource,
1875
        ResourceControllerEvent $event,
1876
        ResourceControllerEvent $postEvent,
1877
        Request $request,
1878
        Response $redirectResponse
1879
    ): void {
1880
        $metadata->getApplicationName()->willReturn('sylius');
1881
        $metadata->getName()->willReturn('product');
1882
1883
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1884
        $configuration->hasPermission()->willReturn(true);
1885
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1886
1887
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1888
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1889
1890
        $configuration->isHtmlRequest()->willReturn(true);
1891
1892
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1893
        $event->isStopped()->willReturn(false);
1894
1895
        $stateMachine->can($configuration, $resource)->willReturn(true);
1896
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
1897
1898
        $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldBeCalled();
1899
1900
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($postEvent);
1901
1902
        $postEvent->hasResponse()->willReturn(false);
1903
1904
        $redirectHandler->redirectToResource($configuration, $resource)->willReturn($redirectResponse);
1905
1906
        $this->applyStateMachineTransitionAction($request)->shouldReturn($redirectResponse);
1907
    }
1908
1909
    function it_uses_response_from_post_apply_state_machine_transition_event_if_defined(
1910
        MetadataInterface $metadata,
1911
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1912
        RepositoryInterface $repository,
1913
        ObjectManager $manager,
1914
        SingleResourceProviderInterface $singleResourceProvider,
1915
        RedirectHandlerInterface $redirectHandler,
0 ignored issues
show
Unused Code introduced by
The parameter $redirectHandler is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1916
        FlashHelperInterface $flashHelper,
1917
        AuthorizationCheckerInterface $authorizationChecker,
1918
        EventDispatcherInterface $eventDispatcher,
1919
        StateMachineInterface $stateMachine,
1920
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
1921
        RequestConfiguration $configuration,
1922
        ResourceInterface $resource,
1923
        ResourceControllerEvent $event,
1924
        ResourceControllerEvent $postEvent,
1925
        Request $request,
1926
        Response $redirectResponse
1927
    ): void {
1928
        $metadata->getApplicationName()->willReturn('sylius');
1929
        $metadata->getName()->willReturn('product');
1930
1931
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1932
        $configuration->hasPermission()->willReturn(true);
1933
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1934
1935
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1936
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1937
1938
        $configuration->isHtmlRequest()->willReturn(true);
1939
1940
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1941
        $event->isStopped()->willReturn(false);
1942
1943
        $stateMachine->can($configuration, $resource)->willReturn(true);
1944
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
1945
1946
        $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldBeCalled();
1947
1948
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($postEvent);
1949
1950
        $postEvent->hasResponse()->willReturn(true);
1951
        $postEvent->getResponse()->willReturn($redirectResponse);
1952
1953
        $this->applyStateMachineTransitionAction($request)->shouldReturn($redirectResponse);
1954
    }
1955
1956
    function it_does_not_apply_state_machine_transition_on_resource_and_redirects_for_html_requests_stopped_via_event(
1957
        MetadataInterface $metadata,
1958
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1959
        RequestConfiguration $configuration,
1960
        AuthorizationCheckerInterface $authorizationChecker,
1961
        StateMachineInterface $stateMachine,
1962
        ObjectManager $manager,
1963
        RepositoryInterface $repository,
1964
        SingleResourceProviderInterface $singleResourceProvider,
1965
        ResourceInterface $resource,
1966
        RedirectHandlerInterface $redirectHandler,
1967
        FlashHelperInterface $flashHelper,
1968
        EventDispatcherInterface $eventDispatcher,
1969
        ResourceControllerEvent $event,
1970
        Request $request,
1971
        Response $redirectResponse
1972
    ): void {
1973
        $metadata->getApplicationName()->willReturn('sylius');
1974
        $metadata->getName()->willReturn('product');
1975
1976
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1977
        $configuration->hasPermission()->willReturn(true);
1978
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1979
1980
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1981
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1982
1983
        $configuration->isHtmlRequest()->willReturn(true);
1984
1985
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1986
        $event->isStopped()->willReturn(true);
1987
1988
        $manager->flush()->shouldNotBeCalled();
1989
        $stateMachine->apply($resource)->shouldNotBeCalled();
1990
1991
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldNotBeCalled();
1992
        $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldNotBeCalled();
1993
1994
        $event->hasResponse()->willReturn(false);
1995
1996
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
1997
        $redirectHandler->redirectToResource($configuration, $resource)->willReturn($redirectResponse);
1998
1999
        $this->applyStateMachineTransitionAction($request)->shouldReturn($redirectResponse);
2000
    }
2001
2002
    function it_does_not_apply_state_machine_transition_on_resource_and_return_event_response_for_html_requests_stopped_via_event(
2003
        MetadataInterface $metadata,
2004
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
2005
        RequestConfiguration $configuration,
2006
        AuthorizationCheckerInterface $authorizationChecker,
2007
        StateMachineInterface $stateMachine,
2008
        ObjectManager $manager,
2009
        RepositoryInterface $repository,
2010
        SingleResourceProviderInterface $singleResourceProvider,
2011
        ResourceInterface $resource,
2012
        FlashHelperInterface $flashHelper,
2013
        EventDispatcherInterface $eventDispatcher,
2014
        ResourceControllerEvent $event,
2015
        Request $request,
2016
        Response $response
2017
    ): void {
2018
        $metadata->getApplicationName()->willReturn('sylius');
2019
        $metadata->getName()->willReturn('product');
2020
2021
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
2022
        $configuration->hasPermission()->willReturn(true);
2023
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
2024
2025
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
2026
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
2027
2028
        $configuration->isHtmlRequest()->willReturn(true);
2029
2030
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
2031
        $event->isStopped()->willReturn(true);
2032
2033
        $manager->flush()->shouldNotBeCalled();
2034
        $stateMachine->apply($resource)->shouldNotBeCalled();
2035
2036
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldNotBeCalled();
2037
        $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldNotBeCalled();
2038
2039
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
2040
2041
        $event->hasResponse()->willReturn(true);
2042
        $event->getResponse()->willReturn($response);
2043
2044
        $this->applyStateMachineTransitionAction($request)->shouldReturn($response);
2045
    }
2046
2047
    function it_applies_state_machine_transition_on_resource_and_returns_200_for_non_html_requests(
2048
        MetadataInterface $metadata,
2049
        ParameterBagInterface $parameterBag,
2050
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
2051
        ViewHandlerInterface $viewHandler,
2052
        RepositoryInterface $repository,
2053
        ObjectManager $manager,
2054
        SingleResourceProviderInterface $singleResourceProvider,
2055
        AuthorizationCheckerInterface $authorizationChecker,
2056
        EventDispatcherInterface $eventDispatcher,
2057
        StateMachineInterface $stateMachine,
2058
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
2059
        RequestConfiguration $configuration,
2060
        ResourceInterface $resource,
2061
        ResourceControllerEvent $event,
2062
        Request $request,
2063
        Response $response
2064
    ): void {
2065
        $metadata->getApplicationName()->willReturn('sylius');
2066
        $metadata->getName()->willReturn('product');
2067
2068
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
2069
        $configuration->getParameters()->willReturn($parameterBag);
2070
        $configuration->hasPermission()->willReturn(true);
2071
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
2072
2073
        $parameterBag->get('return_content', true)->willReturn(true);
2074
2075
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
2076
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
2077
2078
        $configuration->isHtmlRequest()->willReturn(false);
2079
2080
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
2081
        $event->isStopped()->willReturn(false);
2082
2083
        $stateMachine->can($configuration, $resource)->willReturn(true);
2084
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
2085
2086
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldBeCalled();
2087
2088
        $expectedView = View::create($resource, 200);
2089
2090
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
2091
2092
        $this->applyStateMachineTransitionAction($request)->shouldReturn($response);
2093
    }
2094
2095
    function it_applies_state_machine_transition_on_resource_and_returns_204_for_non_html_requests_if_additional_option_added(
2096
        MetadataInterface $metadata,
2097
        ParameterBagInterface $parameterBag,
2098
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
2099
        ViewHandlerInterface $viewHandler,
2100
        RepositoryInterface $repository,
2101
        ObjectManager $manager,
2102
        SingleResourceProviderInterface $singleResourceProvider,
2103
        AuthorizationCheckerInterface $authorizationChecker,
2104
        EventDispatcherInterface $eventDispatcher,
2105
        StateMachineInterface $stateMachine,
2106
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
2107
        RequestConfiguration $configuration,
2108
        ResourceInterface $resource,
2109
        ResourceControllerEvent $event,
2110
        Request $request,
2111
        Response $response
2112
    ): void {
2113
        $metadata->getApplicationName()->willReturn('sylius');
2114
        $metadata->getName()->willReturn('product');
2115
2116
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
2117
        $configuration->getParameters()->willReturn($parameterBag);
2118
        $configuration->hasPermission()->willReturn(true);
2119
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
2120
2121
        $parameterBag->get('return_content', true)->willReturn(false);
2122
2123
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
2124
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
2125
2126
        $configuration->isHtmlRequest()->willReturn(false);
2127
2128
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
2129
        $event->isStopped()->willReturn(false);
2130
2131
        $stateMachine->can($configuration, $resource)->willReturn(true);
2132
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
2133
2134
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldBeCalled();
2135
2136
        $expectedView = View::create(null, 204);
2137
2138
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
2139
2140
        $this->applyStateMachineTransitionAction($request)->shouldReturn($response);
2141
    }
2142
2143
    function it_does_not_apply_state_machine_transition_resource_and_throws_http_exception_for_non_html_requests_stopped_via_event(
2144
        MetadataInterface $metadata,
2145
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
2146
        RequestConfiguration $configuration,
2147
        AuthorizationCheckerInterface $authorizationChecker,
2148
        RepositoryInterface $repository,
2149
        ObjectManager $objectManager,
2150
        StateMachineInterface $stateMachine,
2151
        SingleResourceProviderInterface $singleResourceProvider,
2152
        ResourceInterface $resource,
2153
        FlashHelperInterface $flashHelper,
2154
        EventDispatcherInterface $eventDispatcher,
2155
        ResourceControllerEvent $event,
2156
        Request $request
2157
    ): void {
2158
        $metadata->getApplicationName()->willReturn('sylius');
2159
        $metadata->getName()->willReturn('product');
2160
2161
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
2162
        $configuration->hasPermission()->willReturn(true);
2163
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
2164
2165
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
2166
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
2167
2168
        $configuration->isHtmlRequest()->willReturn(false);
2169
2170
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
2171
        $event->isStopped()->willReturn(true);
2172
        $event->getMessage()->willReturn('Cannot approve this product.');
2173
        $event->getErrorCode()->willReturn(500);
2174
2175
        $stateMachine->apply($configuration, $resource)->shouldNotBeCalled();
2176
        $objectManager->flush()->shouldNotBeCalled();
2177
2178
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
2179
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
2180
        $flashHelper->addFlashFromEvent(Argument::any())->shouldNotBeCalled();
2181
2182
        $this
2183
            ->shouldThrow(new HttpException(500, 'Cannot approve this product.'))
2184
            ->during('applyStateMachineTransitionAction', [$request])
2185
        ;
2186
    }
2187
2188
    /**
2189
     * {@inheritdoc}
2190
     */
2191
    private function getViewComparingCallback(View $expectedView)
2192
    {
2193
        return function ($value) use ($expectedView) {
2194
            if (!$value instanceof View) {
2195
                return false;
2196
            }
2197
2198
            // Need to unwrap phpspec's Collaborators to ensure proper comparison.
2199
            $this->unwrapViewData($expectedView);
2200
            $this->nullifyDates($value);
2201
            $this->nullifyDates($expectedView);
2202
2203
            return
2204
                $expectedView->getStatusCode() === $value->getStatusCode() &&
2205
                $expectedView->getHeaders() === $value->getHeaders() &&
2206
                $expectedView->getEngine() === $value->getEngine() &&
2207
                $expectedView->getFormat() === $value->getFormat() &&
2208
                $expectedView->getData() === $value->getData() &&
2209
                $expectedView->getTemplate() === $value->getTemplate() &&
2210
                $expectedView->getTemplateVar() === $value->getTemplateVar()
2211
            ;
2212
        };
2213
    }
2214
2215
    /**
2216
     * @param View $view
2217
     */
2218
    private function unwrapViewData(View $view)
2219
    {
2220
        $view->setData($this->unwrapIfCollaborator($view->getData()));
2221
    }
2222
2223
    /**
2224
     * @param mixed $value
2225
     *
2226
     * @return mixed
0 ignored issues
show
Documentation introduced by
Consider making the return type a bit more specific; maybe use null|object|integer|double|string|boolean|array.

This check looks for the generic type array as a return type and suggests a more specific type. This type is inferred from the actual code.

Loading history...
2227
     */
2228
    private function unwrapIfCollaborator($value)
2229
    {
2230
        if (null === $value) {
2231
            return null;
2232
        }
2233
2234
        if ($value instanceof Collaborator) {
2235
            return $value->getWrappedObject();
2236
        }
2237
2238
        if (is_array($value)) {
2239
            foreach ($value as $key => $childValue) {
2240
                $value[$key] = $this->unwrapIfCollaborator($childValue);
2241
            }
2242
        }
2243
2244
        return $value;
2245
    }
2246
2247
    /**
2248
     * @param View $view
2249
     */
2250
    private function nullifyDates(View $view)
2251
    {
2252
        $headers = $view->getHeaders();
2253
        unset($headers['date']);
2254
        $view->setHeaders($headers);
2255
    }
2256
}
2257