Completed
Push — master ( 91e054...12ace7 )
by Kamil
31:08 queued 26:39
created

ResourceControllerSpec::let()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 33
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 4
Bugs 1 Features 2
Metric Value
c 4
b 1
f 2
dl 0
loc 33
rs 8.8571
cc 1
eloc 30
nc 1
nop 14

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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
namespace spec\Sylius\Bundle\ResourceBundle\Controller;
13
14
use Doctrine\Common\Persistence\ObjectManager;
15
use FOS\RestBundle\View\View;
16
use PhpSpec\ObjectBehavior;
17
use PhpSpec\Wrapper\Collaborator;
18
use Prophecy\Argument;
19
use Sylius\Bundle\ResourceBundle\Controller\AuthorizationCheckerInterface;
20
use Sylius\Bundle\ResourceBundle\Controller\EventDispatcherInterface;
21
use Sylius\Bundle\ResourceBundle\Controller\FlashHelperInterface;
22
use Sylius\Bundle\ResourceBundle\Controller\NewResourceFactoryInterface;
23
use Sylius\Bundle\ResourceBundle\Controller\RedirectHandlerInterface;
24
use Sylius\Bundle\ResourceBundle\Controller\RequestConfiguration;
25
use Sylius\Bundle\ResourceBundle\Controller\RequestConfigurationFactoryInterface;
26
use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
27
use Sylius\Bundle\ResourceBundle\Controller\ResourceFormFactoryInterface;
28
use Sylius\Bundle\ResourceBundle\Controller\ResourcesCollectionProviderInterface;
29
use Sylius\Bundle\ResourceBundle\Controller\SingleResourceProviderInterface;
30
use Sylius\Bundle\ResourceBundle\Controller\ViewHandlerInterface;
31
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
32
use Sylius\Component\Resource\Factory\FactoryInterface;
33
use Sylius\Component\Resource\Metadata\MetadataInterface;
34
use Sylius\Component\Resource\Model\ResourceInterface;
35
use Sylius\Component\Resource\Repository\RepositoryInterface;
36
use Sylius\Component\Resource\ResourceActions;
37
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
38
use Symfony\Component\DependencyInjection\ContainerAware;
39
use Symfony\Component\Form\Form;
40
use Symfony\Component\Form\FormView;
41
use Symfony\Component\HttpFoundation\Request;
42
use Symfony\Component\HttpFoundation\Response;
43
use Symfony\Component\HttpKernel\Exception\HttpException;
44
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
45
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
46
47
/**
48
 * @mixin ResourceController
49
 *
50
 * @author Paweł Jędrzejewski <[email protected]>
51
 */
52
class ResourceControllerSpec extends ObjectBehavior
53
{
54
    function let(
55
        MetadataInterface $metadata,
56
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
57
        ViewHandlerInterface $viewHandler,
58
        RepositoryInterface $repository,
59
        FactoryInterface $factory,
60
        NewResourceFactoryInterface $newResourceFactory,
61
        ObjectManager $manager,
62
        SingleResourceProviderInterface $singleResourceProvider,
63
        ResourcesCollectionProviderInterface $resourcesCollectionProvider,
64
        ResourceFormFactoryInterface $resourceFormFactory,
65
        RedirectHandlerInterface $redirectHandler,
66
        FlashHelperInterface $flashHelper,
67
        AuthorizationCheckerInterface $authorizationChecker,
68
        EventDispatcherInterface $eventDispatcher
69
    ) {
70
        $this->beConstructedWith(
71
            $metadata,
72
            $requestConfigurationFactory,
73
            $viewHandler,
74
            $repository,
75
            $factory,
76
            $newResourceFactory,
77
            $manager,
78
            $singleResourceProvider,
79
            $resourcesCollectionProvider,
80
            $resourceFormFactory,
81
            $redirectHandler,
82
            $flashHelper,
83
            $authorizationChecker,
84
            $eventDispatcher
85
        );
86
    }
87
88
    function it_is_initializable()
89
    {
90
        $this->shouldHaveType('Sylius\Bundle\ResourceBundle\Controller\ResourceController');
91
    }
92
    
93
    function it_is_container_aware()
94
    {
95
        $this->shouldHaveType(ContainerAware::class);
96
    }
97
98
    function it_extends_base_Symfony_controller()
99
    {
100
        $this->shouldHaveType(Controller::class);
101
    }
102
103
    function it_throws_a_403_exception_if_user_is_unauthorized_to_view_a_single_resource(
104
        MetadataInterface $metadata,
105
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
106
        RequestConfiguration $configuration,
107
        Request $request,
108
        AuthorizationCheckerInterface $authorizationChecker
109
    )
110
    {
111
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
112
        $configuration->hasPermission()->willReturn(true);
113
        $configuration->getPermission(ResourceActions::SHOW)->willReturn('sylius.product.show');
114
115
        $authorizationChecker->isGranted($configuration, 'sylius.product.show')->willReturn(false);
116
117
        $this
118
            ->shouldThrow(new AccessDeniedException())
119
            ->during('showAction', array($request))
120
        ;
121
    }
122
123
    function it_throws_a_404_exception_if_resource_is_not_found_based_on_configuration(
124
        MetadataInterface $metadata,
125
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
126
        RequestConfiguration $configuration,
127
        Request $request,
128
        AuthorizationCheckerInterface $authorizationChecker,
129
        RepositoryInterface $repository,
130
        SingleResourceProviderInterface $singleResourceProvider
131
    )
132
    {
133
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
134
        $configuration->hasPermission()->willReturn(true);
135
        $configuration->getPermission(ResourceActions::SHOW)->willReturn('sylius.product.show');
136
137
        $authorizationChecker->isGranted($configuration, 'sylius.product.show')->willReturn(true);
138
        $singleResourceProvider->get($configuration, $repository)->willReturn(null);
139
140
        $this
141
            ->shouldThrow(new NotFoundHttpException())
142
            ->during('showAction', array($request))
143
        ;
144
    }
145
146
    function it_returns_a_response_for_html_view_of_a_single_resource(
147
        MetadataInterface $metadata,
148
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
149
        RequestConfiguration $configuration,
150
        AuthorizationCheckerInterface $authorizationChecker,
151
        RepositoryInterface $repository,
152
        SingleResourceProviderInterface $singleResourceProvider,
153
        ResourceInterface $resource,
154
        ViewHandlerInterface $viewHandler,
155
        EventDispatcherInterface $eventDispatcher,
156
        Request $request,
157
        Response $response
158
    ) {
159
        $metadata->getApplicationName()->willReturn('sylius');
160
        $metadata->getName()->willReturn('product');
161
162
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
163
        $configuration->hasPermission()->willReturn(true);
164
        $configuration->getPermission(ResourceActions::SHOW)->willReturn('sylius.product.show');
165
166
        $authorizationChecker->isGranted($configuration, 'sylius.product.show')->willReturn(true);
167
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
168
169
        $configuration->isHtmlRequest()->willReturn(true);
170
        $configuration->getTemplate(ResourceActions::SHOW)->willReturn('SyliusShopBundle:Product:show.html.twig');
171
172
        $eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $resource)->shouldBeCalled();
173
174
        $expectedView = View::create()
175
            ->setData(array(
176
                'metadata' => $metadata,
177
                'resource' => $resource,
178
                'product'  => $resource
179
            ))
180
            ->setTemplateVar('product')
181
            ->setTemplate('SyliusShopBundle:Product:show.html.twig')
182
        ;
183
184
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
185
        
186
        $this->showAction($request)->shouldReturn($response);
187
    }
188
189
    function it_returns_a_response_for_non_html_view_of_single_resource(
190
        MetadataInterface $metadata,
191
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
192
        RequestConfiguration $configuration,
193
        AuthorizationCheckerInterface $authorizationChecker,
194
        RepositoryInterface $repository,
195
        SingleResourceProviderInterface $singleResourceProvider,
196
        ResourceInterface $resource,
197
        ViewHandlerInterface $viewHandler,
198
        EventDispatcherInterface $eventDispatcher,
199
        Request $request,
200
        Response $response
201
    ) {
202
        $metadata->getApplicationName()->willReturn('sylius');
203
        $metadata->getName()->willReturn('product');
204
205
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
206
        $configuration->hasPermission()->willReturn(true);
207
        $configuration->getPermission(ResourceActions::SHOW)->willReturn('sylius.product.show');
208
209
        $authorizationChecker->isGranted($configuration, 'sylius.product.show')->willReturn(true);
210
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
211
212
        $configuration->isHtmlRequest()->willReturn(false);
213
214
        $eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $resource)->shouldBeCalled();
215
216
        $expectedView = View::create($resource);
217
218
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
219
220
        $this->showAction($request)->shouldReturn($response);
221
    }
222
223
    function it_throws_a_403_exception_if_user_is_unauthorized_to_view_an_index_of_resources(
224
        MetadataInterface $metadata,
225
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
226
        RequestConfiguration $configuration,
227
        Request $request,
228
        AuthorizationCheckerInterface $authorizationChecker
229
    ) {
230
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
231
        $configuration->hasPermission()->willReturn(true);
232
        $configuration->getPermission(ResourceActions::INDEX)->willReturn('sylius.product.index');
233
234
        $authorizationChecker->isGranted($configuration, 'sylius.product.index')->willReturn(false);
235
236
        $this
237
            ->shouldThrow(new AccessDeniedException())
238
            ->during('indexAction', array($request))
239
        ;
240
    }
241
242
    function it_returns_a_response_for_html_view_of_paginated_resources(
243
        MetadataInterface $metadata,
244
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
245
        RequestConfiguration $configuration,
246
        AuthorizationCheckerInterface $authorizationChecker,
247
        RepositoryInterface $repository,
248
        ResourcesCollectionProviderInterface $resourcesCollectionProvider,
249
        ResourceInterface $resource1,
250
        ResourceInterface $resource2,
251
        ViewHandlerInterface $viewHandler,
252
        Request $request,
253
        Response $response
254
    ) {
255
        $metadata->getApplicationName()->willReturn('sylius');
256
        $metadata->getName()->willReturn('product');
257
        $metadata->getPluralName()->willReturn('products');
258
259
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
260
        $configuration->hasPermission()->willReturn(true);
261
        $configuration->getPermission(ResourceActions::INDEX)->willReturn('sylius.product.index');
262
263
        $authorizationChecker->isGranted($configuration, 'sylius.product.index')->willReturn(true);
264
265
        $configuration->isHtmlRequest()->willReturn(true);
266
        $configuration->getTemplate(ResourceActions::INDEX)->willReturn('SyliusShopBundle:Product:index.html.twig');
267
        $resourcesCollectionProvider->get($configuration, $repository)->willReturn(array($resource1, $resource2));
268
269
        $expectedView = View::create()
270
            ->setData(array(
271
                'metadata' => $metadata,
272
                'resources' => array($resource1, $resource2),
273
                'products' => array($resource1, $resource2)
274
            ))
275
            ->setTemplateVar('products')
276
            ->setTemplate('SyliusShopBundle:Product:index.html.twig')
277
        ;
278
279
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
280
281
        $this->indexAction($request)->shouldReturn($response);
282
    }
283
284
    function it_throws_a_403_exception_if_user_is_unauthorized_to_create_a_new_resource(
285
        MetadataInterface $metadata,
286
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
287
        RequestConfiguration $configuration,
288
        Request $request,
289
        AuthorizationCheckerInterface $authorizationChecker
290
    ) {
291
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
292
        $configuration->hasPermission()->willReturn(true);
293
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
294
295
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(false);
296
297
        $this
298
            ->shouldThrow(new AccessDeniedException())
299
            ->during('createAction', array($request))
300
        ;
301
    }
302
303
    function it_returns_a_html_response_for_creating_new_resource_form(
304
        MetadataInterface $metadata,
305
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
306
        RequestConfiguration $configuration,
307
        AuthorizationCheckerInterface $authorizationChecker,
308
        ViewHandlerInterface $viewHandler,
309
        FactoryInterface $factory,
310
        NewResourceFactoryInterface $newResourceFactory,
311
        ResourceInterface $newResource,
312
        ResourceFormFactoryInterface $resourceFormFactory,
313
        Form $form,
314
        FormView $formView,
315
        Request $request,
316
        Response $response
317
    ) {
318
        $metadata->getApplicationName()->willReturn('sylius');
319
        $metadata->getName()->willReturn('product');
320
321
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
322
        $configuration->hasPermission()->willReturn(true);
323
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
324
325
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
326
327
        $configuration->isHtmlRequest()->willReturn(true);
328
        $configuration->getTemplate(ResourceActions::CREATE)->willReturn('SyliusShopBundle:Product:create.html.twig');
329
        
330
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
331
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
332
333
        $request->isMethod('POST')->willReturn(false);
334
        $form->createView()->willReturn($formView);
335
336
        $expectedView = View::create()
337
            ->setData(array(
338
                'metadata' => $metadata,
339
                'resource' => $newResource,
340
                'product'  => $newResource,
341
                'form'     => $formView
342
            ))
343
            ->setTemplate('SyliusShopBundle:Product:create.html.twig')
344
        ;
345
346
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
347
348
        $this->createAction($request)->shouldReturn($response);
349
    }
350
351
    function it_returns_a_html_response_for_invalid_form_during_resource_creation(
352
        MetadataInterface $metadata,
353
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
354
        RequestConfiguration $configuration,
355
        AuthorizationCheckerInterface $authorizationChecker,
356
        ViewHandlerInterface $viewHandler,
357
        FactoryInterface $factory,
358
        NewResourceFactoryInterface $newResourceFactory,
359
        ResourceInterface $newResource,
360
        ResourceFormFactoryInterface $resourceFormFactory,
361
        Form $form,
362
        FormView $formView,
363
        Request $request,
364
        Response $response
365
    ) {
366
        $metadata->getApplicationName()->willReturn('sylius');
367
        $metadata->getName()->willReturn('product');
368
369
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
370
        $configuration->hasPermission()->willReturn(true);
371
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
372
373
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
374
375
        $configuration->isHtmlRequest()->willReturn(true);
376
        $configuration->getTemplate(ResourceActions::CREATE)->willReturn('SyliusShopBundle:Product:create.html.twig');
377
378
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
379
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
380
381
        $request->isMethod('POST')->willReturn(true);
382
        $form->submit($request)->willReturn($form);
383
        $form->isValid()->willReturn(false);
384
        $form->createView()->willReturn($formView);
385
386
        $expectedView = View::create()
387
            ->setData(array(
388
                'metadata' => $metadata,
389
                'resource' => $newResource,
390
                'product'  => $newResource,
391
                'form'     => $formView
392
            ))
393
            ->setTemplate('SyliusShopBundle:Product:create.html.twig')
394
        ;
395
396
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
397
398
        $this->createAction($request)->shouldReturn($response);
399
    }
400
401
    function it_returns_a_non_html_response_for_invalid_form_during_resource_creation(
402
        MetadataInterface $metadata,
403
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
404
        RequestConfiguration $configuration,
405
        AuthorizationCheckerInterface $authorizationChecker,
406
        ViewHandlerInterface $viewHandler,
407
        FactoryInterface $factory,
408
        NewResourceFactoryInterface $newResourceFactory,
409
        ResourceInterface $newResource,
410
        ResourceFormFactoryInterface $resourceFormFactory,
411
        Form $form,
412
        Request $request,
413
        Response $response
414
    ) {
415
        $metadata->getApplicationName()->willReturn('sylius');
416
        $metadata->getName()->willReturn('product');
417
418
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
419
        $configuration->hasPermission()->willReturn(true);
420
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
421
422
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
423
424
        $configuration->isHtmlRequest()->willReturn(false);
425
        $configuration->getTemplate(ResourceActions::CREATE)->willReturn('SyliusShopBundle:Product:create.html.twig');
426
427
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
428
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
429
430
        $request->isMethod('POST')->willReturn(true);
431
        $form->submit($request)->willReturn($form);
432
        $form->isValid()->willReturn(false);
433
434
        $expectedView = View::create($form, 400);
435
436
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
437
438
        $this->createAction($request)->shouldReturn($response);
439
    }
440
441
    function it_does_not_create_the_resource_and_redirects_to_index_for_html_requests_stopped_via_events(
442
        MetadataInterface $metadata,
443
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
444
        RequestConfiguration $configuration,
445
        AuthorizationCheckerInterface $authorizationChecker,
446
        ViewHandlerInterface $viewHandler,
447
        FactoryInterface $factory,
448
        NewResourceFactoryInterface $newResourceFactory,
449
        RepositoryInterface $repository,
450
        ResourceInterface $newResource,
451
        ResourceFormFactoryInterface $resourceFormFactory,
452
        Form $form,
453
        RedirectHandlerInterface $redirectHandler,
454
        FlashHelperInterface $flashHelper,
455
        EventDispatcherInterface $eventDispatcher,
456
        ResourceControllerEvent $event,
457
        Request $request,
458
        Response $redirectResponse
459
    ) {
460
        $metadata->getApplicationName()->willReturn('sylius');
461
        $metadata->getName()->willReturn('product');
462
463
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
464
        $configuration->hasPermission()->willReturn(true);
465
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
466
467
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
468
469
        $configuration->isHtmlRequest()->willReturn(true);
470
        $configuration->getTemplate(ResourceActions::CREATE)->willReturn('SyliusShopBundle:Product:create.html.twig');
471
472
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
473
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
474
475
        $request->isMethod('POST')->willReturn(true);
476
        $form->submit($request)->willReturn($form);
477
        $form->isValid()->willReturn(true);
478
        $form->getData()->willReturn($newResource);
479
480
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
481
        $event->isStopped()->willReturn(true);
482
483
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
484
485
        $repository->add($newResource)->shouldNotBeCalled();
486
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldNotBeCalled();
487
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
488
489
        $redirectHandler->redirectToIndex($configuration, $newResource)->willReturn($redirectResponse);
490
491
        $this->createAction($request)->shouldReturn($redirectResponse);
492
    }
493
494
    function it_redirects_to_newly_created_resource(
495
        MetadataInterface $metadata,
496
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
497
        RequestConfiguration $configuration,
498
        AuthorizationCheckerInterface $authorizationChecker,
499
        ViewHandlerInterface $viewHandler,
500
        FactoryInterface $factory,
501
        NewResourceFactoryInterface $newResourceFactory,
502
        RepositoryInterface $repository,
503
        ResourceInterface $newResource,
504
        ResourceFormFactoryInterface $resourceFormFactory,
505
        Form $form,
506
        RedirectHandlerInterface $redirectHandler,
507
        FlashHelperInterface $flashHelper,
508
        EventDispatcherInterface $eventDispatcher,
509
        ResourceControllerEvent $event,
510
        Request $request,
511
        Response $redirectResponse
512
    ) {
513
        $metadata->getApplicationName()->willReturn('sylius');
514
        $metadata->getName()->willReturn('product');
515
516
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
517
        $configuration->hasPermission()->willReturn(true);
518
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
519
520
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
521
522
        $configuration->isHtmlRequest()->willReturn(true);
523
        $configuration->getTemplate(ResourceActions::CREATE)->willReturn('SyliusShopBundle:Product:create.html.twig');
524
525
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
526
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
527
528
        $request->isMethod('POST')->willReturn(true);
529
        $form->submit($request)->willReturn($form);
530
        $form->isValid()->willReturn(true);
531
        $form->getData()->willReturn($newResource);
532
533
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
534
        $event->isStopped()->willReturn(false);
535
        
536
        $repository->add($newResource)->shouldBeCalled();
537
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldBeCalled();
538
539
        $flashHelper->addSuccessFlash($configuration, ResourceActions::CREATE, $newResource)->shouldBeCalled();
540
        $redirectHandler->redirectToResource($configuration, $newResource)->willReturn($redirectResponse);
541
542
        $this->createAction($request)->shouldReturn($redirectResponse);
543
    }
544
545
    function it_returns_a_non_html_response_for_correctly_created_resources(
546
        MetadataInterface $metadata,
547
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
548
        RequestConfiguration $configuration,
549
        AuthorizationCheckerInterface $authorizationChecker,
550
        ViewHandlerInterface $viewHandler,
551
        FactoryInterface $factory,
552
        NewResourceFactoryInterface $newResourceFactory,
553
        RepositoryInterface $repository,
554
        ResourceInterface $newResource,
555
        ResourceFormFactoryInterface $resourceFormFactory,
556
        FlashHelperInterface $flashHelper,
557
        EventDispatcherInterface $eventDispatcher,
558
        ResourceControllerEvent $event,
559
        Form $form,
560
        Request $request,
561
        Response $response
562
    ) {
563
        $metadata->getApplicationName()->willReturn('sylius');
564
        $metadata->getName()->willReturn('product');
565
566
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
567
        $configuration->hasPermission()->willReturn(true);
568
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
569
570
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
571
572
        $configuration->isHtmlRequest()->willReturn(false);
573
        $configuration->getTemplate(ResourceActions::CREATE)->willReturn('SyliusShopBundle:Product:create.html.twig');
574
575
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
576
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
577
578
        $request->isMethod('POST')->willReturn(true);
579
        $form->submit($request)->willReturn($form);
580
        $form->isValid()->willReturn(true);
581
        $form->getData()->willReturn($newResource);
582
583
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
584
        $event->isStopped()->willReturn(false);
585
586
        $repository->add($newResource)->shouldBeCalled();
587
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldBeCalled();
588
589
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
590
591
        $expectedView = View::create($newResource, 201);
592
593
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
594
595
        $this->createAction($request)->shouldReturn($response);
596
    }
597
598
    function it_does_not_create_the_resource_and_throws_http_exception_for_non_html_requests_stopped_via_event(
599
        MetadataInterface $metadata,
600
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
601
        RequestConfiguration $configuration,
602
        AuthorizationCheckerInterface $authorizationChecker,
603
        FactoryInterface $factory,
604
        NewResourceFactoryInterface $newResourceFactory,
605
        RepositoryInterface $repository,
606
        ResourceInterface $newResource,
607
        ResourceFormFactoryInterface $resourceFormFactory,
608
        FlashHelperInterface $flashHelper,
609
        EventDispatcherInterface $eventDispatcher,
610
        Form $form,
611
        Request $request,
612
        ResourceControllerEvent $event
613
    ) {
614
        $metadata->getApplicationName()->willReturn('sylius');
615
        $metadata->getName()->willReturn('product');
616
617
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
618
        $configuration->hasPermission()->willReturn(true);
619
        $configuration->getPermission(ResourceActions::CREATE)->willReturn('sylius.product.create');
620
621
        $authorizationChecker->isGranted($configuration, 'sylius.product.create')->willReturn(true);
622
623
        $configuration->isHtmlRequest()->willReturn(false);
624
        $configuration->getTemplate(ResourceActions::CREATE)->willReturn('SyliusShopBundle:Product:create.html.twig');
625
626
        $newResourceFactory->create($configuration, $factory)->willReturn($newResource);
627
        $resourceFormFactory->create($configuration, $newResource)->willReturn($form);
628
629
        $request->isMethod('POST')->willReturn(true);
630
        $form->submit($request)->willReturn($form);
631
        $form->isValid()->willReturn(true);
632
        $form->getData()->willReturn($newResource);
633
634
        $eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource)->willReturn($event);
635
        $event->isStopped()->willReturn(true);
636
        $event->getMessage()->willReturn('You cannot add a new product right now.');
637
        $event->getErrorCode()->willReturn(500);
638
639
        $repository->add($newResource)->shouldNotBeCalled();
640
        $eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource)->shouldNotBeCalled();
641
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
642
643
        $this
644
            ->shouldThrow(new HttpException(500, 'You cannot add a new product right now.'))
645
            ->during('createAction', array($request))
646
        ;
647
    }
648
649
    function it_throws_a_403_exception_if_user_is_unauthorized_to_edit_a_single_resource(
650
        MetadataInterface $metadata,
651
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
652
        RequestConfiguration $configuration,
653
        Request $request,
654
        AuthorizationCheckerInterface $authorizationChecker
655
    ) {
656
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
657
        $configuration->hasPermission()->willReturn(true);
658
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
659
660
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(false);
661
662
        $this
663
            ->shouldThrow(new AccessDeniedException())
664
            ->during('updateAction', array($request))
665
        ;
666
    }
667
668
    function it_throws_a_404_exception_if_resource_to_update_is_not_found_based_on_configuration(
669
        MetadataInterface $metadata,
670
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
671
        RequestConfiguration $configuration,
672
        Request $request,
673
        AuthorizationCheckerInterface $authorizationChecker,
674
        RepositoryInterface $repository,
675
        SingleResourceProviderInterface $singleResourceProvider
676
    ) {
677
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
678
        $configuration->hasPermission()->willReturn(true);
679
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
680
681
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
682
        $singleResourceProvider->get($configuration, $repository)->willReturn(null);
683
684
        $this
685
            ->shouldThrow(new NotFoundHttpException())
686
            ->during('updateAction', array($request))
687
        ;
688
    }
689
690
    function it_returns_a_html_response_for_updating_resource_form(
691
        MetadataInterface $metadata,
692
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
693
        RequestConfiguration $configuration,
694
        AuthorizationCheckerInterface $authorizationChecker,
695
        ViewHandlerInterface $viewHandler,
696
        RepositoryInterface $repository,
697
        SingleResourceProviderInterface $singleResourceProvider,
698
        ResourceInterface $resource,
699
        ResourceFormFactoryInterface $resourceFormFactory,
700
        Form $form,
701
        FormView $formView,
702
        Request $request,
703
        Response $response
704
    ) {
705
        $metadata->getApplicationName()->willReturn('sylius');
706
        $metadata->getName()->willReturn('product');
707
708
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
709
        $configuration->hasPermission()->willReturn(true);
710
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
711
712
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
713
714
        $configuration->isHtmlRequest()->willReturn(true);
715
        $configuration->getTemplate(ResourceActions::UPDATE)->willReturn('SyliusShopBundle:Product:update.html.twig');
716
717
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
718
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
719
720
        $request->isMethod('PATCH')->willReturn(false);
721
        $request->getMethod()->willReturn('GET');
722
723
        $form->submit($request, true)->willReturn($form);
724
        $form->createView()->willReturn($formView);
725
726
        $expectedView = View::create()
727
            ->setData(array(
728
                'metadata' => $metadata,
729
                'resource' => $resource,
730
                'product'  => $resource,
731
                'form'     => $formView
732
            ))
733
            ->setTemplate('SyliusShopBundle:Product:update.html.twig')
734
        ;
735
736
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
737
738
        $this->updateAction($request)->shouldReturn($response);
739
    }
740
741
    function it_returns_a_html_response_for_invalid_form_during_resource_update(
742
        MetadataInterface $metadata,
743
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
744
        RequestConfiguration $configuration,
745
        AuthorizationCheckerInterface $authorizationChecker,
746
        ViewHandlerInterface $viewHandler,
747
        RepositoryInterface $repository,
748
        SingleResourceProviderInterface $singleResourceProvider,
749
        ResourceInterface $resource,
750
        ResourceFormFactoryInterface $resourceFormFactory,
751
        Form $form,
752
        FormView $formView,
753
        Request $request,
754
        Response $response
755
    ) {
756
        $metadata->getApplicationName()->willReturn('sylius');
757
        $metadata->getName()->willReturn('product');
758
759
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
760
        $configuration->hasPermission()->willReturn(true);
761
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
762
763
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
764
765
        $configuration->isHtmlRequest()->willReturn(true);
766
        $configuration->getTemplate(ResourceActions::UPDATE)->willReturn('SyliusShopBundle:Product:update.html.twig');
767
768
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
769
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
770
771
        $request->isMethod('PATCH')->willReturn(false);
772
        $request->getMethod()->willReturn('PUT');
773
        
774
        $form->submit($request, true)->willReturn($form);
775
776
        $form->isValid()->willReturn(false);
777
        $form->createView()->willReturn($formView);
778
779
        $expectedView = View::create()
780
            ->setData(array(
781
                'metadata' => $metadata,
782
                'resource' => $resource,
783
                'product'  => $resource,
784
                'form'     => $formView
785
            ))
786
            ->setTemplate('SyliusShopBundle:Product:update.html.twig')
787
        ;
788
789
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
790
791
        $this->updateAction($request)->shouldReturn($response);
792
    }
793
794
    function it_returns_a_non_html_response_for_invalid_form_during_resource_update(
795
        MetadataInterface $metadata,
796
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
797
        RequestConfiguration $configuration,
798
        AuthorizationCheckerInterface $authorizationChecker,
799
        ViewHandlerInterface $viewHandler,
800
        RepositoryInterface $repository,
801
        SingleResourceProviderInterface $singleResourceProvider,
802
        ResourceInterface $resource,
803
        ResourceFormFactoryInterface $resourceFormFactory,
804
        Form $form,
805
        Request $request,
806
        Response $response
807
    ) {
808
        $metadata->getApplicationName()->willReturn('sylius');
809
        $metadata->getName()->willReturn('product');
810
811
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
812
        $configuration->hasPermission()->willReturn(true);
813
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
814
        $configuration->isHtmlRequest()->willReturn(false);
815
816
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
817
818
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);;
819
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
820
821
        $request->isMethod('PATCH')->willReturn(true);
822
        $request->getMethod()->willReturn('PATCH');
823
824
        $form->submit($request, false)->willReturn($form);
825
        $form->isValid()->willReturn(false);
826
827
        $expectedView = View::create($form, 400);
828
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
829
830
        $this->updateAction($request)->shouldReturn($response);
831
    }
832
833
    function it_does_not_update_the_resource_and_redirects_to_resource_for_html_request_if_stopped_via_event(
834
        MetadataInterface $metadata,
835
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
836
        RequestConfiguration $configuration,
837
        AuthorizationCheckerInterface $authorizationChecker,
838
        ObjectManager $manager,
839
        RepositoryInterface $repository,
840
        SingleResourceProviderInterface $singleResourceProvider,
841
        ResourceInterface $resource,
842
        ResourceFormFactoryInterface $resourceFormFactory,
843
        Form $form,
844
        EventDispatcherInterface $eventDispatcher,
845
        RedirectHandlerInterface $redirectHandler,
846
        FlashHelperInterface $flashHelper,
847
        ResourceControllerEvent $event,
848
        Request $request,
849
        Response $redirectResponse
850
    ) {
851
        $metadata->getApplicationName()->willReturn('sylius');
852
        $metadata->getName()->willReturn('product');
853
854
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
855
        $configuration->hasPermission()->willReturn(true);
856
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
857
858
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
859
860
        $configuration->isHtmlRequest()->willReturn(true);
861
862
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
863
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
864
865
        $request->isMethod('PATCH')->willReturn(false);
866
        $request->getMethod()->willReturn('PUT');
867
868
        $form->submit($request, true)->willReturn($form);
869
870
        $form->isSubmitted()->willReturn(true);
871
        $form->isValid()->willReturn(true);
872
        $form->getData()->willReturn($resource);
873
874
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
875
        $event->isStopped()->willReturn(true);
876
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
877
878
        $manager->flush()->shouldNotBeCalled();
879
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
880
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
881
882
        $redirectHandler->redirectToResource($configuration, $resource)->willReturn($redirectResponse);
883
884
        $this->updateAction($request)->shouldReturn($redirectResponse);
885
    }
886
887
    function it_redirects_to_updated_resource(
888
        MetadataInterface $metadata,
889
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
890
        RequestConfiguration $configuration,
891
        AuthorizationCheckerInterface $authorizationChecker,
892
        ObjectManager $manager,
893
        RepositoryInterface $repository,
894
        SingleResourceProviderInterface $singleResourceProvider,
895
        ResourceInterface $resource,
896
        ResourceFormFactoryInterface $resourceFormFactory,
897
        Form $form,
898
        EventDispatcherInterface $eventDispatcher,
899
        RedirectHandlerInterface $redirectHandler,
900
        FlashHelperInterface $flashHelper,
901
        ResourceControllerEvent $event,
902
        Request $request,
903
        Response $redirectResponse
904
    ) {
905
        $metadata->getApplicationName()->willReturn('sylius');
906
        $metadata->getName()->willReturn('product');
907
908
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
909
        $configuration->hasPermission()->willReturn(true);
910
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
911
912
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
913
914
        $configuration->isHtmlRequest()->willReturn(true);
915
        $configuration->getTemplate(ResourceActions::UPDATE)->willReturn('SyliusShopBundle:Product:update.html.twig');
916
917
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
918
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
919
920
        $request->isMethod('PATCH')->willReturn(false);
921
        $request->getMethod()->willReturn('PUT');
922
923
        $form->submit($request, true)->willReturn($form);
924
925
        $form->isSubmitted()->willReturn(true);
926
        $form->isValid()->willReturn(true);
927
        $form->getData()->willReturn($resource);
928
929
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
930
        $event->isStopped()->willReturn(false);
931
932
        $manager->flush()->shouldBeCalled();
933
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldBeCalled();
934
935
        $flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource)->shouldBeCalled();
936
        $redirectHandler->redirectToResource($configuration, $resource)->willReturn($redirectResponse);
937
938
        $this->updateAction($request)->shouldReturn($redirectResponse);
939
    }
940
941
    function it_returns_a_non_html_response_for_correctly_updated_resource(
942
        MetadataInterface $metadata,
943
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
944
        RequestConfiguration $configuration,
945
        AuthorizationCheckerInterface $authorizationChecker,
946
        ViewHandlerInterface $viewHandler,
947
        ObjectManager $manager,
948
        RepositoryInterface $repository,
949
        SingleResourceProviderInterface $singleResourceProvider,
950
        ResourceInterface $resource,
951
        ResourceFormFactoryInterface $resourceFormFactory,
952
        EventDispatcherInterface $eventDispatcher,
953
        ResourceControllerEvent $event,
954
        Form $form,
955
        Request $request,
956
        Response $response
957
    ) {
958
        $metadata->getApplicationName()->willReturn('sylius');
959
        $metadata->getName()->willReturn('product');
960
961
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
962
        $configuration->hasPermission()->willReturn(true);
963
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
964
        $configuration->isHtmlRequest()->willReturn(false);
965
966
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
967
968
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
969
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
970
971
        $request->isMethod('PATCH')->willReturn(false);
972
        $request->getMethod()->willReturn('PUT');
973
974
        $form->submit($request, true)->willReturn($form);
975
        $form->isValid()->willReturn(true);
976
        $form->getData()->willReturn($resource);
977
978
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
979
        $event->isStopped()->willReturn(false);
980
981
        $manager->flush()->shouldBeCalled();
982
        $eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource)->shouldBeCalled();
983
984
        $expectedView = View::create($resource, 204);
985
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
986
987
        $this->updateAction($request)->shouldReturn($response);
988
    }
989
990
    function it_does_not_update_the_resource_throws_a_http_exception_for_non_html_requests_stopped_via_event(
991
        MetadataInterface $metadata,
992
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
993
        RequestConfiguration $configuration,
994
        AuthorizationCheckerInterface $authorizationChecker,
995
        ViewHandlerInterface $viewHandler,
996
        ObjectManager $manager,
997
        RepositoryInterface $repository,
998
        SingleResourceProviderInterface $singleResourceProvider,
999
        ResourceInterface $resource,
1000
        ResourceFormFactoryInterface $resourceFormFactory,
1001
        EventDispatcherInterface $eventDispatcher,
1002
        ResourceControllerEvent $event,
1003
        Form $form,
1004
        Request $request
1005
    ) {
1006
        $metadata->getApplicationName()->willReturn('sylius');
1007
        $metadata->getName()->willReturn('product');
1008
1009
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1010
        $configuration->hasPermission()->willReturn(true);
1011
        $configuration->getPermission(ResourceActions::UPDATE)->willReturn('sylius.product.update');
1012
        $configuration->isHtmlRequest()->willReturn(false);
1013
1014
        $authorizationChecker->isGranted($configuration, 'sylius.product.update')->willReturn(true);
1015
1016
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1017
        $resourceFormFactory->create($configuration, $resource)->willReturn($form);
1018
1019
        $request->isMethod('PATCH')->willReturn(false);
1020
        $request->getMethod()->willReturn('PUT');
1021
1022
        $form->submit($request, true)->willReturn($form);
1023
        $form->isValid()->willReturn(true);
1024
        $form->getData()->willReturn($resource);
1025
1026
        $eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource)->willReturn($event);
1027
        $event->isStopped()->willReturn(true);
1028
        $event->getMessage()->willReturn('Cannot update this channel.');
1029
        $event->getErrorCode()->willReturn(500);
1030
1031
        $manager->flush()->shouldNotBeCalled();
1032
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
1033
1034
        $this
1035
            ->shouldThrow(new HttpException(500, 'Cannot update this channel.'))
1036
            ->during('updateAction', array($request))
1037
        ;
1038
    }
1039
1040
    function it_throws_a_403_exception_if_user_is_unauthorized_to_delete_a_single_resource(
1041
        MetadataInterface $metadata,
1042
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1043
        RequestConfiguration $configuration,
1044
        Request $request,
1045
        AuthorizationCheckerInterface $authorizationChecker
1046
    ) {
1047
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1048
        $configuration->hasPermission()->willReturn(true);
1049
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1050
1051
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(false);
1052
1053
        $this
1054
            ->shouldThrow(new AccessDeniedException())
1055
            ->during('deleteAction', array($request))
1056
        ;
1057
    }
1058
1059
    function it_throws_a_404_exception_if_resource_for_deletion_is_not_found_based_on_configuration(
1060
        MetadataInterface $metadata,
1061
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1062
        RequestConfiguration $configuration,
1063
        Request $request,
1064
        AuthorizationCheckerInterface $authorizationChecker,
1065
        RepositoryInterface $repository,
1066
        SingleResourceProviderInterface $singleResourceProvider
1067
    ) {
1068
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1069
        $configuration->hasPermission()->willReturn(true);
1070
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1071
1072
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1073
        $singleResourceProvider->get($configuration, $repository)->willReturn(null);
1074
1075
        $this
1076
            ->shouldThrow(new NotFoundHttpException())
1077
            ->during('deleteAction', array($request))
1078
        ;
1079
    }
1080
1081
    function it_deletes_a_resource_and_redirects_to_index_by_for_html_request(
1082
        MetadataInterface $metadata,
1083
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1084
        RequestConfiguration $configuration,
1085
        AuthorizationCheckerInterface $authorizationChecker,
1086
        RepositoryInterface $repository,
1087
        SingleResourceProviderInterface $singleResourceProvider,
1088
        ResourceInterface $resource,
1089
        RedirectHandlerInterface $redirectHandler,
1090
        FlashHelperInterface $flashHelper,
1091
        EventDispatcherInterface $eventDispatcher,
1092
        ResourceControllerEvent $event,
1093
        Request $request,
1094
        Response $redirectResponse
1095
    ) {
1096
        $metadata->getApplicationName()->willReturn('sylius');
1097
        $metadata->getName()->willReturn('product');
1098
1099
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1100
        $configuration->hasPermission()->willReturn(true);
1101
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1102
1103
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1104
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1105
1106
        $configuration->isHtmlRequest()->willReturn(true);
1107
1108
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1109
        $event->isStopped()->willReturn(false);
1110
        
1111
        $repository->remove($resource)->shouldBeCalled();
1112
        $eventDispatcher->dispatchPostEvent(ResourceActions::DELETE, $configuration, $resource)->shouldBeCalled();
1113
1114
        $flashHelper->addSuccessFlash($configuration, ResourceActions::DELETE, $resource)->shouldBeCalled();
1115
        $redirectHandler->redirectToIndex($configuration, $resource)->willReturn($redirectResponse);
1116
        
1117
        $this->deleteAction($request)->shouldReturn($redirectResponse);
1118
    }
1119
1120
    function it_does_not_delete_a_resource_and_redirects_to_index_for_html_requests_stopped_via_event(
1121
        MetadataInterface $metadata,
1122
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1123
        RequestConfiguration $configuration,
1124
        AuthorizationCheckerInterface $authorizationChecker,
1125
        RepositoryInterface $repository,
1126
        SingleResourceProviderInterface $singleResourceProvider,
1127
        ResourceInterface $resource,
1128
        RedirectHandlerInterface $redirectHandler,
1129
        FlashHelperInterface $flashHelper,
1130
        EventDispatcherInterface $eventDispatcher,
1131
        ResourceControllerEvent $event,
1132
        Request $request,
1133
        Response $redirectResponse
1134
    ) {
1135
        $metadata->getApplicationName()->willReturn('sylius');
1136
        $metadata->getName()->willReturn('product');
1137
1138
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1139
        $configuration->hasPermission()->willReturn(true);
1140
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1141
1142
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1143
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1144
1145
        $configuration->isHtmlRequest()->willReturn(true);
1146
1147
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1148
        $event->isStopped()->willReturn(true);
1149
        
1150
        $repository->remove($resource)->shouldNotBeCalled();
1151
        $eventDispatcher->dispatchPostEvent(ResourceActions::DELETE, $configuration, $resource)->shouldNotBeCalled();
1152
        $flashHelper->addSuccessFlash($configuration, ResourceActions::DELETE, $resource)->shouldNotBeCalled();
1153
1154
        $flashHelper->addFlashFromEvent($configuration, $event)->shouldBeCalled();
1155
        $redirectHandler->redirectToIndex($configuration, $resource)->willReturn($redirectResponse);
1156
1157
        $this->deleteAction($request)->shouldReturn($redirectResponse);
1158
    }
1159
1160
    function it_deletes_a_resource_and_returns_204_for_non_html_requests(
1161
        MetadataInterface $metadata,
1162
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1163
        RequestConfiguration $configuration,
1164
        AuthorizationCheckerInterface $authorizationChecker,
1165
        ViewHandlerInterface $viewHandler,
1166
        RepositoryInterface $repository,
1167
        SingleResourceProviderInterface $singleResourceProvider,
1168
        ResourceInterface $resource,
1169
        EventDispatcherInterface $eventDispatcher,
1170
        ResourceControllerEvent $event,
1171
        Request $request,
1172
        Response $response
1173
    ) {
1174
        $metadata->getApplicationName()->willReturn('sylius');
1175
        $metadata->getName()->willReturn('product');
1176
1177
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1178
        $configuration->hasPermission()->willReturn(true);
1179
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1180
1181
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1182
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1183
1184
        $configuration->isHtmlRequest()->willReturn(false);
1185
1186
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1187
        $event->isStopped()->willReturn(false);
1188
1189
        $repository->remove($resource)->shouldBeCalled();
1190
        $eventDispatcher->dispatchPostEvent(ResourceActions::DELETE, $configuration, $resource)->shouldBeCalled();
1191
1192
        $expectedView = View::create(null, 204);
1193
1194
        $viewHandler->handle($configuration, Argument::that($this->getViewComparingCallback($expectedView)))->willReturn($response);
1195
1196
        $this->deleteAction($request)->shouldReturn($response);
1197
    }
1198
1199
    function it_does_not_delete_a_resource_and_throws_http_exception_for_non_html_requests_stopped_via_event(
1200
        MetadataInterface $metadata,
1201
        RequestConfigurationFactoryInterface $requestConfigurationFactory,
1202
        RequestConfiguration $configuration,
1203
        AuthorizationCheckerInterface $authorizationChecker,
1204
        RepositoryInterface $repository,
1205
        SingleResourceProviderInterface $singleResourceProvider,
1206
        ResourceInterface $resource,
1207
        FlashHelperInterface $flashHelper,
1208
        EventDispatcherInterface $eventDispatcher,
1209
        ResourceControllerEvent $event,
1210
        Request $request
1211
    ) {
1212
        $metadata->getApplicationName()->willReturn('sylius');
1213
        $metadata->getName()->willReturn('product');
1214
1215
        $requestConfigurationFactory->create($metadata, $request)->willReturn($configuration);
1216
        $configuration->hasPermission()->willReturn(true);
1217
        $configuration->getPermission(ResourceActions::DELETE)->willReturn('sylius.product.delete');
1218
1219
        $authorizationChecker->isGranted($configuration, 'sylius.product.delete')->willReturn(true);
1220
        $singleResourceProvider->get($configuration, $repository)->willReturn($resource);
1221
1222
        $configuration->isHtmlRequest()->willReturn(false);
1223
1224
        $eventDispatcher->dispatchPreEvent(ResourceActions::DELETE, $configuration, $resource)->willReturn($event);
1225
        $event->isStopped()->willReturn(true);
1226
        $event->getMessage()->willReturn('Cannot delete this product.');
1227
        $event->getErrorCode()->willReturn(500);
1228
1229
        $repository->remove($resource)->shouldNotBeCalled();
1230
1231
        $eventDispatcher->dispatchPostEvent(Argument::any())->shouldNotBeCalled();
1232
        $flashHelper->addSuccessFlash(Argument::any())->shouldNotBeCalled();
1233
        $flashHelper->addFlashFromEvent(Argument::any())->shouldNotBeCalled();
1234
1235
        $this
1236
            ->shouldThrow(new HttpException(500, 'Cannot delete this product.'))
1237
            ->during('deleteAction', array($request))
1238
        ;
1239
    }
1240
1241
    /**
1242
     * {@inheritdoc}
1243
     */
1244
    private function getViewComparingCallback(View $expectedView)
1245
    {
1246
        return function ($value) use ($expectedView) {
1247
            if (!$value instanceof View) {
1248
                return false;
1249
            }
1250
1251
            // Need to unwrap phpspec's Collaborators to ensure proper comparison.
1252
            $this->unwrapViewData($expectedView);
1253
            $this->nullifyDates($value);
1254
            $this->nullifyDates($expectedView);
1255
1256
            return
1257
                $expectedView->getStatusCode() === $value->getStatusCode() &&
1258
                $expectedView->getHeaders() === $value->getHeaders() &&
1259
                $expectedView->getEngine() === $value->getEngine() &&
1260
                $expectedView->getFormat() === $value->getFormat() &&
1261
                $expectedView->getData() === $value->getData() &&
1262
                $expectedView->getTemplate() === $value->getTemplate() &&
1263
                $expectedView->getTemplateVar() === $value->getTemplateVar()
1264
            ;
1265
        };
1266
    }
1267
1268
    /**
1269
     * @param View $view
1270
     */
1271
    private function unwrapViewData(View $view)
1272
    {
1273
        $view->setData($this->unwrapIfCollaborator($view->getData()));
1274
    }
1275
1276
    /**
1277
     * @param mixed $value
1278
     *
1279
     * @return mixed
1280
     */
1281
    private function unwrapIfCollaborator($value)
1282
    {
1283
        if (null === $value) {
1284
            return null;
1285
        }
1286
1287
        if ($value instanceof Collaborator) {
1288
            return $value->getWrappedObject();
1289
        }
1290
1291
        if (is_array($value)) {
1292
            foreach ($value as $key => $childValue) {
1293
                $value[$key] = $this->unwrapIfCollaborator($childValue);
1294
            }
1295
        }
1296
1297
        return $value;
1298
    }
1299
1300
    /**
1301
     * @param View $view
1302
     */
1303
    private function nullifyDates(View $view)
1304
    {
1305
        $headers = $view->getHeaders();
1306
        unset($headers['date']);
1307
        $view->setHeaders($headers);
1308
    }
1309
}
1310