3 namespace Drupal\Tests\user\Kernel\Views;
5 use Drupal\Component\Utility\Html;
6 use Drupal\views\Views;
9 * Tests the permissions filter handler.
12 * @see \Drupal\user\Plugin\views\filter\Permissions
14 class HandlerFilterPermissionTest extends UserKernelTestBase {
17 * Views used by this test.
21 public static $testViews = ['test_filter_permission'];
26 * Tests the permission filter handler.
28 * @todo Fix the different commented out tests by fixing the many to one
29 * handler handling with the NOT operator.
31 public function testFilterPermission() {
32 $this->setupPermissionTestData();
34 $column_map = ['uid' => 'uid'];
35 $view = Views::getView('test_filter_permission');
37 // Filter by a non existing permission.
38 $view->initHandlers();
39 $view->filter['permission']->value = ['non_existent_permission'];
40 $this->executeView($view);
41 $this->assertEqual(count($view->result), 4, 'A non existent permission is not filtered so everything is the result.');
42 $expected[] = ['uid' => 1];
43 $expected[] = ['uid' => 2];
44 $expected[] = ['uid' => 3];
45 $expected[] = ['uid' => 4];
46 $this->assertIdenticalResultset($view, $expected, $column_map);
49 // Filter by a permission.
50 $view->initHandlers();
51 $view->filter['permission']->value = ['administer permissions'];
52 $this->executeView($view);
53 $this->assertEqual(count($view->result), 2);
55 $expected[] = ['uid' => 3];
56 $expected[] = ['uid' => 4];
57 $this->assertIdenticalResultset($view, $expected, $column_map);
60 // Filter by not a permission.
61 $view->initHandlers();
62 $view->filter['permission']->operator = 'not';
63 $view->filter['permission']->value = ['administer users'];
64 $this->executeView($view);
65 $this->assertEqual(count($view->result), 3);
67 $expected[] = ['uid' => 1];
68 $expected[] = ['uid' => 2];
69 $expected[] = ['uid' => 3];
70 $this->assertIdenticalResultset($view, $expected, $column_map);
73 // Filter by not multiple permissions, that are present in multiple roles.
74 $view->initHandlers();
75 $view->filter['permission']->operator = 'not';
76 $view->filter['permission']->value = ['administer users', 'administer permissions'];
77 $this->executeView($view);
78 $this->assertEqual(count($view->result), 2);
80 $expected[] = ['uid' => 1];
81 $expected[] = ['uid' => 2];
82 $this->assertIdenticalResultset($view, $expected, $column_map);
85 // Filter by another permission of a role with multiple permissions.
86 $view->initHandlers();
87 $view->filter['permission']->value = ['administer users'];
88 $this->executeView($view);
89 $this->assertEqual(count($view->result), 1);
91 $expected[] = ['uid' => 4];
92 $this->assertIdenticalResultset($view, $expected, $column_map);
96 $view->initHandlers();
98 // Test the value options.
99 $value_options = $view->filter['permission']->getValueOptions();
101 $permission_by_module = [];
102 $permissions = \Drupal::service('user.permissions')->getPermissions();
103 foreach ($permissions as $name => $permission) {
104 $permission_by_module[$permission['provider']][$name] = $permission;
106 foreach (['system' => 'System', 'user' => 'User'] as $module => $title) {
107 $expected = array_map(function ($permission) {
108 return Html::escape(strip_tags($permission['title']));
109 }, $permission_by_module[$module]);
111 $this->assertEqual($expected, $value_options[$title], 'Ensure the all permissions are available');