3 namespace Drupal\Tests\views\Kernel\Handler;
5 use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
6 use Drupal\views\Views;
9 * Tests the combine filter handler.
13 class FilterCombineTest extends ViewsKernelTestBase {
18 public static $modules = ['entity_test'];
21 * Views used by this test.
25 public static $testViews = ['test_view', 'entity_test_fields'];
32 protected $columnMap = [
33 'views_test_data_name' => 'name',
34 'views_test_data_job' => 'job',
40 protected function setUp($import_test_views = TRUE) {
41 parent::setUp($import_test_views);
43 $this->installEntitySchema('entity_test');
46 public function testFilterCombineContains() {
47 $view = Views::getView('test_view');
50 $fields = $view->displayHandlers->get('default')->getOption('fields');
51 $view->displayHandlers->get('default')->overrideOption('fields', $fields + [
54 'table' => 'views_test_data',
56 'relationship' => 'none',
60 // Change the filtering.
61 $view->displayHandlers->get('default')->overrideOption('filters', [
66 'relationship' => 'none',
67 'operator' => 'contains',
76 $this->executeView($view);
95 $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
99 * Tests the Combine field filter with the 'word' operator.
101 public function testFilterCombineWord() {
102 $view = Views::getView('test_view');
105 $fields = $view->displayHandlers->get('default')->getOption('fields');
106 $view->displayHandlers->get('default')->overrideOption('fields', $fields + [
109 'table' => 'views_test_data',
111 'relationship' => 'none',
115 // Change the filtering.
116 $view->displayHandlers->get('default')->overrideOption('filters', [
120 'field' => 'combine',
121 'relationship' => 'none',
122 'operator' => 'word',
127 'value' => 'singer ringo',
131 $this->executeView($view);
146 $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
150 * Tests the Combine field filter with the 'allwords' operator.
152 public function testFilterCombineAllWords() {
153 $view = Views::getView('test_view');
156 $fields = $view->displayHandlers->get('default')->getOption('fields');
157 $view->displayHandlers->get('default')->overrideOption('fields', $fields + [
160 'table' => 'views_test_data',
162 'relationship' => 'none',
166 // Set the filtering to allwords and simulate searching for a phrase.
167 $view->displayHandlers->get('default')->overrideOption('filters', [
171 'field' => 'combine',
172 'relationship' => 'none',
173 'operator' => 'allwords',
179 'value' => '25 "john singer"',
183 $this->executeView($view);
190 $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
194 * Tests if the filter can handle removed fields.
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.
200 public function testFilterCombineContainsFieldsOverwritten() {
201 $view = Views::getView('test_view');
204 $fields = $view->displayHandlers->get('default')->getOption('fields');
205 $view->displayHandlers->get('default')->overrideOption('fields', $fields + [
208 'table' => 'views_test_data',
210 'relationship' => 'none',
214 // Change the filtering.
215 $view->displayHandlers->get('default')->overrideOption('filters', [
219 'field' => 'combine',
220 'relationship' => 'none',
221 'operator' => 'contains',
225 // Add a dummy field to the combined fields to simulate
226 // a removed or deleted field.
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']));
242 * Tests that the combine field filter is not valid on displays that don't use
245 public function testNonFieldsRow() {
246 $view = Views::getView('entity_test_fields');
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',
253 'view_mode' => 'teaser',
256 // Change the filtering.
257 $view->displayHandlers->get('default')->overrideOption('filters', [
261 'field' => 'combine',
262 'relationship' => 'none',
263 'operator' => 'contains',
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']));
277 * Additional data to test the NULL issue.
279 protected function dataSet() {
280 $data_set = parent::dataSet();
285 'created' => gmmktime(0, 0, 0, 1, 2, 2000),
292 * Allow {views_test_data}.job to be NULL.
296 protected function schemaDefinition() {
297 $schema = parent::schemaDefinition();
298 unset($schema['views_test_data']['fields']['job']['not null']);