Version 1
[yaffs-website] / web / core / modules / views / tests / src / Kernel / Handler / FilterBooleanOperatorTest.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 core Drupal\views\Plugin\views\filter\BooleanOperator handler.
10  *
11  * @group views
12  * @see \Drupal\views\Plugin\views\filter\BooleanOperator
13  */
14 class FilterBooleanOperatorTest extends ViewsKernelTestBase {
15
16   /**
17    * The modules to enable for this test.
18    *
19    * @var array
20    */
21   public static $modules = ['system'];
22
23   /**
24    * Views used by this test.
25    *
26    * @var array
27    */
28   public static $testViews = ['test_view'];
29
30   /**
31    * Map column names.
32    *
33    * @var array
34    */
35   protected $columnMap = [
36     'views_test_data_id' => 'id',
37   ];
38
39   /**
40    * Tests the BooleanOperator filter.
41    */
42   public function testFilterBooleanOperator() {
43     $view = Views::getView('test_view');
44     $view->setDisplay();
45
46     // Add a the status boolean filter.
47     $view->displayHandlers->get('default')->overrideOption('filters', [
48       'status' => [
49         'id' => 'status',
50         'field' => 'status',
51         'table' => 'views_test_data',
52         'value' => 0,
53       ],
54     ]);
55     $this->executeView($view);
56
57     $expected_result = [
58       ['id' => 2],
59       ['id' => 4],
60     ];
61
62     $this->assertEqual(2, count($view->result));
63     $this->assertIdenticalResultset($view, $expected_result, $this->columnMap);
64
65     $view->destroy();
66     $view->setDisplay();
67
68     // Add the status boolean filter.
69     $view->displayHandlers->get('default')->overrideOption('filters', [
70       'status' => [
71         'id' => 'status',
72         'field' => 'status',
73         'table' => 'views_test_data',
74         'value' => 1,
75       ],
76     ]);
77     $this->executeView($view);
78
79     $expected_result = [
80       ['id' => 1],
81       ['id' => 3],
82       ['id' => 5],
83     ];
84
85     $this->assertEqual(3, count($view->result));
86     $this->assertIdenticalResultset($view, $expected_result, $this->columnMap);
87
88     $view->destroy();
89     $view->setDisplay();
90
91     // Testing the same scenario but using the reverse status and operation.
92     $view->displayHandlers->get('default')->overrideOption('filters', [
93       'status' => [
94         'id' => 'status',
95         'field' => 'status',
96         'table' => 'views_test_data',
97         'value' => 0,
98         'operator' => '!=',
99       ],
100     ]);
101     $this->executeView($view);
102
103     $expected_result = [
104       ['id' => 1],
105       ['id' => 3],
106       ['id' => 5],
107     ];
108
109     $this->assertEqual(3, count($view->result));
110     $this->assertIdenticalResultset($view, $expected_result, $this->columnMap);
111   }
112
113   /**
114    * Tests the boolean filter with grouped exposed form enabled.
115    */
116   public function testFilterGroupedExposed() {
117     $filters = $this->getGroupedExposedFilters();
118     $view = Views::getView('test_view');
119
120     $view->setExposedInput(['status' => 1]);
121     $view->setDisplay();
122     $view->displayHandlers->get('default')->overrideOption('filters', $filters);
123
124     $this->executeView($view);
125
126     $expected_result = [
127       ['id' => 1],
128       ['id' => 3],
129       ['id' => 5],
130     ];
131
132     $this->assertEqual(3, count($view->result));
133     $this->assertIdenticalResultset($view, $expected_result, $this->columnMap);
134     $view->destroy();
135
136     $view->setExposedInput(['status' => 2]);
137     $view->setDisplay();
138     $view->displayHandlers->get('default')->overrideOption('filters', $filters);
139
140     $this->executeView($view);
141
142     $expected_result = [
143       ['id' => 2],
144       ['id' => 4],
145     ];
146
147     $this->assertEqual(2, count($view->result));
148     $this->assertIdenticalResultset($view, $expected_result, $this->columnMap);
149
150     $view->destroy();
151
152     // Expecting the same results as for ['status' => 1].
153     $view->setExposedInput(['status' => 3]);
154     $view->setDisplay();
155     $view->displayHandlers->get('default')->overrideOption('filters', $filters);
156
157     $this->executeView($view);
158
159     $expected_result = [
160       ['id' => 1],
161       ['id' => 3],
162       ['id' => 5],
163     ];
164
165     $this->assertEqual(3, count($view->result));
166     $this->assertIdenticalResultset($view, $expected_result, $this->columnMap);
167   }
168
169   /**
170    * Provides grouped exposed filter configuration.
171    *
172    * @return array
173    */
174   protected function getGroupedExposedFilters() {
175     $filters = [
176       'status' => [
177         'id' => 'status',
178         'table' => 'views_test_data',
179         'field' => 'status',
180         'relationship' => 'none',
181         'exposed' => TRUE,
182         'expose' => [
183           'operator' => 'status_op',
184           'label' => 'status',
185           'identifier' => 'status',
186         ],
187         'is_grouped' => TRUE,
188         'group_info' => [
189           'label' => 'status',
190           'identifier' => 'status',
191           'default_group' => 'All',
192           'group_items' => [
193             1 => [
194               'title' => 'Active',
195               'operator' => '=',
196               'value' => '1',
197             ],
198             2 => [
199               'title' => 'Blocked',
200               'operator' => '=',
201               'value' => '0',
202             ],
203             // This group should return the same results as group 1, because it
204             // is the negation of group 2.
205             3 => [
206               'title' => 'Active (reverse)',
207               'operator' => '!=',
208               'value' => '0',
209             ],
210           ],
211         ],
212       ],
213     ];
214     return $filters;
215   }
216
217 }