Updated Drupal to 8.6. This goes with the following updates because it's possible...
[yaffs-website] / web / core / modules / user / tests / src / Functional / UserPermissionsTest.php
1 <?php
2
3 namespace Drupal\Tests\user\Functional;
4
5 use Drupal\Tests\BrowserTestBase;
6 use Drupal\user\RoleInterface;
7 use Drupal\user\Entity\Role;
8
9 /**
10  * Verify that role permissions can be added and removed via the permissions
11  * page.
12  *
13  * @group user
14  */
15 class UserPermissionsTest extends BrowserTestBase {
16
17   /**
18    * User with admin privileges.
19    *
20    * @var \Drupal\user\UserInterface
21    */
22   protected $adminUser;
23
24   /**
25    * User's role ID.
26    *
27    * @var string
28    */
29   protected $rid;
30
31   protected function setUp() {
32     parent::setUp();
33
34     $this->adminUser = $this->drupalCreateUser(['administer permissions', 'access user profiles', 'administer site configuration', 'administer modules', 'administer account settings']);
35
36     // Find the new role ID.
37     $all_rids = $this->adminUser->getRoles();
38     unset($all_rids[array_search(RoleInterface::AUTHENTICATED_ID, $all_rids)]);
39     $this->rid = reset($all_rids);
40   }
41
42   /**
43    * Test changing user permissions through the permissions page.
44    */
45   public function testUserPermissionChanges() {
46     $permissions_hash_generator = $this->container->get('user_permissions_hash_generator');
47
48     $storage = $this->container->get('entity.manager')->getStorage('user_role');
49
50     // Create an additional role and mark it as admin role.
51     Role::create(['is_admin' => TRUE, 'id' => 'administrator', 'label' => 'Administrator'])->save();
52     $storage->resetCache();
53
54     $this->drupalLogin($this->adminUser);
55     $rid = $this->rid;
56     $account = $this->adminUser;
57     $previous_permissions_hash = $permissions_hash_generator->generate($account);
58     $this->assertIdentical($previous_permissions_hash, $permissions_hash_generator->generate($this->loggedInUser));
59
60     // Add a permission.
61     $this->assertFalse($account->hasPermission('administer users'), 'User does not have "administer users" permission.');
62     $edit = [];
63     $edit[$rid . '[administer users]'] = TRUE;
64     $this->drupalPostForm('admin/people/permissions', $edit, t('Save permissions'));
65     $this->assertText(t('The changes have been saved.'), 'Successful save message displayed.');
66     $storage->resetCache();
67     $this->assertTrue($account->hasPermission('administer users'), 'User now has "administer users" permission.');
68     $current_permissions_hash = $permissions_hash_generator->generate($account);
69     $this->assertIdentical($current_permissions_hash, $permissions_hash_generator->generate($this->loggedInUser));
70     $this->assertNotEqual($previous_permissions_hash, $current_permissions_hash, 'Permissions hash has changed.');
71     $previous_permissions_hash = $current_permissions_hash;
72
73     // Remove a permission.
74     $this->assertTrue($account->hasPermission('access user profiles'), 'User has "access user profiles" permission.');
75     $edit = [];
76     $edit[$rid . '[access user profiles]'] = FALSE;
77     $this->drupalPostForm('admin/people/permissions', $edit, t('Save permissions'));
78     $this->assertText(t('The changes have been saved.'), 'Successful save message displayed.');
79     $storage->resetCache();
80     $this->assertFalse($account->hasPermission('access user profiles'), 'User no longer has "access user profiles" permission.');
81     $current_permissions_hash = $permissions_hash_generator->generate($account);
82     $this->assertIdentical($current_permissions_hash, $permissions_hash_generator->generate($this->loggedInUser));
83     $this->assertNotEqual($previous_permissions_hash, $current_permissions_hash, 'Permissions hash has changed.');
84
85     // Ensure that the admin role doesn't have any checkboxes.
86     $this->drupalGet('admin/people/permissions');
87     foreach (array_keys($this->container->get('user.permissions')->getPermissions()) as $permission) {
88       $this->assertSession()->checkboxChecked('administrator[' . $permission . ']');
89       $this->assertSession()->fieldDisabled('administrator[' . $permission . ']');
90     }
91   }
92
93   /**
94    * Test assigning of permissions for the administrator role.
95    */
96   public function testAdministratorRole() {
97     $this->drupalLogin($this->adminUser);
98     $this->drupalGet('admin/config/people/accounts');
99
100     // Verify that the administration role is none by default.
101     $this->assertOptionSelected('edit-user-admin-role', '', 'Administration role defaults to none.');
102
103     $this->assertFalse(Role::load($this->rid)->isAdmin());
104
105     // Set the user's role to be the administrator role.
106     $edit = [];
107     $edit['user_admin_role'] = $this->rid;
108     $this->drupalPostForm('admin/config/people/accounts', $edit, t('Save configuration'));
109
110     \Drupal::entityManager()->getStorage('user_role')->resetCache();
111     $this->assertTrue(Role::load($this->rid)->isAdmin());
112
113     // Enable aggregator module and ensure the 'administer news feeds'
114     // permission is assigned by default.
115     \Drupal::service('module_installer')->install(['aggregator']);
116
117     $this->assertTrue($this->adminUser->hasPermission('administer news feeds'), 'The permission was automatically assigned to the administrator role');
118
119     // Ensure that selecting '- None -' removes the admin role.
120     $edit = [];
121     $edit['user_admin_role'] = '';
122     $this->drupalPostForm('admin/config/people/accounts', $edit, t('Save configuration'));
123
124     \Drupal::entityManager()->getStorage('user_role')->resetCache();
125     \Drupal::configFactory()->reset();
126     $this->assertFalse(Role::load($this->rid)->isAdmin());
127
128     // Manually create two admin roles, in that case the single select should be
129     // hidden.
130     Role::create(['id' => 'admin_role_0', 'is_admin' => TRUE, 'label' => 'Admin role 0'])->save();
131     Role::create(['id' => 'admin_role_1', 'is_admin' => TRUE, 'label' => 'Admin role 1'])->save();
132     $this->drupalGet('admin/config/people/accounts');
133     $this->assertNoFieldByName('user_admin_role');
134   }
135
136   /**
137    * Verify proper permission changes by user_role_change_permissions().
138    */
139   public function testUserRoleChangePermissions() {
140     $permissions_hash_generator = $this->container->get('user_permissions_hash_generator');
141
142     $rid = $this->rid;
143     $account = $this->adminUser;
144     $previous_permissions_hash = $permissions_hash_generator->generate($account);
145
146     // Verify current permissions.
147     $this->assertFalse($account->hasPermission('administer users'), 'User does not have "administer users" permission.');
148     $this->assertTrue($account->hasPermission('access user profiles'), 'User has "access user profiles" permission.');
149     $this->assertTrue($account->hasPermission('administer site configuration'), 'User has "administer site configuration" permission.');
150
151     // Change permissions.
152     $permissions = [
153       'administer users' => 1,
154       'access user profiles' => 0,
155     ];
156     user_role_change_permissions($rid, $permissions);
157
158     // Verify proper permission changes.
159     $this->assertTrue($account->hasPermission('administer users'), 'User now has "administer users" permission.');
160     $this->assertFalse($account->hasPermission('access user profiles'), 'User no longer has "access user profiles" permission.');
161     $this->assertTrue($account->hasPermission('administer site configuration'), 'User still has "administer site configuration" permission.');
162
163     // Verify the permissions hash has changed.
164     $current_permissions_hash = $permissions_hash_generator->generate($account);
165     $this->assertNotEqual($previous_permissions_hash, $current_permissions_hash, 'Permissions hash has changed.');
166   }
167
168   /**
169    * Verify 'access content' is listed in the correct location.
170    */
171   public function testAccessContentPermission() {
172     $this->drupalLogin($this->adminUser);
173
174     // When Node is not installed the 'access content' permission is listed next
175     // to 'access site reports'.
176     $this->drupalGet('admin/people/permissions');
177     $next_row = $this->xpath('//tr[@data-drupal-selector=\'edit-permissions-access-content\']/following-sibling::tr[1]');
178     $this->assertEqual('edit-permissions-access-site-reports', $next_row[0]->getAttribute('data-drupal-selector'));
179
180     // When Node is installed the 'access content' permission is listed next to
181     // to 'view own unpublished content'.
182     \Drupal::service('module_installer')->install(['node']);
183     $this->drupalGet('admin/people/permissions');
184     $next_row = $this->xpath('//tr[@data-drupal-selector=\'edit-permissions-access-content\']/following-sibling::tr[1]');
185     $this->assertEqual('edit-permissions-view-own-unpublished-content', $next_row[0]->getAttribute('data-drupal-selector'));
186   }
187
188 }