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

ResourceControllerSpec   F

Complexity

Total Complexity 48

Size/Duplication

Total Lines 1258
Duplicated Lines 0 %

Coupling/Cohesion

Components 3
Dependencies 25

Importance

Changes 15
Bugs 5 Features 6
Metric Value
wmc 48
c 15
b 5
f 6
lcom 3
cbo 25
dl 0
loc 1258
rs 2.6804

37 Methods

Rating   Name   Duplication   Size   Complexity  
B let() 0 33 1
A it_is_initializable() 0 4 1
A it_is_container_aware() 0 4 1
A it_extends_base_Symfony_controller() 0 4 1
A it_throws_a_403_exception_if_user_is_unauthorized_to_view_a_single_resource() 0 19 1
A it_throws_a_404_exception_if_resource_is_not_found_based_on_configuration() 0 22 1
B it_returns_a_response_for_html_view_of_a_single_resource() 0 42 1
B it_returns_a_response_for_non_html_view_of_single_resource() 0 33 1
A it_throws_a_403_exception_if_user_is_unauthorized_to_view_an_index_of_resources() 0 18 1
B it_returns_a_response_for_html_view_of_paginated_resources() 0 41 1
A it_throws_a_403_exception_if_user_is_unauthorized_to_create_a_new_resource() 0 18 1
A it_returns_a_html_response_for_creating_new_resource_form() 0 47 1
A it_returns_a_html_response_for_invalid_form_during_resource_creation() 0 49 1
B it_returns_a_non_html_response_for_invalid_form_during_resource_creation() 0 39 1
A it_does_not_create_the_resource_and_redirects_to_index_for_html_requests_stopped_via_events() 0 52 1
A it_redirects_to_newly_created_resource() 0 50 1
A it_returns_a_non_html_response_for_correctly_created_resources() 0 52 1
A it_does_not_create_the_resource_and_throws_http_exception_for_non_html_requests_stopped_via_event() 0 50 1
A it_throws_a_403_exception_if_user_is_unauthorized_to_edit_a_single_resource() 0 18 1
A it_throws_a_404_exception_if_resource_to_update_is_not_found_based_on_configuration() 0 21 1
A it_returns_a_html_response_for_updating_resource_form() 0 50 1
A it_returns_a_html_response_for_invalid_form_during_resource_update() 0 52 1
B it_returns_a_non_html_response_for_invalid_form_during_resource_update() 0 38 1
A it_does_not_update_the_resource_and_redirects_to_resource_for_html_request_if_stopped_via_event() 0 53 1
A it_redirects_to_updated_resource() 0 53 1
A it_returns_a_non_html_response_for_correctly_updated_resource() 0 48 1
A it_does_not_update_the_resource_throws_a_http_exception_for_non_html_requests_stopped_via_event() 0 49 1
A it_throws_a_403_exception_if_user_is_unauthorized_to_delete_a_single_resource() 0 18 1
A it_throws_a_404_exception_if_resource_for_deletion_is_not_found_based_on_configuration() 0 21 1
B it_deletes_a_resource_and_redirects_to_index_by_for_html_request() 0 38 1
B it_does_not_delete_a_resource_and_redirects_to_index_for_html_requests_stopped_via_event() 0 39 1
B it_deletes_a_resource_and_returns_204_for_non_html_requests() 0 38 1
B it_does_not_delete_a_resource_and_throws_http_exception_for_non_html_requests_stopped_via_event() 0 41 1
C getViewComparingCallback() 0 23 8
A unwrapViewData() 0 4 1
B unwrapIfCollaborator() 0 18 5
A nullifyDates() 0 6 1

How to fix   Complexity   

Complex Class

Complex classes like ResourceControllerSpec often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use ResourceControllerSpec, and based on these observations, apply Extract Interface, too.

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