Completed
Push — scalar-types/resource ( 4814fd )
by Kamil
23:02
created

ResourceControllerSpec::unwrapIfCollaborator()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 18
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 18
rs 8.8571
c 0
b 0
f 0
nc 4
cc 5
eloc 9
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\ResourceController;
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\Factory\FactoryInterface;
37
use Sylius\Component\Resource\Metadata\MetadataInterface;
38
use Sylius\Component\Resource\Model\ResourceInterface;
39
use Sylius\Component\Resource\Repository\RepositoryInterface;
40
use Sylius\Component\Resource\ResourceActions;
41
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
42
use Symfony\Component\DependencyInjection\ContainerInterface;
43
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
44
use Symfony\Component\Form\Form;
45
use Symfony\Component\Form\FormView;
46
use Symfony\Component\HttpFoundation\ParameterBag;
47
use Symfony\Component\HttpFoundation\Request;
48
use Symfony\Component\HttpFoundation\Response;
49
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
50
use Symfony\Component\HttpKernel\Exception\HttpException;
51
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
52
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
53
use Symfony\Component\Security\Csrf\CsrfToken;
54
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
55
56
/**
57
 * @author Paweł Jędrzejewski <[email protected]>
58
 */
59
final class ResourceControllerSpec extends ObjectBehavior
60
{
61
    function let(
62
        MetadataInterface $metadata,
63
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
64
        ViewHandlerInterface $viewHandler,
65
        RepositoryInterface $repository,
66
        FactoryInterface $factory,
67
        NewResourceFactoryInterface $newResourceFactory,
68
        ObjectManager $manager,
69
        SingleResourceProviderInterface $singleResourceProvider,
70
        ResourcesCollectionProviderInterface $resourcesCollectionProvider,
71
        ResourceFormFactoryInterface $resourceFormFactory,
72
        RedirectHandlerInterface $redirectHandler,
73
        FlashHelperInterface $flashHelper,
74
        AuthorizationCheckerInterface $authorizationChecker,
75
        EventDispatcherInterface $eventDispatcher,
76
        StateMachineInterface $stateMachine,
77
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
78
        ContainerInterface $container
79
    ): void {
80
        $this->beConstructedWith(
81
            $metadata,
82
            $requestConfigurationFactory,
83
            $viewHandler,
84
            $repository,
85
            $factory,
86
            $newResourceFactory,
87
            $manager,
88
            $singleResourceProvider,
89
            $resourcesCollectionProvider,
90
            $resourceFormFactory,
91
            $redirectHandler,
92
            $flashHelper,
93
            $authorizationChecker,
94
            $eventDispatcher,
95
            $stateMachine,
96
            $resourceUpdateHandler
97
        );
98
99
        $this->setContainer($container);
100
    }
101
102
    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...
103
    {
104
        $this->shouldHaveType(Controller::class);
105
    }
106
107
    function it_throws_a_403_exception_if_user_is_unauthorized_to_view_a_single_resource(
108
        MetadataInterface $metadata,
109
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
110
        RequestConfiguration $configuration,
111
        Request $request,
112
        AuthorizationCheckerInterface $authorizationChecker
113
    ): void {
114
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
115
        $configuration->hasPermission()->willReturn(true);
116
        $configuration->getPermission(ResourceActions::SHOW)->willReturn('sylius.product.show');
117
118
        $authorizationChecker->isGranted($configuration, 'sylius.product.show')->willReturn(false);
119
120
        $this
121
            ->shouldThrow(new AccessDeniedException())
122
            ->during('showAction', [$request])
123
        ;
124
    }
125
126
    function it_throws_a_404_exception_if_resource_is_not_found_based_on_configuration(
127
        MetadataInterface $metadata,
128
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
129
        RequestConfiguration $configuration,
130
        Request $request,
131
        AuthorizationCheckerInterface $authorizationChecker,
132
        RepositoryInterface $repository,
133
        SingleResourceProviderInterface $singleResourceProvider
134
    ): void {
135
        $metadata->getHumanizedName()->willReturn('product');
136
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
137
        $configuration->hasPermission()->willReturn(true);
138
        $configuration->getPermission(ResourceActions::SHOW)->willReturn('sylius.product.show');
139
140
        $authorizationChecker->isGranted($configuration, 'sylius.product.show')->willReturn(true);
141
        $singleResourceProvider->get($configuration, $repository)->willReturn(null);
142
143
        $this
144
            ->shouldThrow(new NotFoundHttpException('The "product" has not been found'))
145
            ->during('showAction', [$request])
146
        ;
147
    }
148
149
    function it_returns_a_response_for_html_view_of_a_single_resource(
150
        MetadataInterface $metadata,
151
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
152
        RequestConfiguration $configuration,
153
        AuthorizationCheckerInterface $authorizationChecker,
154
        RepositoryInterface $repository,
155
        SingleResourceProviderInterface $singleResourceProvider,
156
        ResourceInterface $resource,
157
        ViewHandlerInterface $viewHandler,
158
        EventDispatcherInterface $eventDispatcher,
159
        Request $request,
160
        Response $response
161
    ): void {
162
        $metadata->getApplicationName()->willReturn('sylius');
163
        $metadata->getName()->willReturn('product');
164
165
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
166
        $configuration->hasPermission()->willReturn(true);
167
        $configuration->getPermission(ResourceActions::SHOW)->willReturn('sylius.product.show');
168
169
        $authorizationChecker->isGranted($configuration, 'sylius.product.show')->willReturn(true);
170
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
171
172
        $configuration->isHtmlRequest()->willReturn(true);
173
        $configuration->getTemplate(ResourceActions::SHOW . '.html')->willReturn('SyliusShopBundle:Product:show.html.twig');
174
175
        $eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $resource)->shouldBeCalled();
176
177
        $expectedView = View::create()
178
            ->setData([
179
                'configuration' => $configuration,
180
                'metadata' => $metadata,
181
                'resource' => $resource,
182
                'product' => $resource,
183
            ])
184
            ->setTemplateVar('product')
185
            ->setTemplate('SyliusShopBundle:Product:show.html.twig')
186
        ;
187
188
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
189
190
        $this->showAction($request)->shouldReturn($response);
191
    }
192
193
    function it_returns_a_response_for_non_html_view_of_single_resource(
194
        MetadataInterface $metadata,
195
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
196
        RequestConfiguration $configuration,
197
        AuthorizationCheckerInterface $authorizationChecker,
198
        RepositoryInterface $repository,
199
        SingleResourceProviderInterface $singleResourceProvider,
200
        ResourceInterface $resource,
201
        ViewHandlerInterface $viewHandler,
202
        EventDispatcherInterface $eventDispatcher,
203
        Request $request,
204
        Response $response
205
    ): void {
206
        $metadata->getApplicationName()->willReturn('sylius');
207
        $metadata->getName()->willReturn('product');
208
209
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
210
        $configuration->hasPermission()->willReturn(true);
211
        $configuration->getPermission(ResourceActions::SHOW)->willReturn('sylius.product.show');
212
213
        $authorizationChecker->isGranted($configuration, 'sylius.product.show')->willReturn(true);
214
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
215
216
        $configuration->isHtmlRequest()->willReturn(false);
217
218
        $eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $resource)->shouldBeCalled();
219
220
        $expectedView = View::create($resource);
221
222
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
223
224
        $this->showAction($request)->shouldReturn($response);
225
    }
226
227
    function it_throws_a_403_exception_if_user_is_unauthorized_to_view_an_index_of_resources(
228
        MetadataInterface $metadata,
229
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
230
        RequestConfiguration $configuration,
231
        Request $request,
232
        AuthorizationCheckerInterface $authorizationChecker
233
    ): void {
234
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
235
        $configuration->hasPermission()->willReturn(true);
236
        $configuration->getPermission(ResourceActions::INDEX)->willReturn('sylius.product.index');
237
238
        $authorizationChecker->isGranted($configuration, 'sylius.product.index')->willReturn(false);
239
240
        $this
241
            ->shouldThrow(new AccessDeniedException())
242
            ->during('indexAction', [$request])
243
        ;
244
    }
245
246
    function it_returns_a_response_for_html_view_of_paginated_resources(
247
        MetadataInterface $metadata,
248
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
249
        RequestConfiguration $configuration,
250
        AuthorizationCheckerInterface $authorizationChecker,
251
        RepositoryInterface $repository,
252
        ResourcesCollectionProviderInterface $resourcesCollectionProvider,
253
        ResourceInterface $resource1,
254
        ResourceInterface $resource2,
255
        ViewHandlerInterface $viewHandler,
256
        Request $request,
257
        Response $response
258
    ): void {
259
        $metadata->getApplicationName()->willReturn('sylius');
260
        $metadata->getName()->willReturn('product');
261
        $metadata->getPluralName()->willReturn('products');
262
263
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
264
        $configuration->hasPermission()->willReturn(true);
265
        $configuration->getPermission(ResourceActions::INDEX)->willReturn('sylius.product.index');
266
267
        $authorizationChecker->isGranted($configuration, 'sylius.product.index')->willReturn(true);
268
269
        $configuration->isHtmlRequest()->willReturn(true);
270
        $configuration->getTemplate(ResourceActions::INDEX . '.html')->willReturn('SyliusShopBundle:Product:index.html.twig');
271
        $resourcesCollectionProvider->get($configuration, $repository)->willReturn([$resource1, $resource2]);
272
273
        $expectedView = View::create()
274
            ->setData([
275
                'configuration' => $configuration,
276
                'metadata' => $metadata,
277
                'resources' => [$resource1, $resource2],
278
                'products' => [$resource1, $resource2],
279
            ])
280
            ->setTemplateVar('products')
281
            ->setTemplate('SyliusShopBundle:Product:index.html.twig')
282
        ;
283
284
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
285
286
        $this->indexAction($request)->shouldReturn($response);
287
    }
288
289
    function it_throws_a_403_exception_if_user_is_unauthorized_to_create_a_new_resource(
290
        MetadataInterface $metadata,
291
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
292
        RequestConfiguration $configuration,
293
        Request $request,
294
        AuthorizationCheckerInterface $authorizationChecker
295
    ): void {
296
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
297
        $configuration->hasPermission()->willReturn(true);
298
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
299
300
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(false);
301
302
        $this
303
            ->shouldThrow(new AccessDeniedException())
304
            ->during('createAction', [$request])
305
        ;
306
    }
307
308
    function it_returns_a_html_response_for_creating_new_resource_form(
309
        MetadataInterface $metadata,
310
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
311
        RequestConfiguration $configuration,
312
        AuthorizationCheckerInterface $authorizationChecker,
313
        ViewHandlerInterface $viewHandler,
314
        FactoryInterface $factory,
315
        NewResourceFactoryInterface $newResourceFactory,
316
        ResourceInterface $newResource,
317
        ResourceFormFactoryInterface $resourceFormFactory,
318
        EventDispatcherInterface $eventDispatcher,
319
        ResourceControllerEvent $event,
320
        Form $form,
321
        FormView $formView,
322
        Request $request,
323
        Response $response
324
    ): void {
325
        $metadata->getApplicationName()->willReturn('sylius');
326
        $metadata->getName()->willReturn('product');
327
328
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
329
        $configuration->hasPermission()->willReturn(true);
330
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
331
332
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
333
334
        $configuration->isHtmlRequest()->willReturn(true);
335
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
336
337
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
338
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
339
340
        $eventDispatcher->dispatchInitializeEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
341
342
        $request->isMethod('POST')->willReturn(false);
343
        $form->createView()->willReturn($formView);
344
345
        $expectedView = View::create()
346
            ->setData([
347
                'configuration' => $configuration,
348
                'metadata' => $metadata,
349
                'resource' => $newResource,
350
                'product' => $newResource,
351
                'form' => $formView,
352
            ])
353
            ->setTemplate('SyliusShopBundle:Product:create.html.twig')
354
        ;
355
356
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
357
358
        $this->createAction($request)->shouldReturn($response);
359
    }
360
361
    function it_returns_a_html_response_for_invalid_form_during_resource_creation(
362
        MetadataInterface $metadata,
363
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
364
        RequestConfiguration $configuration,
365
        AuthorizationCheckerInterface $authorizationChecker,
366
        ViewHandlerInterface $viewHandler,
367
        FactoryInterface $factory,
368
        NewResourceFactoryInterface $newResourceFactory,
369
        ResourceInterface $newResource,
370
        ResourceFormFactoryInterface $resourceFormFactory,
371
        EventDispatcherInterface $eventDispatcher,
372
        ResourceControllerEvent $event,
373
        Form $form,
374
        FormView $formView,
375
        Request $request,
376
        Response $response
377
    ): void {
378
        $metadata->getApplicationName()->willReturn('sylius');
379
        $metadata->getName()->willReturn('product');
380
381
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
382
        $configuration->hasPermission()->willReturn(true);
383
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
384
385
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
386
387
        $configuration->isHtmlRequest()->willReturn(true);
388
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
389
390
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
391
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
392
393
        $eventDispatcher->dispatchInitializeEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
394
395
        $request->isMethod('POST')->willReturn(true);
396
        $form->handleRequest($request)->willReturn($form);
397
        $form->isValid()->willReturn(false);
398
        $form->createView()->willReturn($formView);
399
400
        $expectedView = View::create()
401
            ->setData([
402
                'configuration' => $configuration,
403
                'metadata' => $metadata,
404
                'resource' => $newResource,
405
                'product' => $newResource,
406
                'form' => $formView,
407
            ])
408
            ->setTemplate('SyliusShopBundle:Product:create.html.twig')
409
        ;
410
411
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
412
413
        $this->createAction($request)->shouldReturn($response);
414
    }
415
416
    function it_returns_a_non_html_response_for_invalid_form_during_resource_creation(
417
        MetadataInterface $metadata,
418
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
419
        RequestConfiguration $configuration,
420
        AuthorizationCheckerInterface $authorizationChecker,
421
        ViewHandlerInterface $viewHandler,
422
        FactoryInterface $factory,
423
        NewResourceFactoryInterface $newResourceFactory,
424
        ResourceInterface $newResource,
425
        ResourceFormFactoryInterface $resourceFormFactory,
426
        Form $form,
427
        Request $request,
428
        Response $response
429
    ): void {
430
        $metadata->getApplicationName()->willReturn('sylius');
431
        $metadata->getName()->willReturn('product');
432
433
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
434
        $configuration->hasPermission()->willReturn(true);
435
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
436
437
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
438
439
        $configuration->isHtmlRequest()->willReturn(false);
440
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
441
442
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
443
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
444
445
        $request->isMethod('POST')->willReturn(true);
446
        $form->handleRequest($request)->willReturn($form);
447
        $form->isValid()->willReturn(false);
448
449
        $expectedView = View::create($form, 400);
450
451
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
452
453
        $this->createAction($request)->shouldReturn($response);
454
    }
455
456
    function it_does_not_create_the_resource_and_redirects_to_index_for_html_requests_stopped_via_events(
457
        MetadataInterface $metadata,
458
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
459
        RequestConfiguration $configuration,
460
        AuthorizationCheckerInterface $authorizationChecker,
461
        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...
462
        FactoryInterface $factory,
463
        NewResourceFactoryInterface $newResourceFactory,
464
        RepositoryInterface $repository,
465
        ResourceInterface $newResource,
466
        ResourceFormFactoryInterface $resourceFormFactory,
467
        Form $form,
468
        RedirectHandlerInterface $redirectHandler,
469
        FlashHelperInterface $flashHelper,
470
        EventDispatcherInterface $eventDispatcher,
471
        ResourceControllerEvent $event,
472
        Request $request,
473
        Response $redirectResponse
474
    ): void {
475
        $metadata->getApplicationName()->willReturn('sylius');
476
        $metadata->getName()->willReturn('product');
477
478
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
479
        $configuration->hasPermission()->willReturn(true);
480
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
481
482
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
483
484
        $configuration->isHtmlRequest()->willReturn(true);
485
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
486
487
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
488
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
489
490
        $request->isMethod('POST')->willReturn(true);
491
        $form->handleRequest($request)->willReturn($form);
492
        $form->isValid()->willReturn(true);
493
        $form->getData()->willReturn($newResource);
494
495
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
496
        $event->isStopped()->willReturn(true);
497
498
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
499
500
        $repository->add($newResource)->shouldNotBeCalled();
501
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldNotBeCalled();
502
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
503
504
        $redirectHandler->redirectToIndex($configuration, $newResource)->willReturn($redirectResponse);
505
506
        $this->createAction($request)->shouldReturn($redirectResponse);
507
    }
508
509
    function it_redirects_to_newly_created_resource(
510
        MetadataInterface $metadata,
511
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
512
        RequestConfiguration $configuration,
513
        AuthorizationCheckerInterface $authorizationChecker,
514
        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...
515
        FactoryInterface $factory,
516
        NewResourceFactoryInterface $newResourceFactory,
517
        RepositoryInterface $repository,
518
        ResourceInterface $newResource,
519
        ResourceFormFactoryInterface $resourceFormFactory,
520
        StateMachineInterface $stateMachine,
521
        Form $form,
522
        RedirectHandlerInterface $redirectHandler,
523
        FlashHelperInterface $flashHelper,
524
        EventDispatcherInterface $eventDispatcher,
525
        ResourceControllerEvent $event,
526
        Request $request,
527
        Response $redirectResponse
528
    ): void {
529
        $metadata->getApplicationName()->willReturn('sylius');
530
        $metadata->getName()->willReturn('product');
531
532
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
533
        $configuration->hasPermission()->willReturn(true);
534
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
535
        $configuration->hasStateMachine()->willReturn(true);
536
537
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
538
539
        $configuration->isHtmlRequest()->willReturn(true);
540
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
541
542
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
543
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
544
545
        $request->isMethod('POST')->willReturn(true);
546
        $form->handleRequest($request)->willReturn($form);
547
        $form->isValid()->willReturn(true);
548
        $form->getData()->willReturn($newResource);
549
550
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
551
        $event->isStopped()->willReturn(false);
552
553
        $stateMachine->apply($configuration, $newResource)->shouldBeCalled();
554
555
        $repository->add($newResource)->shouldBeCalled();
556
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldBeCalled();
557
558
        $flashHelper->addSuccessFlash($configuration, ResourceActions::CREATE, $newResource)->shouldBeCalled();
559
        $redirectHandler->redirectToResource($configuration, $newResource)->willReturn($redirectResponse);
560
561
        $this->createAction($request)->shouldReturn($redirectResponse);
562
    }
563
564
    function it_returns_a_non_html_response_for_correctly_created_resources(
565
        MetadataInterface $metadata,
566
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
567
        RequestConfiguration $configuration,
568
        AuthorizationCheckerInterface $authorizationChecker,
569
        ViewHandlerInterface $viewHandler,
570
        FactoryInterface $factory,
571
        NewResourceFactoryInterface $newResourceFactory,
572
        RepositoryInterface $repository,
573
        ResourceInterface $newResource,
574
        ResourceFormFactoryInterface $resourceFormFactory,
575
        FlashHelperInterface $flashHelper,
576
        EventDispatcherInterface $eventDispatcher,
577
        ResourceControllerEvent $event,
578
        StateMachineInterface $stateMachine,
579
        Form $form,
580
        Request $request,
581
        Response $response
582
    ): void {
583
        $metadata->getApplicationName()->willReturn('sylius');
584
        $metadata->getName()->willReturn('product');
585
586
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
587
        $configuration->hasPermission()->willReturn(true);
588
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
589
        $configuration->hasStateMachine()->willReturn(true);
590
591
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
592
593
        $configuration->isHtmlRequest()->willReturn(false);
594
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
595
596
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
597
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
598
599
        $request->isMethod('POST')->willReturn(true);
600
        $form->handleRequest($request)->willReturn($form);
601
        $form->isValid()->willReturn(true);
602
        $form->getData()->willReturn($newResource);
603
604
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
605
        $event->isStopped()->willReturn(false);
606
607
        $stateMachine->apply($configuration, $newResource)->shouldBeCalled();
608
609
        $repository->add($newResource)->shouldBeCalled();
610
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldBeCalled();
611
612
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
613
614
        $expectedView = View::create($newResource, 201);
615
616
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
617
618
        $this->createAction($request)->shouldReturn($response);
619
    }
620
621
    function it_does_not_create_the_resource_and_throws_http_exception_for_non_html_requests_stopped_via_event(
622
        MetadataInterface $metadata,
623
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
624
        RequestConfiguration $configuration,
625
        AuthorizationCheckerInterface $authorizationChecker,
626
        FactoryInterface $factory,
627
        NewResourceFactoryInterface $newResourceFactory,
628
        RepositoryInterface $repository,
629
        ResourceInterface $newResource,
630
        ResourceFormFactoryInterface $resourceFormFactory,
631
        FlashHelperInterface $flashHelper,
632
        EventDispatcherInterface $eventDispatcher,
633
        Form $form,
634
        Request $request,
635
        ResourceControllerEvent $event
636
    ): void {
637
        $metadata->getApplicationName()->willReturn('sylius');
638
        $metadata->getName()->willReturn('product');
639
640
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
641
        $configuration->hasPermission()->willReturn(true);
642
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
643
644
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
645
646
        $configuration->isHtmlRequest()->willReturn(false);
647
        $configuration->getTemplate(ResourceActions::CREATE . '.html')->willReturn('SyliusShopBundle:Product:create.html.twig');
648
649
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
650
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
651
652
        $request->isMethod('POST')->willReturn(true);
653
        $form->handleRequest($request)->willReturn($form);
654
        $form->isValid()->willReturn(true);
655
        $form->getData()->willReturn($newResource);
656
657
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
658
        $event->isStopped()->willReturn(true);
659
        $event->getMessage()->willReturn('You cannot add a new product right now.');
660
        $event->getErrorCode()->willReturn(500);
661
662
        $repository->add($newResource)->shouldNotBeCalled();
663
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldNotBeCalled();
664
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
665
666
        $this
667
            ->shouldThrow(new HttpException(500, 'You cannot add a new product right now.'))
668
            ->during('createAction', [$request])
669
        ;
670
    }
671
672
    function it_throws_a_403_exception_if_user_is_unauthorized_to_edit_a_single_resource(
673
        MetadataInterface $metadata,
674
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
675
        RequestConfiguration $configuration,
676
        Request $request,
677
        AuthorizationCheckerInterface $authorizationChecker
678
    ): void {
679
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
680
        $configuration->hasPermission()->willReturn(true);
681
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
682
683
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(false);
684
685
        $this
686
            ->shouldThrow(new AccessDeniedException())
687
            ->during('updateAction', [$request])
688
        ;
689
    }
690
691
    function it_throws_a_404_exception_if_resource_to_update_is_not_found_based_on_configuration(
692
        MetadataInterface $metadata,
693
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
694
        RequestConfiguration $configuration,
695
        Request $request,
696
        AuthorizationCheckerInterface $authorizationChecker,
697
        RepositoryInterface $repository,
698
        SingleResourceProviderInterface $singleResourceProvider
699
    ): void {
700
        $metadata->getHumanizedName()->willReturn('product');
701
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
702
        $configuration->hasPermission()->willReturn(true);
703
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
704
705
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
706
        $singleResourceProvider->get($configuration, $repository)->willReturn(null);
707
708
        $this
709
            ->shouldThrow(new NotFoundHttpException('The "product" has not been found'))
710
            ->during('updateAction', [$request])
711
        ;
712
    }
713
714
    function it_returns_a_html_response_for_updating_resource_form(
715
        MetadataInterface $metadata,
716
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
717
        RequestConfiguration $configuration,
718
        AuthorizationCheckerInterface $authorizationChecker,
719
        ViewHandlerInterface $viewHandler,
720
        RepositoryInterface $repository,
721
        SingleResourceProviderInterface $singleResourceProvider,
722
        ResourceInterface $resource,
723
        ResourceFormFactoryInterface $resourceFormFactory,
724
        EventDispatcherInterface $eventDispatcher,
725
        ResourceControllerEvent $event,
726
        Form $form,
727
        FormView $formView,
728
        Request $request,
729
        Response $response
730
    ): void {
731
        $metadata->getApplicationName()->willReturn('sylius');
732
        $metadata->getName()->willReturn('product');
733
734
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
735
        $configuration->hasPermission()->willReturn(true);
736
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
737
        $configuration->hasStateMachine()->willReturn(false);
738
739
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
740
741
        $configuration->isHtmlRequest()->willReturn(true);
742
        $configuration->getTemplate(ResourceActions::UPDATE . '.html')->willReturn('SyliusShopBundle:Product:update.html.twig');
743
744
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
745
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
746
747
        $eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
748
749
        $request->isMethod('PATCH')->willReturn(false);
750
        $request->getMethod()->willReturn('GET');
751
752
        $form->handleRequest($request)->willReturn($form);
753
        $form->createView()->willReturn($formView);
754
755
        $expectedView = View::create()
756
            ->setData([
757
                'configuration' => $configuration,
758
                'metadata' => $metadata,
759
                'resource' => $resource,
760
                'product' => $resource,
761
                'form' => $formView,
762
            ])
763
            ->setTemplate('SyliusShopBundle:Product:update.html.twig')
764
        ;
765
766
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
767
768
        $this->updateAction($request)->shouldReturn($response);
769
    }
770
771
    function it_returns_a_html_response_for_invalid_form_during_resource_update(
772
        MetadataInterface $metadata,
773
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
774
        RequestConfiguration $configuration,
775
        AuthorizationCheckerInterface $authorizationChecker,
776
        ViewHandlerInterface $viewHandler,
777
        RepositoryInterface $repository,
778
        SingleResourceProviderInterface $singleResourceProvider,
779
        ResourceInterface $resource,
780
        ResourceFormFactoryInterface $resourceFormFactory,
781
        EventDispatcherInterface $eventDispatcher,
782
        ResourceControllerEvent $event,
783
        Form $form,
784
        FormView $formView,
785
        Request $request,
786
        Response $response
787
    ): void {
788
        $metadata->getApplicationName()->willReturn('sylius');
789
        $metadata->getName()->willReturn('product');
790
791
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
792
        $configuration->hasPermission()->willReturn(true);
793
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
794
795
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
796
797
        $configuration->isHtmlRequest()->willReturn(true);
798
        $configuration->getTemplate(ResourceActions::UPDATE . '.html')->willReturn('SyliusShopBundle:Product:update.html.twig');
799
800
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
801
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
802
803
        $eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
804
805
        $request->isMethod('PATCH')->willReturn(false);
806
        $request->getMethod()->willReturn('PUT');
807
808
        $form->handleRequest($request)->willReturn($form);
809
810
        $form->isValid()->willReturn(false);
811
        $form->createView()->willReturn($formView);
812
813
        $expectedView = View::create()
814
            ->setData([
815
                'configuration' => $configuration,
816
                'metadata' => $metadata,
817
                'resource' => $resource,
818
                'product' => $resource,
819
                'form' => $formView,
820
            ])
821
            ->setTemplate('SyliusShopBundle:Product:update.html.twig')
822
        ;
823
824
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
825
826
        $this->updateAction($request)->shouldReturn($response);
827
    }
828
829
    function it_returns_a_non_html_response_for_invalid_form_during_resource_update(
830
        MetadataInterface $metadata,
831
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
832
        RequestConfiguration $configuration,
833
        AuthorizationCheckerInterface $authorizationChecker,
834
        ViewHandlerInterface $viewHandler,
835
        RepositoryInterface $repository,
836
        SingleResourceProviderInterface $singleResourceProvider,
837
        ResourceInterface $resource,
838
        ResourceFormFactoryInterface $resourceFormFactory,
839
        Form $form,
840
        Request $request,
841
        Response $response
842
    ): void {
843
        $metadata->getApplicationName()->willReturn('sylius');
844
        $metadata->getName()->willReturn('product');
845
846
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
847
        $configuration->hasPermission()->willReturn(true);
848
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
849
        $configuration->isHtmlRequest()->willReturn(false);
850
851
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
852
853
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
854
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
855
856
        $request->isMethod('PATCH')->willReturn(true);
857
        $request->getMethod()->willReturn('PATCH');
858
859
        $form->handleRequest($request)->willReturn($form);
860
        $form->isValid()->willReturn(false);
861
862
        $expectedView = View::create($form, 400);
863
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
864
865
        $this->updateAction($request)->shouldReturn($response);
866
    }
867
868
    function it_does_not_update_the_resource_and_redirects_to_resource_for_html_request_if_stopped_via_event(
869
        MetadataInterface $metadata,
870
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
871
        RequestConfiguration $configuration,
872
        AuthorizationCheckerInterface $authorizationChecker,
873
        ObjectManager $manager,
874
        RepositoryInterface $repository,
875
        SingleResourceProviderInterface $singleResourceProvider,
876
        ResourceInterface $resource,
877
        ResourceFormFactoryInterface $resourceFormFactory,
878
        Form $form,
879
        EventDispatcherInterface $eventDispatcher,
880
        RedirectHandlerInterface $redirectHandler,
881
        FlashHelperInterface $flashHelper,
882
        ResourceControllerEvent $event,
883
        Request $request,
884
        Response $redirectResponse
885
    ): void {
886
        $metadata->getApplicationName()->willReturn('sylius');
887
        $metadata->getName()->willReturn('product');
888
889
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
890
        $configuration->hasPermission()->willReturn(true);
891
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
892
893
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
894
895
        $configuration->isHtmlRequest()->willReturn(true);
896
897
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
898
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
899
900
        $request->isMethod('PATCH')->willReturn(false);
901
        $request->getMethod()->willReturn('PUT');
902
903
        $form->handleRequest($request)->willReturn($form);
904
905
        $form->isSubmitted()->willReturn(true);
906
        $form->isValid()->willReturn(true);
907
        $form->getData()->willReturn($resource);
908
909
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
910
        $event->isStopped()->willReturn(true);
911
        $event->hasResponse()->willReturn(false);
912
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
913
914
        $manager->flush()->shouldNotBeCalled();
915
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
916
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
917
918
        $redirectHandler->redirectToResource($configuration, $resource)->willReturn($redirectResponse);
919
920
        $this->updateAction($request)->shouldReturn($redirectResponse);
921
    }
922
923
    function it_redirects_to_updated_resource(
924
        MetadataInterface $metadata,
925
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
926
        RepositoryInterface $repository,
927
        ObjectManager $manager,
928
        SingleResourceProviderInterface $singleResourceProvider,
929
        ResourceFormFactoryInterface $resourceFormFactory,
930
        RedirectHandlerInterface $redirectHandler,
931
        FlashHelperInterface $flashHelper,
932
        AuthorizationCheckerInterface $authorizationChecker,
933
        EventDispatcherInterface $eventDispatcher,
934
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
935
        RequestConfiguration $configuration,
936
        ResourceInterface $resource,
937
        Form $form,
938
        ResourceControllerEvent $preEvent,
939
        ResourceControllerEvent $postEvent,
940
        Request $request,
941
        Response $redirectResponse
942
    ): void {
943
        $metadata->getApplicationName()->willReturn('sylius');
944
        $metadata->getName()->willReturn('product');
945
946
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
947
        $configuration->hasPermission()->willReturn(true);
948
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
949
        $configuration->hasStateMachine()->willReturn(false);
950
951
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
952
953
        $configuration->isHtmlRequest()->willReturn(true);
954
        $configuration->getTemplate(ResourceActions::UPDATE . '.html')->willReturn('SyliusShopBundle:Product:update.html.twig');
955
956
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
957
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
958
959
        $request->isMethod('PATCH')->willReturn(false);
960
        $request->getMethod()->willReturn('PUT');
961
962
        $form->handleRequest($request)->willReturn($form);
963
964
        $form->isSubmitted()->willReturn(true);
965
        $form->isValid()->willReturn(true);
966
        $form->getData()->willReturn($resource);
967
968
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($preEvent);
969
        $preEvent->isStopped()->willReturn(false);
970
971
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
972
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($postEvent);
973
974
        $postEvent->hasResponse()->willReturn(false);
975
976
        $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldBeCalled();
977
        $redirectHandler->redirectToResource($configuration, $resource)->willReturn($redirectResponse);
978
979
        $this->updateAction($request)->shouldReturn($redirectResponse);
980
    }
981
982
    function it_uses_response_from_post_event_if_defined(
983
        MetadataInterface $metadata,
984
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
985
        RepositoryInterface $repository,
986
        ObjectManager $manager,
987
        SingleResourceProviderInterface $singleResourceProvider,
988
        ResourceFormFactoryInterface $resourceFormFactory,
989
        RedirectHandlerInterface $redirectHandler,
990
        FlashHelperInterface $flashHelper,
991
        AuthorizationCheckerInterface $authorizationChecker,
992
        EventDispatcherInterface $eventDispatcher,
993
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
994
        RequestConfiguration $configuration,
995
        ResourceInterface $resource,
996
        Form $form,
997
        ResourceControllerEvent $preEvent,
998
        ResourceControllerEvent $postEvent,
999
        Request $request,
1000
        Response $redirectResponse
1001
    ): void {
1002
        $metadata->getApplicationName()->willReturn('sylius');
1003
        $metadata->getName()->willReturn('product');
1004
1005
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1006
        $configuration->hasPermission()->willReturn(true);
1007
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1008
        $configuration->hasStateMachine()->willReturn(false);
1009
1010
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1011
1012
        $configuration->isHtmlRequest()->willReturn(true);
1013
        $configuration->getTemplate(ResourceActions::UPDATE . '.html')->willReturn('SyliusShopBundle:Product:update.html.twig');
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($preEvent);
1028
        $preEvent->isStopped()->willReturn(false);
1029
1030
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
1031
        $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldBeCalled();
1032
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($postEvent);
1033
1034
        $postEvent->hasResponse()->willReturn(true);
1035
        $postEvent->getResponse()->willReturn($redirectResponse);
1036
1037
        $redirectHandler->redirectToResource($configuration, $resource)->shouldNotBeCalled();
1038
1039
        $this->updateAction($request)->shouldReturn($redirectResponse);
1040
    }
1041
1042
    function it_returns_a_non_html_response_for_correctly_updated_resource(
1043
        MetadataInterface $metadata,
1044
        ParameterBagInterface $parameterBag,
1045
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1046
        ViewHandlerInterface $viewHandler,
1047
        RepositoryInterface $repository,
1048
        ObjectManager $manager,
1049
        SingleResourceProviderInterface $singleResourceProvider,
1050
        ResourceFormFactoryInterface $resourceFormFactory,
1051
        AuthorizationCheckerInterface $authorizationChecker,
1052
        EventDispatcherInterface $eventDispatcher,
1053
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
1054
        RequestConfiguration $configuration,
1055
        ResourceInterface $resource,
1056
        ResourceControllerEvent $event,
1057
        Form $form,
1058
        Request $request,
1059
        Response $response
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->isHtmlRequest()->willReturn(false);
1068
        $configuration->hasStateMachine()->willReturn(false);
1069
1070
        $configuration->getParameters()->willReturn($parameterBag);
1071
        $parameterBag->get('return_content', false)->willReturn(false);
1072
1073
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1074
1075
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1076
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
1077
1078
        $request->isMethod('PATCH')->willReturn(false);
1079
        $request->getMethod()->willReturn('PUT');
1080
1081
        $form->handleRequest($request)->willReturn($form);
1082
        $form->isValid()->willReturn(true);
1083
        $form->getData()->willReturn($resource);
1084
1085
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1086
        $event->isStopped()->willReturn(false);
1087
1088
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
1089
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldBeCalled();
1090
1091
        $expectedView = View::create(null, 204);
1092
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
1093
1094
        $this->updateAction($request)->shouldReturn($response);
1095
    }
1096
1097
    function it_does_not_update_the_resource_throws_a_http_exception_for_non_html_requests_stopped_via_event(
1098
        MetadataInterface $metadata,
1099
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1100
        RequestConfiguration $configuration,
1101
        AuthorizationCheckerInterface $authorizationChecker,
1102
        ObjectManager $manager,
1103
        RepositoryInterface $repository,
1104
        SingleResourceProviderInterface $singleResourceProvider,
1105
        ResourceInterface $resource,
1106
        ResourceFormFactoryInterface $resourceFormFactory,
1107
        EventDispatcherInterface $eventDispatcher,
1108
        ResourceControllerEvent $event,
1109
        Form $form,
1110
        Request $request
1111
    ): void {
1112
        $metadata->getApplicationName()->willReturn('sylius');
1113
        $metadata->getName()->willReturn('product');
1114
1115
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1116
        $configuration->hasPermission()->willReturn(true);
1117
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1118
        $configuration->isHtmlRequest()->willReturn(false);
1119
1120
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1121
1122
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1123
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
1124
1125
        $request->isMethod('PATCH')->willReturn(false);
1126
        $request->getMethod()->willReturn('PUT');
1127
1128
        $form->handleRequest($request)->willReturn($form);
1129
        $form->isValid()->willReturn(true);
1130
        $form->getData()->willReturn($resource);
1131
1132
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1133
        $event->isStopped()->willReturn(true);
1134
        $event->getMessage()->willReturn('Cannot update this channel.');
1135
        $event->getErrorCode()->willReturn(500);
1136
1137
        $manager->flush()->shouldNotBeCalled();
1138
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
1139
1140
        $this
1141
            ->shouldThrow(new HttpException(500, 'Cannot update this channel.'))
1142
            ->during('updateAction', [$request])
1143
        ;
1144
    }
1145
1146
    function it_applies_state_machine_transition_to_updated_resource_if_configured(
1147
        MetadataInterface $metadata,
1148
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1149
        RepositoryInterface $repository,
1150
        ObjectManager $manager,
1151
        SingleResourceProviderInterface $singleResourceProvider,
1152
        ResourceFormFactoryInterface $resourceFormFactory,
1153
        RedirectHandlerInterface $redirectHandler,
1154
        FlashHelperInterface $flashHelper,
1155
        AuthorizationCheckerInterface $authorizationChecker,
1156
        EventDispatcherInterface $eventDispatcher,
1157
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
1158
        RequestConfiguration $configuration,
1159
        ResourceInterface $resource,
1160
        Form $form,
1161
        ResourceControllerEvent $preEvent,
1162
        ResourceControllerEvent $postEvent,
1163
        Request $request,
1164
        Response $redirectResponse
1165
    ): void {
1166
        $metadata->getApplicationName()->willReturn('sylius');
1167
        $metadata->getName()->willReturn('product');
1168
1169
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1170
        $configuration->hasPermission()->willReturn(true);
1171
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1172
        $configuration->hasStateMachine()->willReturn(true);
1173
1174
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1175
1176
        $configuration->isHtmlRequest()->willReturn(true);
1177
        $configuration->getTemplate(ResourceActions::UPDATE)->willReturn('SyliusShopBundle:Product:update.html.twig');
1178
1179
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1180
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
1181
1182
        $request->isMethod('PATCH')->willReturn(false);
1183
        $request->getMethod()->willReturn('PUT');
1184
1185
        $form->handleRequest($request)->willReturn($form);
1186
1187
        $form->isSubmitted()->willReturn(true);
1188
        $form->isValid()->willReturn(true);
1189
        $form->getData()->willReturn($resource);
1190
1191
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($preEvent);
1192
        $preEvent->isStopped()->willReturn(false);
1193
1194
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
1195
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($postEvent);
1196
1197
        $postEvent->hasResponse()->willReturn(false);
1198
1199
        $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldBeCalled();
1200
        $redirectHandler->redirectToResource($configuration, $resource)->willReturn($redirectResponse);
1201
1202
        $this->updateAction($request)->shouldReturn($redirectResponse);
1203
    }
1204
1205
    function it_throws_a_403_exception_if_user_is_unauthorized_to_delete_a_single_resource(
1206
        MetadataInterface $metadata,
1207
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1208
        RequestConfiguration $configuration,
1209
        Request $request,
1210
        AuthorizationCheckerInterface $authorizationChecker
1211
    ): void {
1212
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1213
        $configuration->hasPermission()->willReturn(true);
1214
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1215
1216
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(false);
1217
1218
        $this
1219
            ->shouldThrow(new AccessDeniedException())
1220
            ->during('deleteAction', [$request])
1221
        ;
1222
    }
1223
1224
    function it_throws_a_404_exception_if_resource_for_deletion_is_not_found_based_on_configuration(
1225
        MetadataInterface $metadata,
1226
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1227
        RequestConfiguration $configuration,
1228
        Request $request,
1229
        AuthorizationCheckerInterface $authorizationChecker,
1230
        RepositoryInterface $repository,
1231
        SingleResourceProviderInterface $singleResourceProvider
1232
    ): void {
1233
        $metadata->getHumanizedName()->willReturn('product');
1234
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1235
        $configuration->hasPermission()->willReturn(true);
1236
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1237
1238
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1239
        $singleResourceProvider->get($configuration, $repository)->willReturn(null);
1240
1241
        $this
1242
            ->shouldThrow(new NotFoundHttpException('The "product" has not been found'))
1243
            ->during('deleteAction', [$request])
1244
        ;
1245
    }
1246
1247
    function it_deletes_a_resource_and_redirects_to_index_by_for_html_request(
1248
        MetadataInterface $metadata,
1249
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1250
        RequestConfiguration $configuration,
1251
        AuthorizationCheckerInterface $authorizationChecker,
1252
        RepositoryInterface $repository,
1253
        SingleResourceProviderInterface $singleResourceProvider,
1254
        ResourceInterface $resource,
1255
        RedirectHandlerInterface $redirectHandler,
1256
        FlashHelperInterface $flashHelper,
1257
        EventDispatcherInterface $eventDispatcher,
1258
        CsrfTokenManagerInterface $csrfTokenManager,
1259
        ContainerInterface $container,
1260
        ResourceControllerEvent $event,
1261
        Request $request,
1262
        Response $redirectResponse
1263
    ): void {
1264
        $metadata->getApplicationName()->willReturn('sylius');
1265
        $metadata->getName()->willReturn('product');
1266
1267
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1268
        $configuration->hasPermission()->willReturn(true);
1269
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1270
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1271
1272
        $container->has('security.csrf.token_manager')->willReturn(true);
1273
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1274
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(true);
1275
1276
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1277
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1278
        $resource->getId()->willReturn(1);
1279
1280
        $configuration->isHtmlRequest()->willReturn(true);
1281
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1282
1283
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1284
        $event->isStopped()->willReturn(false);
1285
1286
        $repository->remove($resource)->shouldBeCalled();
1287
        $eventDispatcher->dispatchPostEvent(ResourceActions::DELETE, $configuration, $resource)->shouldBeCalled();
1288
1289
        $flashHelper->addSuccessFlash($configuration, ResourceActions::DELETE, $resource)->shouldBeCalled();
1290
        $redirectHandler->redirectToIndex($configuration, $resource)->willReturn($redirectResponse);
1291
1292
        $this->deleteAction($request)->shouldReturn($redirectResponse);
1293
    }
1294
1295
    function it_does_not_delete_a_resource_and_redirects_to_index_for_html_requests_stopped_via_event(
1296
        MetadataInterface $metadata,
1297
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1298
        RequestConfiguration $configuration,
1299
        AuthorizationCheckerInterface $authorizationChecker,
1300
        RepositoryInterface $repository,
1301
        SingleResourceProviderInterface $singleResourceProvider,
1302
        ResourceInterface $resource,
1303
        RedirectHandlerInterface $redirectHandler,
1304
        FlashHelperInterface $flashHelper,
1305
        EventDispatcherInterface $eventDispatcher,
1306
        CsrfTokenManagerInterface $csrfTokenManager,
1307
        ContainerInterface $container,
1308
        ResourceControllerEvent $event,
1309
        Request $request,
1310
        Response $redirectResponse
1311
    ): void {
1312
        $metadata->getApplicationName()->willReturn('sylius');
1313
        $metadata->getName()->willReturn('product');
1314
1315
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1316
        $configuration->hasPermission()->willReturn(true);
1317
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1318
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1319
1320
        $container->has('security.csrf.token_manager')->willReturn(true);
1321
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1322
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(true);
1323
1324
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1325
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1326
        $resource->getId()->willReturn(1);
1327
1328
        $configuration->isHtmlRequest()->willReturn(true);
1329
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1330
1331
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1332
        $event->isStopped()->willReturn(true);
1333
        $event->hasResponse()->willReturn(false);
1334
1335
        $repository->remove($resource)->shouldNotBeCalled();
1336
        $eventDispatcher->dispatchPostEvent(ResourceActions::DELETE, $configuration, $resource)->shouldNotBeCalled();
1337
        $flashHelper->addSuccessFlash($configuration, ResourceActions::DELETE, $resource)->shouldNotBeCalled();
1338
1339
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
1340
        $redirectHandler->redirectToIndex($configuration, $resource)->willReturn($redirectResponse);
1341
1342
        $this->deleteAction($request)->shouldReturn($redirectResponse);
1343
    }
1344
1345
    function it_does_not_delete_a_resource_and_uses_response_from_event_if_defined(
1346
        MetadataInterface $metadata,
1347
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1348
        RequestConfiguration $configuration,
1349
        AuthorizationCheckerInterface $authorizationChecker,
1350
        RepositoryInterface $repository,
1351
        SingleResourceProviderInterface $singleResourceProvider,
1352
        ResourceInterface $resource,
1353
        RedirectHandlerInterface $redirectHandler,
1354
        FlashHelperInterface $flashHelper,
1355
        EventDispatcherInterface $eventDispatcher,
1356
        CsrfTokenManagerInterface $csrfTokenManager,
1357
        ContainerInterface $container,
1358
        ResourceControllerEvent $event,
1359
        Request $request,
1360
        Response $redirectResponse
1361
    ): void {
1362
        $metadata->getApplicationName()->willReturn('sylius');
1363
        $metadata->getName()->willReturn('product');
1364
1365
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1366
        $configuration->hasPermission()->willReturn(true);
1367
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1368
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1369
1370
        $container->has('security.csrf.token_manager')->willReturn(true);
1371
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1372
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(true);
1373
1374
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1375
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1376
        $resource->getId()->willReturn(1);
1377
1378
        $configuration->isHtmlRequest()->willReturn(true);
1379
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1380
1381
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1382
        $event->isStopped()->willReturn(true);
1383
1384
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
1385
1386
        $event->hasResponse()->willReturn(true);
1387
        $event->getResponse()->willReturn($redirectResponse);
1388
1389
        $repository->remove($resource)->shouldNotBeCalled();
1390
        $eventDispatcher->dispatchPostEvent(ResourceActions::DELETE, $configuration, $resource)->shouldNotBeCalled();
1391
        $flashHelper->addSuccessFlash($configuration, ResourceActions::DELETE, $resource)->shouldNotBeCalled();
1392
1393
        $redirectHandler->redirectToIndex($configuration, $resource)->shouldNotBeCalled();
1394
1395
        $this->deleteAction($request)->shouldReturn($redirectResponse);
1396
    }
1397
1398
    function it_deletes_a_resource_and_returns_204_for_non_html_requests(
1399
        MetadataInterface $metadata,
1400
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1401
        RequestConfiguration $configuration,
1402
        AuthorizationCheckerInterface $authorizationChecker,
1403
        ViewHandlerInterface $viewHandler,
1404
        RepositoryInterface $repository,
1405
        SingleResourceProviderInterface $singleResourceProvider,
1406
        ResourceInterface $resource,
1407
        EventDispatcherInterface $eventDispatcher,
1408
        CsrfTokenManagerInterface $csrfTokenManager,
1409
        ContainerInterface $container,
1410
        ResourceControllerEvent $event,
1411
        Request $request,
1412
        Response $response
1413
    ): void {
1414
        $metadata->getApplicationName()->willReturn('sylius');
1415
        $metadata->getName()->willReturn('product');
1416
1417
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1418
        $configuration->hasPermission()->willReturn(true);
1419
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1420
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1421
1422
        $container->has('security.csrf.token_manager')->willReturn(true);
1423
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1424
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(true);
1425
1426
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1427
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1428
        $resource->getId()->willReturn(1);
1429
1430
        $configuration->isHtmlRequest()->willReturn(false);
1431
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1432
1433
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1434
        $event->isStopped()->willReturn(false);
1435
1436
        $repository->remove($resource)->shouldBeCalled();
1437
        $eventDispatcher->dispatchPostEvent(ResourceActions::DELETE, $configuration, $resource)->shouldBeCalled();
1438
1439
        $expectedView = View::create(null, 204);
1440
1441
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
1442
1443
        $this->deleteAction($request)->shouldReturn($response);
1444
    }
1445
1446
    function it_does_not_delete_a_resource_and_throws_http_exception_for_non_html_requests_stopped_via_event(
1447
        MetadataInterface $metadata,
1448
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1449
        RequestConfiguration $configuration,
1450
        AuthorizationCheckerInterface $authorizationChecker,
1451
        RepositoryInterface $repository,
1452
        SingleResourceProviderInterface $singleResourceProvider,
1453
        ResourceInterface $resource,
1454
        FlashHelperInterface $flashHelper,
1455
        EventDispatcherInterface $eventDispatcher,
1456
        CsrfTokenManagerInterface $csrfTokenManager,
1457
        ContainerInterface $container,
1458
        ResourceControllerEvent $event,
1459
        Request $request
1460
    ): void {
1461
        $metadata->getApplicationName()->willReturn('sylius');
1462
        $metadata->getName()->willReturn('product');
1463
1464
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1465
        $configuration->hasPermission()->willReturn(true);
1466
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1467
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1468
1469
        $container->has('security.csrf.token_manager')->willReturn(true);
1470
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1471
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(true);
1472
1473
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1474
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1475
        $resource->getId()->willReturn(1);
1476
1477
        $configuration->isHtmlRequest()->willReturn(false);
1478
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1479
1480
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1481
        $event->isStopped()->willReturn(true);
1482
        $event->getMessage()->willReturn('Cannot delete this product.');
1483
        $event->getErrorCode()->willReturn(500);
1484
1485
        $repository->remove($resource)->shouldNotBeCalled();
1486
1487
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
1488
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
1489
        $flashHelper->addFlashFromEvent(Argument::any())->shouldNotBeCalled();
1490
1491
        $this
1492
            ->shouldThrow(new HttpException(500, 'Cannot delete this product.'))
1493
            ->during('deleteAction', [$request])
1494
        ;
1495
    }
1496
1497
    function it_throws_a_403_exception_if_csrf_token_is_invalid_during_delete_action(
1498
        MetadataInterface $metadata,
1499
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1500
        RequestConfiguration $configuration,
1501
        AuthorizationCheckerInterface $authorizationChecker,
1502
        RepositoryInterface $repository,
1503
        SingleResourceProviderInterface $singleResourceProvider,
1504
        ResourceInterface $resource,
1505
        FlashHelperInterface $flashHelper,
1506
        EventDispatcherInterface $eventDispatcher,
1507
        CsrfTokenManagerInterface $csrfTokenManager,
1508
        ContainerInterface $container,
1509
        ResourceControllerEvent $event,
1510
        Request $request
1511
    ): void {
1512
        $metadata->getApplicationName()->willReturn('sylius');
1513
        $metadata->getName()->willReturn('product');
1514
1515
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1516
        $configuration->hasPermission()->willReturn(true);
1517
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1518
        $request->request = new ParameterBag(['_csrf_token' => 'xyz']);
1519
1520
        $container->has('security.csrf.token_manager')->willReturn(true);
1521
        $container->get('security.csrf.token_manager')->willReturn($csrfTokenManager);
1522
        $csrfTokenManager->isTokenValid(new CsrfToken(1, 'xyz'))->willReturn(false);
1523
1524
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1525
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1526
        $resource->getId()->willReturn(1);
1527
1528
        $configuration->isHtmlRequest()->willReturn(true);
1529
        $configuration->isCsrfProtectionEnabled()->willReturn(true);
1530
1531
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1532
        $event->isStopped()->shouldNotBeCalled();
1533
1534
        $repository->remove($resource)->shouldNotBeCalled();
1535
1536
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
1537
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
1538
        $flashHelper->addFlashFromEvent(Argument::any())->shouldNotBeCalled();
1539
1540
        $this
1541
            ->shouldThrow(new HttpException(403, 'Invalid csrf token.'))
1542
            ->during('deleteAction', [$request])
1543
        ;
1544
    }
1545
1546
    function it_throws_a_403_exception_if_user_is_unauthorized_to_apply_state_machine_transition_on_resource(
1547
        MetadataInterface $metadata,
1548
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1549
        RequestConfiguration $configuration,
1550
        Request $request,
1551
        AuthorizationCheckerInterface $authorizationChecker
1552
    ): void {
1553
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1554
        $configuration->hasPermission()->willReturn(true);
1555
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1556
1557
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(false);
1558
1559
        $this
1560
            ->shouldThrow(new AccessDeniedException())
1561
            ->during('applyStateMachineTransitionAction', [$request])
1562
        ;
1563
    }
1564
1565
    function it_throws_a_404_exception_if_resource_is_not_found_when_trying_to_apply_state_machine_transition(
1566
        MetadataInterface $metadata,
1567
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1568
        RequestConfiguration $configuration,
1569
        Request $request,
1570
        AuthorizationCheckerInterface $authorizationChecker,
1571
        RepositoryInterface $repository,
1572
        SingleResourceProviderInterface $singleResourceProvider
1573
    ): void {
1574
        $metadata->getHumanizedName()->willReturn('product');
1575
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1576
        $configuration->hasPermission()->willReturn(true);
1577
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1578
1579
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1580
        $singleResourceProvider->get($configuration, $repository)->willReturn(null);
1581
1582
        $this
1583
            ->shouldThrow(new NotFoundHttpException('The "product" has not been found'))
1584
            ->during('applyStateMachineTransitionAction', [$request])
1585
        ;
1586
    }
1587
1588
    function it_does_not_apply_state_machine_transition_on_resource_if_not_applicable_and_returns_400_bad_request(
1589
        MetadataInterface $metadata,
1590
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1591
        RequestConfiguration $configuration,
1592
        AuthorizationCheckerInterface $authorizationChecker,
1593
        RepositoryInterface $repository,
1594
        ObjectManager $objectManager,
1595
        StateMachineInterface $stateMachine,
1596
        SingleResourceProviderInterface $singleResourceProvider,
1597
        ResourceInterface $resource,
1598
        FlashHelperInterface $flashHelper,
1599
        EventDispatcherInterface $eventDispatcher,
1600
        ResourceControllerEvent $event,
1601
        Request $request
1602
    ): void {
1603
        $metadata->getApplicationName()->willReturn('sylius');
1604
        $metadata->getName()->willReturn('product');
1605
1606
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1607
        $configuration->hasPermission()->willReturn(true);
1608
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1609
1610
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1611
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1612
1613
        $configuration->isHtmlRequest()->willReturn(true);
1614
1615
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1616
        $event->isStopped()->willReturn(false);
1617
1618
        $stateMachine->can($configuration, $resource)->willReturn(false);
1619
1620
        $stateMachine->apply($configuration, $resource)->shouldNotBeCalled();
1621
        $objectManager->flush()->shouldNotBeCalled();
1622
1623
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
1624
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
1625
        $flashHelper->addFlashFromEvent(Argument::any())->shouldNotBeCalled();
1626
1627
        $this
1628
            ->shouldThrow(new BadRequestHttpException())
1629
            ->during('applyStateMachineTransitionAction', [$request])
1630
        ;
1631
    }
1632
1633
    function it_applies_state_machine_transition_to_resource_and_redirects_for_html_request(
1634
        MetadataInterface $metadata,
1635
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1636
        RepositoryInterface $repository,
1637
        ObjectManager $manager,
1638
        SingleResourceProviderInterface $singleResourceProvider,
1639
        RedirectHandlerInterface $redirectHandler,
1640
        FlashHelperInterface $flashHelper,
1641
        AuthorizationCheckerInterface $authorizationChecker,
1642
        EventDispatcherInterface $eventDispatcher,
1643
        StateMachineInterface $stateMachine,
1644
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
1645
        RequestConfiguration $configuration,
1646
        ResourceInterface $resource,
1647
        ResourceControllerEvent $event,
1648
        Request $request,
1649
        Response $redirectResponse
1650
    ): void {
1651
        $metadata->getApplicationName()->willReturn('sylius');
1652
        $metadata->getName()->willReturn('product');
1653
1654
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1655
        $configuration->hasPermission()->willReturn(true);
1656
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1657
1658
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1659
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1660
1661
        $configuration->isHtmlRequest()->willReturn(true);
1662
1663
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1664
        $event->isStopped()->willReturn(false);
1665
1666
        $stateMachine->can($configuration, $resource)->willReturn(true);
1667
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
1668
1669
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldBeCalled();
1670
1671
        $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldBeCalled();
1672
        $redirectHandler->redirectToResource($configuration, $resource)->willReturn($redirectResponse);
1673
1674
        $this->applyStateMachineTransitionAction($request)->shouldReturn($redirectResponse);
1675
    }
1676
1677
    function it_does_not_apply_state_machine_transition_on_resource_and_redirects_for_html_requests_stopped_via_event(
1678
        MetadataInterface $metadata,
1679
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1680
        RequestConfiguration $configuration,
1681
        AuthorizationCheckerInterface $authorizationChecker,
1682
        StateMachineInterface $stateMachine,
1683
        ObjectManager $manager,
1684
        RepositoryInterface $repository,
1685
        SingleResourceProviderInterface $singleResourceProvider,
1686
        ResourceInterface $resource,
1687
        RedirectHandlerInterface $redirectHandler,
1688
        FlashHelperInterface $flashHelper,
1689
        EventDispatcherInterface $eventDispatcher,
1690
        ResourceControllerEvent $event,
1691
        Request $request,
1692
        Response $redirectResponse
1693
    ): void {
1694
        $metadata->getApplicationName()->willReturn('sylius');
1695
        $metadata->getName()->willReturn('product');
1696
1697
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1698
        $configuration->hasPermission()->willReturn(true);
1699
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1700
1701
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1702
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1703
1704
        $configuration->isHtmlRequest()->willReturn(true);
1705
1706
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1707
        $event->isStopped()->willReturn(true);
1708
1709
        $manager->flush()->shouldNotBeCalled();
1710
        $stateMachine->apply($resource)->shouldNotBeCalled();
1711
1712
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldNotBeCalled();
1713
        $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldNotBeCalled();
1714
1715
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
1716
        $redirectHandler->redirectToResource($configuration, $resource)->willReturn($redirectResponse);
1717
1718
        $this->applyStateMachineTransitionAction($request)->shouldReturn($redirectResponse);
1719
    }
1720
1721
    function it_applies_state_machine_transition_on_resource_and_returns_200_for_non_html_requests(
1722
        MetadataInterface $metadata,
1723
        ParameterBagInterface $parameterBag,
1724
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1725
        ViewHandlerInterface $viewHandler,
1726
        RepositoryInterface $repository,
1727
        ObjectManager $manager,
1728
        SingleResourceProviderInterface $singleResourceProvider,
1729
        AuthorizationCheckerInterface $authorizationChecker,
1730
        EventDispatcherInterface $eventDispatcher,
1731
        StateMachineInterface $stateMachine,
1732
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
1733
        RequestConfiguration $configuration,
1734
        ResourceInterface $resource,
1735
        ResourceControllerEvent $event,
1736
        Request $request,
1737
        Response $response
1738
    ): void {
1739
        $metadata->getApplicationName()->willReturn('sylius');
1740
        $metadata->getName()->willReturn('product');
1741
1742
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1743
        $configuration->getParameters()->willReturn($parameterBag);
1744
        $configuration->hasPermission()->willReturn(true);
1745
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1746
1747
        $parameterBag->get('return_content', true)->willReturn(true);
1748
1749
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1750
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1751
1752
        $configuration->isHtmlRequest()->willReturn(false);
1753
1754
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1755
        $event->isStopped()->willReturn(false);
1756
1757
        $stateMachine->can($configuration, $resource)->willReturn(true);
1758
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
1759
1760
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldBeCalled();
1761
1762
        $expectedView = View::create($resource, 200);
1763
1764
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
1765
1766
        $this->applyStateMachineTransitionAction($request)->shouldReturn($response);
1767
    }
1768
1769
    function it_applies_state_machine_transition_on_resource_and_returns_204_for_non_html_requests_if_additional_option_added(
1770
        MetadataInterface $metadata,
1771
        ParameterBagInterface $parameterBag,
1772
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1773
        ViewHandlerInterface $viewHandler,
1774
        RepositoryInterface $repository,
1775
        ObjectManager $manager,
1776
        SingleResourceProviderInterface $singleResourceProvider,
1777
        AuthorizationCheckerInterface $authorizationChecker,
1778
        EventDispatcherInterface $eventDispatcher,
1779
        StateMachineInterface $stateMachine,
1780
        ResourceUpdateHandlerInterface $resourceUpdateHandler,
1781
        RequestConfiguration $configuration,
1782
        ResourceInterface $resource,
1783
        ResourceControllerEvent $event,
1784
        Request $request,
1785
        Response $response
1786
    ): void {
1787
        $metadata->getApplicationName()->willReturn('sylius');
1788
        $metadata->getName()->willReturn('product');
1789
1790
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1791
        $configuration->getParameters()->willReturn($parameterBag);
1792
        $configuration->hasPermission()->willReturn(true);
1793
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1794
1795
        $parameterBag->get('return_content', true)->willReturn(false);
1796
1797
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1798
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1799
1800
        $configuration->isHtmlRequest()->willReturn(false);
1801
1802
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1803
        $event->isStopped()->willReturn(false);
1804
1805
        $stateMachine->can($configuration, $resource)->willReturn(true);
1806
        $resourceUpdateHandler->handle($resource, $configuration, $manager)->shouldBeCalled();
1807
1808
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldBeCalled();
1809
1810
        $expectedView = View::create(null, 204);
1811
1812
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
1813
1814
        $this->applyStateMachineTransitionAction($request)->shouldReturn($response);
1815
    }
1816
1817
    function it_does_not_apply_state_machine_transition_resource_and_throws_http_exception_for_non_html_requests_stopped_via_event(
1818
        MetadataInterface $metadata,
1819
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1820
        RequestConfiguration $configuration,
1821
        AuthorizationCheckerInterface $authorizationChecker,
1822
        RepositoryInterface $repository,
1823
        ObjectManager $objectManager,
1824
        StateMachineInterface $stateMachine,
1825
        SingleResourceProviderInterface $singleResourceProvider,
1826
        ResourceInterface $resource,
1827
        FlashHelperInterface $flashHelper,
1828
        EventDispatcherInterface $eventDispatcher,
1829
        ResourceControllerEvent $event,
1830
        Request $request
1831
    ): void {
1832
        $metadata->getApplicationName()->willReturn('sylius');
1833
        $metadata->getName()->willReturn('product');
1834
1835
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1836
        $configuration->hasPermission()->willReturn(true);
1837
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1838
1839
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1840
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1841
1842
        $configuration->isHtmlRequest()->willReturn(false);
1843
1844
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1845
        $event->isStopped()->willReturn(true);
1846
        $event->getMessage()->willReturn('Cannot approve this product.');
1847
        $event->getErrorCode()->willReturn(500);
1848
1849
        $stateMachine->apply($configuration, $resource)->shouldNotBeCalled();
1850
        $objectManager->flush()->shouldNotBeCalled();
1851
1852
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
1853
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
1854
        $flashHelper->addFlashFromEvent(Argument::any())->shouldNotBeCalled();
1855
1856
        $this
1857
            ->shouldThrow(new HttpException(500, 'Cannot approve this product.'))
1858
            ->during('applyStateMachineTransitionAction', [$request])
1859
        ;
1860
    }
1861
1862
    /**
1863
     * {@inheritdoc}
1864
     */
1865
    private function getViewComparingCallback(View $expectedView)
1866
    {
1867
        return function ($value) use ($expectedView) {
1868
            if (!$value instanceof View) {
1869
                return false;
1870
            }
1871
1872
            // Need to unwrap phpspec's Collaborators to ensure proper comparison.
1873
            $this->unwrapViewData($expectedView);
1874
            $this->nullifyDates($value);
1875
            $this->nullifyDates($expectedView);
1876
1877
            return
1878
                $expectedView->getStatusCode() === $value->getStatusCode() &&
1879
                $expectedView->getHeaders() === $value->getHeaders() &&
1880
                $expectedView->getEngine() === $value->getEngine() &&
1881
                $expectedView->getFormat() === $value->getFormat() &&
1882
                $expectedView->getData() === $value->getData() &&
1883
                $expectedView->getTemplate() === $value->getTemplate() &&
1884
                $expectedView->getTemplateVar() === $value->getTemplateVar()
1885
            ;
1886
        };
1887
    }
1888
1889
    /**
1890
     * @param View $view
1891
     */
1892
    private function unwrapViewData(View $view)
1893
    {
1894
        $view->setData($this->unwrapIfCollaborator($view->getData()));
1895
    }
1896
1897
    /**
1898
     * @param mixed $value
1899
     *
1900
     * @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...
1901
     */
1902
    private function unwrapIfCollaborator($value)
1903
    {
1904
        if (null === $value) {
1905
            return null;
1906
        }
1907
1908
        if ($value instanceof Collaborator) {
1909
            return $value->getWrappedObject();
1910
        }
1911
1912
        if (is_array($value)) {
1913
            foreach ($value as $key => $childValue) {
1914
                $value[$key] = $this->unwrapIfCollaborator($childValue);
1915
            }
1916
        }
1917
1918
        return $value;
1919
    }
1920
1921
    /**
1922
     * @param View $view
1923
     */
1924
    private function nullifyDates(View $view)
1925
    {
1926
        $headers = $view->getHeaders();
1927
        unset($headers['date']);
1928
        $view->setHeaders($headers);
1929
    }
1930
}
1931