Further Drupal 8.6.4 changes. Some core files were not committed before a commit...
[yaffs-website] / web / core / modules / views / tests / src / Kernel / Handler / FilterCombineTest.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 combine filter handler.
10  *
11  * @group views
12  */
13 class FilterCombineTest extends ViewsKernelTestBase {
14
15   /**
16    * {@inheritdoc}
17    */
18   public static $modules = ['entity_test'];
19
20   /**
21    * Views used by this test.
22    *
23    * @var array
24    */
25   public static $testViews = ['test_view', 'entity_test_fields'];
26
27   /**
28    * Map column names.
29    *
30    * @var array
31    */
32   protected $columnMap = [
33     'views_test_data_name' => 'name',
34     'views_test_data_job' => 'job',
35   ];
36
37   /**
38    * {@inheritdoc}
39    */
40   protected function setUp($import_test_views = TRUE) {
41     parent::setUp($import_test_views);
42
43     $this->installEntitySchema('entity_test');
44   }
45
46   public function testFilterCombineContains() {
47     $view = Views::getView('test_view');
48     $view->setDisplay();
49
50     $fields = $view->displayHandlers->get('default')->getOption('fields');
51     $view->displayHandlers->get('default')->overrideOption('fields', $fields + [
52       'job' => [
53         'id' => 'job',
54         'table' => 'views_test_data',
55         'field' => 'job',
56         'relationship' => 'none',
57       ],
58     ]);
59
60     // Change the filtering.
61     $view->displayHandlers->get('default')->overrideOption('filters', [
62       'age' => [
63         'id' => 'combine',
64         'table' => 'views',
65         'field' => 'combine',
66         'relationship' => 'none',
67         'operator' => 'contains',
68         'fields' => [
69           'name',
70           'job',
71         ],
72         'value' => 'ing',
73       ],
74     ]);
75
76     $this->executeView($view);
77     $resultset = [
78       [
79         'name' => 'John',
80         'job' => 'Singer',
81       ],
82       [
83         'name' => 'George',
84         'job' => 'Singer',
85       ],
86       [
87         'name' => 'Ringo',
88         'job' => 'Drummer',
89       ],
90       [
91         'name' => 'Ginger',
92         'job' => NULL,
93       ],
94     ];
95     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
96   }
97
98   /**
99    * Tests the Combine field filter with the 'word' operator.
100    */
101   public function testFilterCombineWord() {
102     $view = Views::getView('test_view');
103     $view->setDisplay();
104
105     $fields = $view->displayHandlers->get('default')->getOption('fields');
106     $view->displayHandlers->get('default')->overrideOption('fields', $fields + [
107         'job' => [
108           'id' => 'job',
109           'table' => 'views_test_data',
110           'field' => 'job',
111           'relationship' => 'none',
112         ],
113       ]);
114
115     // Change the filtering.
116     $view->displayHandlers->get('default')->overrideOption('filters', [
117       'age' => [
118         'id' => 'combine',
119         'table' => 'views',
120         'field' => 'combine',
121         'relationship' => 'none',
122         'operator' => 'word',
123         'fields' => [
124           'name',
125           'job',
126         ],
127         'value' => 'singer ringo',
128       ],
129     ]);
130
131     $this->executeView($view);
132     $resultset = [
133       [
134         'name' => 'John',
135         'job' => 'Singer',
136       ],
137       [
138         'name' => 'George',
139         'job' => 'Singer',
140       ],
141       [
142         'name' => 'Ringo',
143         'job' => 'Drummer',
144       ],
145     ];
146     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
147   }
148
149   /**
150    * Tests the Combine field filter with the 'allwords' operator.
151    */
152   public function testFilterCombineAllWords() {
153     $view = Views::getView('test_view');
154     $view->setDisplay();
155
156     $fields = $view->displayHandlers->get('default')->getOption('fields');
157     $view->displayHandlers->get('default')->overrideOption('fields', $fields + [
158         'job' => [
159           'id' => 'job',
160           'table' => 'views_test_data',
161           'field' => 'job',
162           'relationship' => 'none',
163         ],
164       ]);
165
166     // Set the filtering to allwords and simulate searching for a phrase.
167     $view->displayHandlers->get('default')->overrideOption('filters', [
168       'age' => [
169         'id' => 'combine',
170         'table' => 'views',
171         'field' => 'combine',
172         'relationship' => 'none',
173         'operator' => 'allwords',
174         'fields' => [
175           'name',
176           'job',
177           'age',
178         ],
179         'value' => '25 "john   singer"',
180       ],
181     ]);
182
183     $this->executeView($view);
184     $resultset = [
185       [
186         'name' => 'John',
187         'job' => 'Singer',
188       ],
189     ];
190     $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
191   }
192
193   /**
194    * Tests if the filter can handle removed fields.
195    *
196    * Tests the combined filter handler when a field overwrite is done
197    * and fields set in the combine filter are removed from the display
198    * but not from the combined filter settings.
199    */
200   public function testFilterCombineContainsFieldsOverwritten() {
201     $view = Views::getView('test_view');
202     $view->setDisplay();
203
204     $fields = $view->displayHandlers->get('default')->getOption('fields');
205     $view->displayHandlers->get('default')->overrideOption('fields', $fields + [
206       'job' => [
207         'id' => 'job',
208         'table' => 'views_test_data',
209         'field' => 'job',
210         'relationship' => 'none',
211       ],
212     ]);
213
214     // Change the filtering.
215     $view->displayHandlers->get('default')->overrideOption('filters', [
216       'age' => [
217         'id' => 'combine',
218         'table' => 'views',
219         'field' => 'combine',
220         'relationship' => 'none',
221         'operator' => 'contains',
222         'fields' => [
223           'name',
224           'job',
225           // Add a dummy field to the combined fields to simulate
226           // a removed or deleted field.
227           'dummy',
228         ],
229         'value' => 'ing',
230       ],
231     ]);
232
233     $this->executeView($view);
234     // Make sure this view will not get displayed.
235     $this->assertTrue($view->build_info['fail'], "View build has been marked as failed.");
236     // Make sure this view does not pass validation with the right error.
237     $errors = $view->validate();
238     $this->assertEquals(t('Field %field set in %filter is not set in display %display.', ['%field' => 'dummy', '%filter' => 'Global: Combine fields filter', '%display' => 'Master']), reset($errors['default']));
239   }
240
241   /**
242    * Tests that the combine field filter is not valid on displays that don't use
243    * fields.
244    */
245   public function testNonFieldsRow() {
246     $view = Views::getView('entity_test_fields');
247     $view->setDisplay();
248
249     // Set the rows to a plugin type that doesn't support fields.
250     $view->displayHandlers->get('default')->overrideOption('row', [
251       'type' => 'entity:entity_test',
252       'options' => [
253         'view_mode' => 'teaser',
254       ],
255     ]);
256     // Change the filtering.
257     $view->displayHandlers->get('default')->overrideOption('filters', [
258       'name' => [
259         'id' => 'combine',
260         'table' => 'views',
261         'field' => 'combine',
262         'relationship' => 'none',
263         'operator' => 'contains',
264         'fields' => [
265           'name',
266         ],
267         'value' => 'ing',
268       ],
269     ]);
270     $this->executeView($view);
271     $errors = $view->validate();
272     // Check that the right error is shown.
273     $this->assertEquals(t('%display: %filter can only be used on displays that use fields. Set the style or row format for that display to one using fields to use the combine field filter.', ['%filter' => 'Global: Combine fields filter', '%display' => 'Master']), reset($errors['default']));
274   }
275
276   /**
277    * Additional data to test the NULL issue.
278    */
279   protected function dataSet() {
280     $data_set = parent::dataSet();
281     $data_set[] = [
282       'name' => 'Ginger',
283       'age' => 25,
284       'job' => NULL,
285       'created' => gmmktime(0, 0, 0, 1, 2, 2000),
286       'status' => 1,
287     ];
288     return $data_set;
289   }
290
291   /**
292    * Allow {views_test_data}.job to be NULL.
293    *
294    * @internal
295    */
296   protected function schemaDefinition() {
297     $schema = parent::schemaDefinition();
298     unset($schema['views_test_data']['fields']['job']['not null']);
299     return $schema;
300   }
301
302 }