Completed
Pull Request — master (#1162)
by Alessandro
31:42 queued 21:39
created

getResultSetMock()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 6
rs 9.4285
cc 1
eloc 4
nc 1
nop 0
1
<?php
2
3
namespace FOS\ElasticaBundle\Tests\Subscriber;
4
5
use Elastica\Query;
6
use FOS\ElasticaBundle\Paginator\PartialResultsInterface;
7
use FOS\ElasticaBundle\Paginator\RawPaginatorAdapter;
8
use FOS\ElasticaBundle\Subscriber\PaginateElasticaQuerySubscriber;
9
use Knp\Component\Pager\Event\ItemsEvent;
10
use Symfony\Component\HttpFoundation\Request;
11
12
class PaginateElasticaQuerySubscriberTest extends \PHPUnit_Framework_TestCase
13
{
14
    protected function getAdapterMock()
15
    {
16
        return $this->getMockBuilder(RawPaginatorAdapter::class)
17
            ->disableOriginalConstructor()
18
            ->getMock();
19
    }
20
21
    protected function getResultSetMock()
22
    {
23
        return $this->getMockBuilder(PartialResultsInterface::class)
24
            ->disableOriginalConstructor()
25
            ->getMock();
26
    }
27
28
    public function testShouldDoNothingIfSortParamIsEmpty()
29
    {
30
        $request = new Request();
31
32
        $subscriber = new PaginateElasticaQuerySubscriber();
33
        $subscriber->setRequest($request);
34
35
        $adapter = $this->getAdapterMock();
36
        $adapter->expects($this->never())
37
            ->method('getQuery');
38
        $adapter->method('getResults')
39
            ->willReturn($this->getResultSetMock());
40
41
        $event = new ItemsEvent(0, 10);
42
        $event->target = $adapter;
43
44
        $subscriber->items($event);
45
    }
46
47
    public function sortCases()
48
    {
49
        $tests = [];
50
51
        $expected = [
52
            'createdAt' => [
53
                'order' => 'asc',
54
                'ignore_unmapped' => true
55
            ]
56
        ];
57
        $tests[] = [$expected, new Request()];
58
59
        $expected = [
60
            'name' => [
61
                'order' => 'desc',
62
                'ignore_unmapped' => true
63
            ]
64
        ];
65
        $tests[] = [$expected, new Request(['ord' => 'name', 'az' => 'desc'])];
66
67
        $expected = [
68
            'updatedAt' => [
69
                'order' => 'asc',
70
                'ignore_unmapped' => true
71
            ]
72
        ];
73
        $tests[] = [$expected, new Request(['ord' => 'updatedAt', 'az' => 'invalid'])];
74
75
        return $tests;
76
    }
77
78
    /**
79
     * @dataProvider sortCases
80
     */
81
    public function testShouldSort(array $expected, Request $request)
82
    {
83
        $subscriber = new PaginateElasticaQuerySubscriber();
84
        $subscriber->setRequest($request);
85
86
        $query = new Query();
87
        $adapter = $this->getAdapterMock();
88
        $adapter->method('getQuery')
89
            ->willReturn($query);
90
91
        $adapter->method('getResults')
92
            ->willReturn($this->getResultSetMock());
93
94
        $event = new ItemsEvent(0, 10);
95
        $event->target = $adapter;
96
        $event->options = [
97
            'defaultSortFieldName' => 'createdAt',
98
            'sortFieldParameterName' => 'ord',
99
            'sortDirectionParameterName' => 'az',
100
        ];
101
102
        $subscriber->items($event);
103
104
        $this->assertEquals($expected, $query->getParam('sort'));
105
    }
106
107
    /**
108
     * @expectedException \UnexpectedValueException
109
     */
110
    public function testShouldThrowIfFieldIsNotWhitelisted()
111
    {
112
        $subscriber = new PaginateElasticaQuerySubscriber();
113
        $subscriber->setRequest(new Request(['ord' => 'owner']));
114
115
        $query = new Query();
116
        $adapter = $this->getAdapterMock();
117
        $adapter->method('getQuery')
118
            ->willReturn($query);
119
120
        $adapter->method('getResults')
121
            ->willReturn($this->getResultSetMock());
122
123
        $event = new ItemsEvent(0, 10);
124
        $event->target = $adapter;
125
        $event->options = [
126
            'defaultSortFieldName' => 'createdAt',
127
            'sortFieldParameterName' => 'ord',
128
            'sortDirectionParameterName' => 'az',
129
            'sortFieldWhitelist' => ['createdAt', 'updatedAt'],
130
        ];
131
132
        $subscriber->items($event);
133
    }
134
135 View Code Duplication
    public function testShouldAddNestedPath()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
136
    {
137
        $subscriber = new PaginateElasticaQuerySubscriber();
138
        $subscriber->setRequest(new Request(['ord' => 'owner.name']));
139
140
        $query = new Query();
141
        $adapter = $this->getAdapterMock();
142
        $adapter->method('getQuery')
143
            ->willReturn($query);
144
145
        $adapter->method('getResults')
146
            ->willReturn($this->getResultSetMock());
147
148
        $event = new ItemsEvent(0, 10);
149
        $event->target = $adapter;
150
        $event->options = [
151
            'defaultSortFieldName' => 'createdAt',
152
            'sortFieldParameterName' => 'ord',
153
            'sortDirectionParameterName' => 'az',
154
            'sortNestedPath' => 'owner',
155
        ];
156
157
        $subscriber->items($event);
158
        $this->assertEquals([
159
            'owner.name' => [
160
                'order' => 'asc',
161
                'ignore_unmapped' => true,
162
                'nested_path' => 'owner',
163
            ]
164
        ], $query->getParam('sort'));
165
    }
166
167 View Code Duplication
    public function testShouldInvokeCallableNestedPath()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
168
    {
169
        $subscriber = new PaginateElasticaQuerySubscriber();
170
        $subscriber->setRequest(new Request(['ord' => 'owner.name']));
171
172
        $query = new Query();
173
        $adapter = $this->getAdapterMock();
174
        $adapter->method('getQuery')
175
            ->willReturn($query);
176
177
        $adapter->method('getResults')
178
            ->willReturn($this->getResultSetMock());
179
180
        $event = new ItemsEvent(0, 10);
181
        $event->target = $adapter;
182
        $event->options = [
183
            'defaultSortFieldName' => 'createdAt',
184
            'sortFieldParameterName' => 'ord',
185
            'sortDirectionParameterName' => 'az',
186
            'sortNestedPath' => function ($sortField) {
187
                $this->assertEquals('owner.name', $sortField);
188
                return 'owner';
189
            },
190
        ];
191
192
        $subscriber->items($event);
193
        $this->assertEquals([
194
            'owner.name' => [
195
                'order' => 'asc',
196
                'ignore_unmapped' => true,
197
                'nested_path' => 'owner',
198
            ]
199
        ], $query->getParam('sort'));
200
    }
201
202 View Code Duplication
    public function testShouldAddNestedFilter()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
203
    {
204
        $subscriber = new PaginateElasticaQuerySubscriber();
205
        $subscriber->setRequest(new Request(['ord' => 'owner.name']));
206
207
        $query = new Query();
208
        $adapter = $this->getAdapterMock();
209
        $adapter->method('getQuery')
210
            ->willReturn($query);
211
212
        $adapter->method('getResults')
213
            ->willReturn($this->getResultSetMock());
214
215
        $event = new ItemsEvent(0, 10);
216
        $event->target = $adapter;
217
        $event->options = [
218
            'defaultSortFieldName' => 'createdAt',
219
            'sortFieldParameterName' => 'ord',
220
            'sortDirectionParameterName' => 'az',
221
            'sortNestedPath' => 'owner',
222
            'sortNestedFilter' => new Query\Term(['enabled' => ['value' => true]]),
223
        ];
224
225
        $subscriber->items($event);
226
        $this->assertEquals([
227
            'sort' => [
228
                'owner.name' => [
229
                    'order' => 'asc',
230
                    'ignore_unmapped' => true,
231
                    'nested_path' => 'owner',
232
                    'nested_filter' => [
233
                        'term' => [
234
                            'enabled' => ['value' => true]
235
                        ]
236
                    ]
237
                ]
238
            ],
239
            'query' => [
240
                'match_all' => new \stdClass()
241
            ]
242
        ], $query->toArray());
243
    }
244
245 View Code Duplication
    public function testShouldInvokeNestedFilterCallable()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
246
    {
247
        $subscriber = new PaginateElasticaQuerySubscriber();
248
        $subscriber->setRequest(new Request(['ord' => 'owner.name']));
249
250
        $query = new Query();
251
        $adapter = $this->getAdapterMock();
252
        $adapter->method('getQuery')
253
            ->willReturn($query);
254
255
        $adapter->method('getResults')
256
            ->willReturn($this->getResultSetMock());
257
258
        $event = new ItemsEvent(0, 10);
259
        $event->target = $adapter;
260
        $event->options = [
261
            'defaultSortFieldName' => 'createdAt',
262
            'sortFieldParameterName' => 'ord',
263
            'sortDirectionParameterName' => 'az',
264
            'sortNestedPath' => 'owner',
265
            'sortNestedFilter' => function ($sortField) {
266
                $this->assertEquals('owner.name', $sortField);
267
                return new Query\Term(['enabled' => ['value' => true]]);
268
            },
269
        ];
270
271
        $subscriber->items($event);
272
        $this->assertEquals([
273
            'sort' => [
274
                'owner.name' => [
275
                    'order' => 'asc',
276
                    'ignore_unmapped' => true,
277
                    'nested_path' => 'owner',
278
                    'nested_filter' => [
279
                        'term' => [
280
                            'enabled' => ['value' => true]
281
                        ]
282
                    ]
283
                ]
284
            ],
285
            'query' => [
286
                'match_all' => new \stdClass()
287
            ]
288
        ], $query->toArray());
289
    }
290
}
291