FilterTest.php

Same filename in this branch
  1. 11.x core/modules/jsonapi/tests/src/Kernel/Query/FilterTest.php
  2. 11.x core/modules/views/tests/src/FunctionalJavascript/Plugin/views/Handler/FilterTest.php
  3. 11.x core/modules/views/tests/modules/views_test_data/src/Plugin/views/filter/FilterTest.php
Same filename and directory in other branches
  1. 9 core/modules/jsonapi/tests/src/Kernel/Query/FilterTest.php
  2. 9 core/modules/views/tests/src/FunctionalJavascript/Plugin/views/Handler/FilterTest.php
  3. 9 core/modules/views/tests/src/Functional/Plugin/FilterTest.php
  4. 9 core/modules/views/tests/modules/views_test_data/src/Plugin/views/filter/FilterTest.php
  5. 8.9.x core/modules/jsonapi/tests/src/Kernel/Query/FilterTest.php
  6. 8.9.x core/modules/views/tests/src/Functional/Plugin/FilterTest.php
  7. 8.9.x core/modules/views/tests/modules/views_test_data/src/Plugin/views/filter/FilterTest.php
  8. 10 core/modules/jsonapi/tests/src/Kernel/Query/FilterTest.php
  9. 10 core/modules/views/tests/src/FunctionalJavascript/Plugin/views/Handler/FilterTest.php
  10. 10 core/modules/views/tests/src/Functional/Plugin/FilterTest.php
  11. 10 core/modules/views/tests/modules/views_test_data/src/Plugin/views/filter/FilterTest.php

Namespace

Drupal\Tests\views\Functional\Plugin

File

core/modules/views/tests/src/Functional/Plugin/FilterTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\views\Functional\Plugin;

use Drupal\Tests\views\Functional\ViewTestBase;
use Drupal\views\Views;
use Drupal\views_test_data\Plugin\views\filter\FilterTest as FilterPlugin;

/**
 * Tests general filter plugin functionality.
 *
 * @group views
 * @see \Drupal\views\Plugin\views\filter\FilterPluginBase
 */
class FilterTest extends ViewTestBase {
  
  /**
   * Views used by this test.
   *
   * @var array
   */
  public static $testViews = [
    'test_filter',
    'test_filter_in_operator_ui',
  ];
  
  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'views_ui',
    'node',
  ];
  
  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';
  
  /**
   * {@inheritdoc}
   */
  protected function setUp($import_test_views = TRUE, $modules = [
    'views_test_config',
  ]) : void {
    parent::setUp($import_test_views, $modules);
    $this->enableViewsTestModule();
    $this->drupalLogin($this->drupalCreateUser([
      'administer views',
    ]));
    $this->drupalCreateContentType([
      'type' => 'article',
      'name' => 'Article',
    ]);
    $this->drupalCreateContentType([
      'type' => 'page',
      'name' => 'Page',
    ]);
  }
  
  /**
   * {@inheritdoc}
   */
  protected function viewsData() {
    $data = parent::viewsData();
    $data['views_test_data']['name']['filter']['id'] = 'test_filter';
    return $data;
  }
  
  /**
   * Tests query of the row plugin.
   */
  public function testFilterQuery() : void {
    // Check that we can find the test filter plugin.
    $plugin = $this->container
      ->get('plugin.manager.views.filter')
      ->createInstance('test_filter');
    $this->assertInstanceOf(FilterPlugin::class, $plugin);
    $view = Views::getView('test_filter');
    $view->initDisplay();
    // Change the filtering.
    $view->displayHandlers
      ->get('default')
      ->overrideOption('filters', [
      'test_filter' => [
        'id' => 'test_filter',
        'table' => 'views_test_data',
        'field' => 'name',
        'operator' => '=',
        'value' => 'John',
        'group' => 0,
      ],
    ]);
    $this->executeView($view);
    // Make sure the query have where data.
    $this->assertNotEmpty($view->query->where);
    // Check the data added.
    $where = $view->query->where;
    $this->assertSame('views_test_data.name', $where[0]['conditions'][0]['field'], 'Where condition field matches');
    $this->assertSame('John', $where[0]['conditions'][0]['value'], 'Where condition value matches');
    $this->assertSame('=', $where[0]['conditions'][0]['operator'], 'Where condition operator matches');
    $this->executeView($view);
    // Check that our operator and value match on the filter.
    $this->assertSame('=', $view->filter['test_filter']->operator);
    $this->assertSame('John', $view->filter['test_filter']->value);
    // Check that we have a single element, as a result of applying the '= John'
    // filter.
    $this->assertCount(1, $view->result, 'Results were returned. ' . count($view->result) . ' results.');
    $view->destroy();
    $view->initDisplay();
    // Change the filtering.
    $view->displayHandlers
      ->get('default')
      ->overrideOption('filters', [
      'test_filter' => [
        'id' => 'test_filter',
        'table' => 'views_test_data',
        'field' => 'name',
        'operator' => '<>',
        'value' => 'John',
        'group' => 0,
      ],
    ]);
    $this->executeView($view);
    // Check that our operator and value match on the filter.
    $this->assertSame('<>', $view->filter['test_filter']->operator);
    $this->assertSame('John', $view->filter['test_filter']->value);
    // Check if we have the other elements in the dataset, as a result of
    // applying the '<> John' filter.
    $this->assertCount(4, $view->result, 'Results were returned. ' . count($view->result) . ' results.');
    $view->destroy();
    $view->initDisplay();
    // Set the test_enable option to FALSE. The 'where' clause should not be
    // added to the query.
    $view->displayHandlers
      ->get('default')
      ->overrideOption('filters', [
      'test_filter' => [
        'id' => 'test_filter',
        'table' => 'views_test_data',
        'field' => 'name',
        'operator' => '<>',
        'value' => 'John',
        'group' => 0,
        // Disable this option, so nothing should be added to the query.
'test_enable' => FALSE,
      ],
    ]);
    // Execute the view again.
    $this->executeView($view);
    // Check if we have all 5 results.
    $this->assertCount(5, $view->result, 'All ' . count($view->displayHandlers) . ' results returned');
  }
  
  /**
   * Tests an exposed filter when all options are selected.
   */
  public function testInOperatorSelectAllOptions() : void {
    $row['row[type]'] = 'fields';
    $this->drupalGet('admin/structure/views/nojs/display/test_filter_in_operator_ui/default/row');
    $this->submitForm($row, 'Apply');
    $field['name[node_field_data.nid]'] = TRUE;
    $this->drupalGet('admin/structure/views/nojs/add-handler/test_filter_in_operator_ui/default/field');
    $this->submitForm($field, 'Add and configure fields');
    $this->drupalGet('admin/structure/views/nojs/handler/test_filter_in_operator_ui/default/field/nid');
    $this->submitForm([], 'Apply');
    $edit['options[value][all]'] = TRUE;
    $edit['options[value][article]'] = TRUE;
    $edit['options[value][page]'] = TRUE;
    $this->drupalGet('admin/structure/views/nojs/handler/test_filter_in_operator_ui/default/filter/type');
    $this->submitForm($edit, 'Apply');
    $this->drupalGet('admin/structure/views/view/test_filter_in_operator_ui/edit/default');
    $this->submitForm([], 'Save');
    $this->submitForm([], 'Update preview');
    $this->assertSession()
      ->pageTextNotContains('The submitted value "page" in the Type element is not allowed.');
  }
  
  /**
   * Tests the limit of the expose operator functionality.
   */
  public function testLimitExposedOperators() : void {
    $this->drupalGet('test_filter_in_operator_ui');
    $this->assertSession()
      ->statusCodeEquals(200);
    $this->assertSession()
      ->optionExists('edit-nid-op', '<');
    $this->assertSession()
      ->optionExists('edit-nid-op', '<=');
    $this->assertSession()
      ->optionExists('edit-nid-op', '=');
    $this->assertSession()
      ->optionNotExists('edit-nid-op', '>');
    $this->assertSession()
      ->optionNotExists('edit-nid-op', '>=');
    // Because there are not operators that use the min and max fields, those
    // fields should not be in the exposed form.
    $this->assertSession()
      ->fieldExists('edit-nid-value');
    $this->assertSession()
      ->fieldNotExists('edit-nid-min');
    $this->assertSession()
      ->fieldNotExists('edit-nid-max');
    $edit = [];
    $edit['options[operator]'] = '>';
    $edit['options[expose][operator_list][]'] = [
      '>',
      '>=',
      'between',
    ];
    $this->drupalGet('admin/structure/views/nojs/handler/test_filter_in_operator_ui/default/filter/nid');
    $this->submitForm($edit, 'Apply');
    $this->drupalGet('admin/structure/views/view/test_filter_in_operator_ui/edit/default');
    $this->submitForm([], 'Save');
    $this->drupalGet('test_filter_in_operator_ui');
    $this->assertSession()
      ->statusCodeEquals(200);
    $this->assertSession()
      ->optionNotExists('edit-nid-op', '<');
    $this->assertSession()
      ->optionNotExists('edit-nid-op', '<=');
    $this->assertSession()
      ->optionNotExists('edit-nid-op', '=');
    $this->assertSession()
      ->optionExists('edit-nid-op', '>');
    $this->assertSession()
      ->optionExists('edit-nid-op', '>=');
    $this->assertSession()
      ->fieldExists('edit-nid-value');
    $this->assertSession()
      ->fieldExists('edit-nid-min');
    $this->assertSession()
      ->fieldExists('edit-nid-max');
    // Set the default to an excluded operator.
    $edit = [];
    $edit['options[operator]'] = '=';
    $edit['options[expose][operator_list][]'] = [
      '<',
      '>',
    ];
    $this->drupalGet('admin/structure/views/nojs/handler/test_filter_in_operator_ui/default/filter/nid');
    $this->submitForm($edit, 'Apply');
    $this->assertSession()
      ->pageTextContains('You selected the "Is equal to" operator as the default value but is not included in the list of limited operators.');
  }
  
  /**
   * Tests that disabled user roles of the "Remember the last selection" functionality are removed on save.
   */
  public function testRememberUserRoles() : void {
    // Create a view for user entity and add settings for a role filter.
    $post_data = [];
    $post_data['label'] = $this->randomMachineName(16);
    $post_data['id'] = 'user_list_view';
    $post_data['description'] = $this->randomMachineName(16);
    $post_data['show[wizard_key]'] = 'users';
    $post_data['page[create]'] = 1;
    $post_data['page[title]'] = $this->randomMachineName(16);
    $post_data['page[path]'] = '/user_list_view';
    $this->drupalGet('admin/structure/views/add');
    $this->submitForm($post_data, 'Save and edit');
    $this->assertEquals($post_data['page[path]'], $this->cssSelect('#views-page-1-path')[0]
      ->getText());
    // Add Role exposed filter.
    $this->drupalGet('admin/structure/views/nojs/add-handler/user_list_view/page_1/filter');
    $this->submitForm([
      'name[user__roles.roles_target_id]' => TRUE,
    ], 'Add and configure filter criteria');
    $edit = [
      'options[expose_button][checkbox][checkbox]' => TRUE,
    ];
    $this->drupalGet('admin/structure/views/nojs/handler/user_list_view/page_1/filter/roles_target_id');
    $this->submitForm($edit, 'Expose filter');
    $this->submitForm($edit, 'Apply');
    $this->clickLink('User: Roles (exposed)');
    $role_id = $this->drupalCreateRole([]);
    $this->assertSession()
      ->checkboxChecked('options[expose_button][checkbox][checkbox]');
    $expose_settings = [
      'options[expose][remember]' => 1,
      "options[expose][remember_roles][{$role_id}]" => $role_id,
      "options[expose][remember_roles][anonymous]" => '0',
      "options[expose][remember_roles][authenticated]" => '0',
    ];
    $this->drupalGet('admin/structure/views/nojs/handler/user_list_view/page_1/filter/roles_target_id');
    $this->submitForm($expose_settings, 'Apply');
    $this->drupalGet('admin/structure/views/view/user_list_view/edit/page_1');
    $this->submitForm([], 'Save');
    // Load view and check settings.
    $view = Views::getView('user_list_view');
    $view->setDisplay('page_1');
    $result = $view->display_handler
      ->getOption('filters')['roles_target_id']['expose']['remember_roles'];
    $expected = [
      $role_id => $role_id,
    ];
    $this->assertSame($expected, $result);
  }

}

Classes

Title Deprecated Summary
FilterTest Tests general filter plugin functionality.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.