Security update for Core, with self-updated composer
[yaffs-website] / web / core / modules / views / tests / src / Kernel / Handler / FilterNumericTest.php
1 <?php
2
3 namespace Drupal\Tests\views\Kernel\Handler;
4
5 use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
6 use Drupal\views\Views;
7
8 /**
9  * Tests the numeric filter handler.
10  *
11  * @group views
12  */
13 class FilterNumericTest extends ViewsKernelTestBase {
14
15   public static $modules = ['system'];
16
17   /**
18    * Views used by this test.
19    *
20    * @var array
21    */
22   public static $testViews = ['test_view'];
23
24   /**
25    * Map column names.
26    *
27    * @var array
28    */
29   protected $columnMap = [
30     'views_test_data_name' => 'name',
31     'views_test_data_age' => 'age',
32   ];
33
34   public function viewsData() {
35     $data = parent::viewsData();
36     $data['views_test_data']['age']['filter']['allow empty'] = TRUE;
37     $data['views_test_data']['id']['filter']['allow empty'] = FALSE;
38
39     return $data;
40   }
41
42   public function testFilterNumericSimple() {
43     $view = Views::getView('test_view');
44     $view->setDisplay();
45
46     // Change the filtering
47     $view->displayHandlers->get('default')->overrideOption('filters', [
48       'age' => [
49         'id' => 'age',
50         'table' => 'views_test_data',
51         'field' => 'age',
52         'relationship' => 'none',
53         'operator' => '=',
54         'value' => ['value' => 28],
55       ],
56     ]);
57
58     $this->executeView($view);
59     $resultset = [
60       [
61         'name' => 'Ringo',
62         'age' => 28,
63       ],
64     ];
65     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
66   }
67
68   public function testFilterNumericExposedGroupedSimple() {
69     $filters = $this->getGroupedExposedFilters();
70     $view = Views::getView('test_view');
71     $view->newDisplay('page', 'Page', 'page_1');
72
73     // Filter: Age, Operator: =, Value: 28
74     $filters['age']['group_info']['default_group'] = 1;
75     $view->setDisplay('page_1');
76     $view->displayHandlers->get('page_1')->overrideOption('filters', $filters);
77     $view->save();
78     $this->container->get('router.builder')->rebuild();
79
80     $this->executeView($view);
81     $resultset = [
82       [
83         'name' => 'Ringo',
84         'age' => 28,
85       ],
86     ];
87     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
88   }
89
90   public function testFilterNumericBetween() {
91     $view = Views::getView('test_view');
92     $view->setDisplay();
93
94     // Change the filtering
95     $view->displayHandlers->get('default')->overrideOption('filters', [
96       'age' => [
97         'id' => 'age',
98         'table' => 'views_test_data',
99         'field' => 'age',
100         'relationship' => 'none',
101         'operator' => 'between',
102         'value' => [
103           'min' => 26,
104           'max' => 29,
105         ],
106       ],
107     ]);
108
109     $this->executeView($view);
110     $resultset = [
111       [
112         'name' => 'George',
113         'age' => 27,
114       ],
115       [
116         'name' => 'Ringo',
117         'age' => 28,
118       ],
119       [
120         'name' => 'Paul',
121         'age' => 26,
122       ],
123     ];
124     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
125
126     // test not between
127     $view->destroy();
128     $view->setDisplay();
129
130     // Change the filtering
131     $view->displayHandlers->get('default')->overrideOption('filters', [
132       'age' => [
133         'id' => 'age',
134         'table' => 'views_test_data',
135         'field' => 'age',
136         'relationship' => 'none',
137         'operator' => 'not between',
138         'value' => [
139           'min' => 26,
140           'max' => 29,
141         ],
142       ],
143     ]);
144
145     $this->executeView($view);
146     $resultset = [
147       [
148         'name' => 'John',
149         'age' => 25,
150       ],
151       [
152         'name' => 'Meredith',
153         'age' => 30,
154       ],
155     ];
156     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
157   }
158
159   public function testFilterNumericExposedGroupedBetween() {
160     $filters = $this->getGroupedExposedFilters();
161     $view = Views::getView('test_view');
162     $view->newDisplay('page', 'Page', 'page_1');
163
164     // Filter: Age, Operator: between, Value: 26 and 29
165     $filters['age']['group_info']['default_group'] = 2;
166     $view->setDisplay('page_1');
167     $view->displayHandlers->get('page_1')->overrideOption('filters', $filters);
168     $view->save();
169     $this->container->get('router.builder')->rebuild();
170
171     $this->executeView($view);
172     $resultset = [
173       [
174         'name' => 'George',
175         'age' => 27,
176       ],
177       [
178         'name' => 'Ringo',
179         'age' => 28,
180       ],
181       [
182         'name' => 'Paul',
183         'age' => 26,
184       ],
185     ];
186     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
187   }
188
189   public function testFilterNumericExposedGroupedNotBetween() {
190     $filters = $this->getGroupedExposedFilters();
191     $view = Views::getView('test_view');
192     $view->newDisplay('page', 'Page', 'page_1');
193
194     // Filter: Age, Operator: between, Value: 26 and 29
195     $filters['age']['group_info']['default_group'] = 3;
196     $view->setDisplay('page_1');
197     $view->displayHandlers->get('page_1')->overrideOption('filters', $filters);
198     $view->save();
199     $this->container->get('router.builder')->rebuild();
200
201     $this->executeView($view);
202     $resultset = [
203       [
204         'name' => 'John',
205         'age' => 25,
206       ],
207       [
208         'name' => 'Meredith',
209         'age' => 30,
210       ],
211     ];
212     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
213   }
214
215   /**
216    * Tests the numeric filter handler with the 'regular_expression' operator.
217    */
218   public function testFilterNumericRegularExpression() {
219     $view = Views::getView('test_view');
220     $view->setDisplay();
221
222     // Filtering by regular expression pattern.
223     $view->displayHandlers->get('default')->overrideOption('filters', [
224       'age' => [
225         'id' => 'age',
226         'table' => 'views_test_data',
227         'field' => 'age',
228         'relationship' => 'none',
229         'operator' => 'regular_expression',
230         'value' => [
231           'value' => '2[8]',
232         ],
233       ],
234     ]);
235
236     $this->executeView($view);
237     $resultset = [
238       [
239         'name' => 'Ringo',
240         'age' => 28,
241       ],
242     ];
243     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
244   }
245
246   /**
247    * Tests the numeric filter handler with the 'regular_expression' operator
248    * to grouped exposed filters.
249    */
250   public function testFilterNumericExposedGroupedRegularExpression() {
251     $filters = $this->getGroupedExposedFilters();
252     $view = Views::getView('test_view');
253     $view->newDisplay('page', 'Page', 'page_1');
254
255     // Filter: Age, Operator: regular_expression, Value: 2[7-8]
256     $filters['age']['group_info']['default_group'] = 6;
257     $view->setDisplay('page_1');
258     $view->displayHandlers->get('page_1')->overrideOption('filters', $filters);
259     $view->save();
260
261     $this->executeView($view);
262     $resultset = [
263       [
264         'name' => 'George',
265         'age' => 27,
266       ],
267       [
268         'name' => 'Ringo',
269         'age' => 28,
270       ],
271     ];
272     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
273   }
274
275   public function testFilterNumericEmpty() {
276     $view = Views::getView('test_view');
277     $view->setDisplay();
278
279     // Change the filtering
280     $view->displayHandlers->get('default')->overrideOption('filters', [
281       'age' => [
282         'id' => 'age',
283         'table' => 'views_test_data',
284         'field' => 'age',
285         'relationship' => 'none',
286         'operator' => 'empty',
287       ],
288     ]);
289
290     $this->executeView($view);
291     $resultset = [];
292     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
293
294     $view->destroy();
295     $view->setDisplay();
296
297     // Change the filtering
298     $view->displayHandlers->get('default')->overrideOption('filters', [
299       'age' => [
300         'id' => 'age',
301         'table' => 'views_test_data',
302         'field' => 'age',
303         'relationship' => 'none',
304         'operator' => 'not empty',
305       ],
306     ]);
307
308     $this->executeView($view);
309     $resultset = [
310     [
311         'name' => 'John',
312         'age' => 25,
313       ],
314       [
315         'name' => 'George',
316         'age' => 27,
317       ],
318       [
319         'name' => 'Ringo',
320         'age' => 28,
321       ],
322       [
323         'name' => 'Paul',
324         'age' => 26,
325       ],
326       [
327         'name' => 'Meredith',
328         'age' => 30,
329       ],
330     ];
331     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
332   }
333
334   public function testFilterNumericExposedGroupedEmpty() {
335     $filters = $this->getGroupedExposedFilters();
336     $view = Views::getView('test_view');
337     $view->newDisplay('page', 'Page', 'page_1');
338
339     // Filter: Age, Operator: empty, Value:
340     $filters['age']['group_info']['default_group'] = 4;
341     $view->setDisplay('page_1');
342     $view->displayHandlers->get('page_1')->overrideOption('filters', $filters);
343     $view->save();
344     $this->container->get('router.builder')->rebuild();
345
346     $this->executeView($view);
347     $resultset = [];
348     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
349   }
350
351   public function testFilterNumericExposedGroupedNotEmpty() {
352     $filters = $this->getGroupedExposedFilters();
353     $view = Views::getView('test_view');
354     $view->newDisplay('page', 'Page', 'page_1');
355
356     // Filter: Age, Operator: empty, Value:
357     $filters['age']['group_info']['default_group'] = 5;
358     $view->setDisplay('page_1');
359     $view->displayHandlers->get('page_1')->overrideOption('filters', $filters);
360     $view->save();
361     $this->container->get('router.builder')->rebuild();
362
363     $this->executeView($view);
364     $resultset = [
365     [
366         'name' => 'John',
367         'age' => 25,
368       ],
369       [
370         'name' => 'George',
371         'age' => 27,
372       ],
373       [
374         'name' => 'Ringo',
375         'age' => 28,
376       ],
377       [
378         'name' => 'Paul',
379         'age' => 26,
380       ],
381       [
382         'name' => 'Meredith',
383         'age' => 30,
384       ],
385     ];
386     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
387   }
388
389   public function testAllowEmpty() {
390     $view = Views::getView('test_view');
391     $view->setDisplay();
392
393     $view->displayHandlers->get('default')->overrideOption('filters', [
394       'id' => [
395         'id' => 'id',
396         'table' => 'views_test_data',
397         'field' => 'id',
398         'relationship' => 'none',
399       ],
400       'age' => [
401         'id' => 'age',
402         'table' => 'views_test_data',
403         'field' => 'age',
404         'relationship' => 'none',
405       ],
406     ]);
407
408     $view->initHandlers();
409
410     $id_operators = $view->filter['id']->operators();
411     $age_operators = $view->filter['age']->operators();
412
413     $this->assertFalse(isset($id_operators['empty']));
414     $this->assertFalse(isset($id_operators['not empty']));
415     $this->assertTrue(isset($age_operators['empty']));
416     $this->assertTrue(isset($age_operators['not empty']));
417   }
418
419   protected function getGroupedExposedFilters() {
420     $filters = [
421       'age' => [
422         'id' => 'age',
423         'plugin_id' => 'numeric',
424         'table' => 'views_test_data',
425         'field' => 'age',
426         'relationship' => 'none',
427         'exposed' => TRUE,
428         'expose' => [
429           'operator' => 'age_op',
430           'label' => 'age',
431           'identifier' => 'age',
432         ],
433         'is_grouped' => TRUE,
434         'group_info' => [
435           'label' => 'age',
436           'identifier' => 'age',
437           'default_group' => 'All',
438           'group_items' => [
439             1 => [
440               'title' => 'Age is 28',
441               'operator' => '=',
442               'value' => ['value' => 28],
443             ],
444             2 => [
445               'title' => 'Age is between 26 and 29',
446               'operator' => 'between',
447               'value' => [
448                 'min' => 26,
449                 'max' => 29,
450               ],
451             ],
452             3 => [
453               'title' => 'Age is not between 26 and 29',
454               'operator' => 'not between',
455               'value' => [
456                 'min' => 26,
457                 'max' => 29,
458               ],
459             ],
460             4 => [
461               'title' => 'Age is empty',
462               'operator' => 'empty',
463             ],
464             5 => [
465               'title' => 'Age is not empty',
466               'operator' => 'not empty',
467             ],
468             6 => [
469               'title' => 'Age is regexp 2[7-8]',
470               'operator' => 'regular_expression',
471               'value' => [
472                 'value' => '2[7-8]',
473               ],
474             ],
475           ],
476         ],
477       ],
478     ];
479     return $filters;
480   }
481
482 }