You are here

public function HandlerFilterPermissionTest::testFilterPermission in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/user/tests/src/Kernel/Views/HandlerFilterPermissionTest.php \Drupal\Tests\user\Kernel\Views\HandlerFilterPermissionTest::testFilterPermission()

Tests the permission filter handler.

@todo Fix the different commented out tests by fixing the many to one handler handling with the NOT operator.

File

core/modules/user/tests/src/Kernel/Views/HandlerFilterPermissionTest.php, line 31

Class

HandlerFilterPermissionTest
Tests the permissions filter handler.

Namespace

Drupal\Tests\user\Kernel\Views

Code

public function testFilterPermission() {
  $this
    ->setupPermissionTestData();
  $column_map = [
    'uid' => 'uid',
  ];
  $view = Views::getView('test_filter_permission');

  // Filter by a non existing permission.
  $view
    ->initHandlers();
  $view->filter['permission']->value = [
    'non_existent_permission',
  ];
  $this
    ->executeView($view);
  $this
    ->assertCount(4, $view->result, 'A non existent permission is not filtered so everything is the result.');
  $expected[] = [
    'uid' => 1,
  ];
  $expected[] = [
    'uid' => 2,
  ];
  $expected[] = [
    'uid' => 3,
  ];
  $expected[] = [
    'uid' => 4,
  ];
  $this
    ->assertIdenticalResultset($view, $expected, $column_map);
  $view
    ->destroy();

  // Filter by a permission.
  $view
    ->initHandlers();
  $view->filter['permission']->value = [
    'administer permissions',
  ];
  $this
    ->executeView($view);
  $this
    ->assertCount(2, $view->result);
  $expected = [];
  $expected[] = [
    'uid' => 3,
  ];
  $expected[] = [
    'uid' => 4,
  ];
  $this
    ->assertIdenticalResultset($view, $expected, $column_map);
  $view
    ->destroy();

  // Filter by not a permission.
  $view
    ->initHandlers();
  $view->filter['permission']->operator = 'not';
  $view->filter['permission']->value = [
    'administer users',
  ];
  $this
    ->executeView($view);
  $this
    ->assertCount(3, $view->result);
  $expected = [];
  $expected[] = [
    'uid' => 1,
  ];
  $expected[] = [
    'uid' => 2,
  ];
  $expected[] = [
    'uid' => 3,
  ];
  $this
    ->assertIdenticalResultset($view, $expected, $column_map);
  $view
    ->destroy();

  // Filter by not multiple permissions, that are present in multiple roles.
  $view
    ->initHandlers();
  $view->filter['permission']->operator = 'not';
  $view->filter['permission']->value = [
    'administer users',
    'administer permissions',
  ];
  $this
    ->executeView($view);
  $this
    ->assertCount(2, $view->result);
  $expected = [];
  $expected[] = [
    'uid' => 1,
  ];
  $expected[] = [
    'uid' => 2,
  ];
  $this
    ->assertIdenticalResultset($view, $expected, $column_map);
  $view
    ->destroy();

  // Filter by another permission of a role with multiple permissions.
  $view
    ->initHandlers();
  $view->filter['permission']->value = [
    'administer users',
  ];
  $this
    ->executeView($view);
  $this
    ->assertCount(1, $view->result);
  $expected = [];
  $expected[] = [
    'uid' => 4,
  ];
  $this
    ->assertIdenticalResultset($view, $expected, $column_map);
  $view
    ->destroy();
  $view
    ->initDisplay();
  $view
    ->initHandlers();

  // Test the value options.
  $value_options = $view->filter['permission']
    ->getValueOptions();
  $permission_by_module = [];
  $permissions = \Drupal::service('user.permissions')
    ->getPermissions();
  foreach ($permissions as $name => $permission) {
    $permission_by_module[$permission['provider']][$name] = $permission;
  }
  foreach ([
    'system' => 'System',
    'user' => 'User',
  ] as $module => $title) {
    $expected = array_map(function ($permission) {
      return Html::escape(strip_tags($permission['title']));
    }, $permission_by_module[$module]);
    $this
      ->assertEqual($expected, $value_options[$title], 'Ensure the all permissions are available');
  }
}