Completed
Push — master ( 81c6e7...6c71bd )
by Piotr
02:30
created

BatchFormValidRequestHandlerSpec::it_handle_POST_request()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 41
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 41
rs 8.8571
c 0
b 0
f 0
cc 1
eloc 32
nc 1
nop 9

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
namespace spec\FSi\Bundle\AdminBundle\Admin\CRUD\Context\Request;
4
5
use FSi\Bundle\AdminBundle\Event\BatchEvents;
6
use FSi\Bundle\AdminBundle\Exception\RequestHandlerException;
7
use PhpSpec\ObjectBehavior;
8
use Prophecy\Argument;
9
use Symfony\Component\HttpFoundation\Response;
10
11
class BatchFormValidRequestHandlerSpec extends ObjectBehavior
12
{
13
    /**
14
     * @param \Symfony\Component\EventDispatcher\EventDispatcher $eventDispatcher
15
     * @param \FSi\Bundle\AdminBundle\Event\FormEvent $event
16
     * @param \Symfony\Bundle\FrameworkBundle\Routing\Router $router
17
     */
18
    function let($eventDispatcher, $event, $router)
19
    {
20
        $event->hasResponse()->willReturn(false);
21
        $this->beConstructedWith($eventDispatcher, $router);
22
    }
23
24
    function it_is_context_request_handler()
25
    {
26
        $this->shouldHaveType('FSi\Bundle\AdminBundle\Admin\Context\Request\HandlerInterface');
27
    }
28
29
    /**
30
     * @param \FSi\Bundle\AdminBundle\Event\ListEvent $listEvent
31
     * @param \Symfony\Component\HttpFoundation\Request $request
32
     */
33
    function it_throw_exception_for_non_form_event($listEvent, $request)
34
    {
35
        $this->shouldThrow(
36
            new RequestHandlerException(
37
                "FSi\\Bundle\\AdminBundle\\Admin\\CRUD\\Context\\Request\\BatchFormValidRequestHandler require FormEvent"
38
            )
39
        )->during('handleRequest', array($listEvent, $request));
40
    }
41
42
    /**
43
     * @param \FSi\Bundle\AdminBundle\Event\FormEvent $formEvent
44
     * @param \Symfony\Component\HttpFoundation\Request $request
45
     */
46
    function it_throw_exception_for_non_redirectable_element($formEvent, $request)
47
    {
48
        $formEvent->getElement()->willReturn(new \stdClass());
49
50
        $this->shouldThrow(
51
            new RequestHandlerException(
52
                "FSi\\Bundle\\AdminBundle\\Admin\\CRUD\\Context\\Request\\BatchFormValidRequestHandler require RedirectableElement"
53
            )
54
        )->during('handleRequest', array($formEvent, $request));
55
    }
56
57
    /**
58
     * @param \FSi\Bundle\AdminBundle\Event\FormEvent $event
59
     * @param \Symfony\Component\HttpFoundation\Request $request
60
     * @param \Symfony\Component\HttpFoundation\ParameterBag $requestParameterbag
61
     * @param \Symfony\Component\HttpFoundation\ParameterBag $queryParameterbag
62
     * @param \Symfony\Component\EventDispatcher\EventDispatcher $eventDispatcher
63
     * @param \Symfony\Component\Form\Form $form
64
     * @param \FSi\Bundle\AdminBundle\Admin\CRUD\BatchElement $element
65
     * @param \FSi\Component\DataIndexer\DataIndexerInterface $dataIndexer
66
     * @param \Symfony\Bundle\FrameworkBundle\Routing\Router $router
67
     */
68
    function it_handle_POST_request(
69
        $event,
70
        $request,
71
        $requestParameterbag,
72
        $queryParameterbag,
73
        $eventDispatcher,
74
        $form,
75
        $element,
76
        $dataIndexer,
77
        $router
78
    ) {
79
        $request->isMethod('POST')->willReturn(true);
80
        $request->request = $requestParameterbag;
81
        $request->query = $queryParameterbag;
82
        $requestParameterbag->get('indexes', array())->willReturn(array('index'));
83
84
        $event->getForm()->willReturn($form);
85
        $form->isValid()->willReturn(true);
86
        $eventDispatcher->dispatch(BatchEvents::BATCH_OBJECTS_PRE_APPLY, $event)
87
            ->shouldBeCalled();
88
89
        $form->getData()->willReturn(new \stdClass());
90
        $event->getElement()->willReturn($element);
91
        $element->apply(Argument::type('stdClass'))->shouldBeCalled();
92
93
        $eventDispatcher->dispatch(BatchEvents::BATCH_OBJECTS_POST_APPLY, $event)
94
            ->shouldBeCalled();
95
96
        $element->getSuccessRoute()->willReturn('fsi_admin_list');
97
        $element->getSuccessRouteParameters()->willReturn(array('element' => 'element_list_id'));
98
        $element->getId()->willReturn('element_form_id');
99
        $element->getDataIndexer()->willReturn($dataIndexer);
100
101
        $dataIndexer->getData('index')->willReturn(new \stdClass());
102
103
        $queryParameterbag->has('redirect_uri')->willReturn(false);
104
        $router->generate('fsi_admin_list', array('element' => 'element_list_id'))->willReturn('/list/page');
105
106
        $this->handleRequest($event, $request)
107
            ->shouldReturnAnInstanceOf('Symfony\Component\HttpFoundation\RedirectResponse');
108
    }
109
110
    /**
111
     * @param \FSi\Bundle\AdminBundle\Event\FormEvent $event
112
     * @param \Symfony\Component\HttpFoundation\Request $request
113
     * @param \Symfony\Component\HttpFoundation\ParameterBag $requestParameterbag
114
     * @param \Symfony\Component\HttpFoundation\ParameterBag $queryParameterbag
115
     * @param \Symfony\Component\EventDispatcher\EventDispatcher $eventDispatcher
116
     * @param \Symfony\Component\Form\Form $form
117
     * @param \FSi\Bundle\AdminBundle\Admin\CRUD\BatchElement $element
118
     * @param \FSi\Component\DataIndexer\DataIndexerInterface $dataIndexer
119
     */
120
    function it_return_redirect_response_with_redirect_uri_passed_by_request(
121
        $event,
122
        $request,
123
        $requestParameterbag,
124
        $queryParameterbag,
125
        $eventDispatcher,
126
        $form,
127
        $element,
128
        $dataIndexer
129
    ) {
130
        $request->isMethod('POST')->willReturn(true);
131
        $request->request = $requestParameterbag;
132
        $request->query = $queryParameterbag;
133
        $requestParameterbag->get('indexes', array())->willReturn(array('index'));
134
135
        $event->getForm()->willReturn($form);
136
        $form->isValid()->willReturn(true);
137
        $eventDispatcher->dispatch(BatchEvents::BATCH_OBJECTS_PRE_APPLY, $event)
138
            ->shouldBeCalled();
139
140
        $form->getData()->willReturn(new \stdClass());
141
        $event->getElement()->willReturn($element);
142
        $element->apply(Argument::type('stdClass'))->shouldBeCalled();
143
144
        $eventDispatcher->dispatch(BatchEvents::BATCH_OBJECTS_POST_APPLY, $event)
145
            ->shouldBeCalled();
146
147
        $element->getSuccessRoute()->willReturn('fsi_admin_list');
148
        $element->getSuccessRouteParameters()->willReturn(array('element' => 'element_list_id'));
149
        $element->getId()->willReturn('element_form_id');
150
        $element->getDataIndexer()->willReturn($dataIndexer);
151
152
        $dataIndexer->getData('index')->willReturn(new \stdClass());
153
154
        $queryParameterbag->has('redirect_uri')->willReturn(true);
155
        $queryParameterbag->get('redirect_uri')->willReturn('some_redirect_uri');
156
157
        $response = $this->handleRequest($event, $request);
158
        $response->shouldBeAnInstanceOf('Symfony\Component\HttpFoundation\RedirectResponse');
159
        $response->getTargetUrl()->shouldReturn('some_redirect_uri');
160
    }
161
162
    /**
163
     * @param \FSi\Bundle\AdminBundle\Event\FormEvent $event
164
     * @param \FSi\Bundle\AdminBundle\Admin\CRUD\BatchElement $element
165
     * @param \Symfony\Component\HttpFoundation\Request $request
166
     * @param \Symfony\Component\EventDispatcher\EventDispatcher $eventDispatcher
167
     * @param \Symfony\Component\Form\Form $form
168
     */
169
    function it_return_response_from_pre_apply_event($event, $element, $request, $eventDispatcher, $form)
170
    {
171
        $request->isMethod('POST')->willReturn(true);
172
        $event->getForm()->willReturn($form);
173
        $form->isValid()->willReturn(true);
174
        $eventDispatcher->dispatch(BatchEvents::BATCH_OBJECTS_PRE_APPLY, $event)
175
            ->will(function() use ($event) {
176
                $event->hasResponse()->willReturn(true);
177
                $event->getResponse()->willReturn(new Response());
178
            });
179
        $event->getElement()->willReturn($element);
180
181
        $this->handleRequest($event, $request)
182
            ->shouldReturnAnInstanceOf('Symfony\Component\HttpFoundation\Response');
183
    }
184
185
    /**
186
     * @param \FSi\Bundle\AdminBundle\Event\FormEvent $event
187
     * @param \Symfony\Component\HttpFoundation\Request $request
188
     * @param \Symfony\Component\HttpFoundation\ParameterBag $requestParameterbag
189
     * @param \Symfony\Component\EventDispatcher\EventDispatcher $eventDispatcher
190
     * @param \Symfony\Component\Form\Form $form
191
     * @param \FSi\Bundle\AdminBundle\Admin\CRUD\BatchElement $element
192
     * @param \FSi\Component\DataIndexer\DataIndexerInterface $dataIndexer
193
     */
194
    function it_return_response_from_post_apply_event(
195
        $event,
196
        $request,
197
        $requestParameterbag,
198
        $eventDispatcher,
199
        $form,
200
        $element,
201
        $dataIndexer
202
    ) {
203
        $request->isMethod('POST')->willReturn(true);
204
        $request->request = $requestParameterbag;
205
        $requestParameterbag->get('indexes', array())->willReturn(array('index'));
206
207
        $event->getForm()->willReturn($form);
208
        $form->isValid()->willReturn(true);
209
        $eventDispatcher->dispatch(BatchEvents::BATCH_OBJECTS_PRE_APPLY, $event)
210
            ->shouldBeCalled();
211
212
        $form->getData()->willReturn(new \stdClass());
213
        $event->getElement()->willReturn($element);
214
        $element->getDataIndexer()->willReturn($dataIndexer);
215
        $dataIndexer->getData('index')->willReturn(new \stdClass());
216
217
        $element->apply(Argument::type('stdClass'))->shouldBeCalled();
218
219
        $eventDispatcher->dispatch(BatchEvents::BATCH_OBJECTS_POST_APPLY, $event)
220
            ->will(function() use ($event) {
221
                $event->hasResponse()->willReturn(true);
222
                $event->getResponse()->willReturn(new Response());
223
            });
224
225
        $this->handleRequest($event, $request)
226
            ->shouldReturnAnInstanceOf('Symfony\Component\HttpFoundation\Response');
227
    }
228
}
229