annotate core/modules/user/tests/src/Traits/UserCreationTrait.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 129ea1e6d783
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\Tests\user\Traits;
Chris@0 4
Chris@0 5 use Drupal\Component\Utility\SafeMarkup;
Chris@0 6 use Drupal\Core\Session\AccountInterface;
Chris@0 7 use Drupal\user\Entity\Role;
Chris@0 8 use Drupal\user\Entity\User;
Chris@0 9 use Drupal\user\RoleInterface;
Chris@0 10
Chris@0 11 /**
Chris@0 12 * Provides methods to create additional test users and switch the currently
Chris@0 13 * logged in one.
Chris@0 14 *
Chris@0 15 * This trait is meant to be used only by test classes.
Chris@0 16 */
Chris@0 17 trait UserCreationTrait {
Chris@0 18
Chris@0 19 /**
Chris@0 20 * Switch the current logged in user.
Chris@0 21 *
Chris@0 22 * @param \Drupal\Core\Session\AccountInterface $account
Chris@0 23 * The user account object.
Chris@0 24 */
Chris@0 25 protected function setCurrentUser(AccountInterface $account) {
Chris@0 26 \Drupal::currentUser()->setAccount($account);
Chris@0 27 }
Chris@0 28
Chris@0 29 /**
Chris@0 30 * Create a user with a given set of permissions.
Chris@0 31 *
Chris@0 32 * @param array $permissions
Chris@0 33 * Array of permission names to assign to user. Note that the user always
Chris@0 34 * has the default permissions derived from the "authenticated users" role.
Chris@0 35 * @param string $name
Chris@0 36 * The user name.
Chris@0 37 * @param bool $admin
Chris@0 38 * (optional) Whether the user should be an administrator
Chris@0 39 * with all the available permissions.
Chris@0 40 *
Chris@0 41 * @return \Drupal\user\Entity\User|false
Chris@0 42 * A fully loaded user object with pass_raw property, or FALSE if account
Chris@0 43 * creation fails.
Chris@0 44 */
Chris@0 45 protected function createUser(array $permissions = [], $name = NULL, $admin = FALSE) {
Chris@0 46 // Create a role with the given permission set, if any.
Chris@0 47 $rid = FALSE;
Chris@0 48 if ($permissions) {
Chris@0 49 $rid = $this->createRole($permissions);
Chris@0 50 if (!$rid) {
Chris@0 51 return FALSE;
Chris@0 52 }
Chris@0 53 }
Chris@0 54
Chris@0 55 // Create a user assigned to that role.
Chris@0 56 $edit = [];
Chris@0 57 $edit['name'] = !empty($name) ? $name : $this->randomMachineName();
Chris@0 58 $edit['mail'] = $edit['name'] . '@example.com';
Chris@0 59 $edit['pass'] = user_password();
Chris@0 60 $edit['status'] = 1;
Chris@0 61 if ($rid) {
Chris@0 62 $edit['roles'] = [$rid];
Chris@0 63 }
Chris@0 64
Chris@0 65 if ($admin) {
Chris@0 66 $edit['roles'][] = $this->createAdminRole();
Chris@0 67 }
Chris@0 68
Chris@0 69 $account = User::create($edit);
Chris@0 70 $account->save();
Chris@0 71
Chris@0 72 $this->assertTrue($account->id(), SafeMarkup::format('User created with name %name and pass %pass', ['%name' => $edit['name'], '%pass' => $edit['pass']]), 'User login');
Chris@0 73 if (!$account->id()) {
Chris@0 74 return FALSE;
Chris@0 75 }
Chris@0 76
Chris@0 77 // Add the raw password so that we can log in as this user.
Chris@0 78 $account->pass_raw = $edit['pass'];
Chris@0 79 // Support BrowserTestBase as well.
Chris@0 80 $account->passRaw = $account->pass_raw;
Chris@0 81 return $account;
Chris@0 82 }
Chris@0 83
Chris@0 84 /**
Chris@0 85 * Creates an administrative role.
Chris@0 86 *
Chris@0 87 * @param string $rid
Chris@0 88 * (optional) The role ID (machine name). Defaults to a random name.
Chris@0 89 * @param string $name
Chris@0 90 * (optional) The label for the role. Defaults to a random string.
Chris@0 91 * @param int $weight
Chris@0 92 * (optional) The weight for the role. Defaults NULL so that entity_create()
Chris@0 93 * sets the weight to maximum + 1.
Chris@0 94 *
Chris@0 95 * @return string
Chris@0 96 * Role ID of newly created role, or FALSE if role creation failed.
Chris@0 97 */
Chris@0 98 protected function createAdminRole($rid = NULL, $name = NULL, $weight = NULL) {
Chris@0 99 $rid = $this->createRole([], $rid, $name, $weight);
Chris@0 100 if ($rid) {
Chris@0 101 /** @var \Drupal\user\RoleInterface $role */
Chris@0 102 $role = Role::load($rid);
Chris@0 103 $role->setIsAdmin(TRUE);
Chris@0 104 $role->save();
Chris@0 105 }
Chris@0 106 return $rid;
Chris@0 107 }
Chris@0 108
Chris@0 109 /**
Chris@0 110 * Creates a role with specified permissions.
Chris@0 111 *
Chris@0 112 * @param array $permissions
Chris@0 113 * Array of permission names to assign to role.
Chris@0 114 * @param string $rid
Chris@0 115 * (optional) The role ID (machine name). Defaults to a random name.
Chris@0 116 * @param string $name
Chris@0 117 * (optional) The label for the role. Defaults to a random string.
Chris@0 118 * @param int $weight
Chris@0 119 * (optional) The weight for the role. Defaults NULL so that entity_create()
Chris@0 120 * sets the weight to maximum + 1.
Chris@0 121 *
Chris@0 122 * @return string
Chris@0 123 * Role ID of newly created role, or FALSE if role creation failed.
Chris@0 124 */
Chris@0 125 protected function createRole(array $permissions, $rid = NULL, $name = NULL, $weight = NULL) {
Chris@0 126 // Generate a random, lowercase machine name if none was passed.
Chris@0 127 if (!isset($rid)) {
Chris@0 128 $rid = strtolower($this->randomMachineName(8));
Chris@0 129 }
Chris@0 130 // Generate a random label.
Chris@0 131 if (!isset($name)) {
Chris@0 132 // In the role UI role names are trimmed and random string can start or
Chris@0 133 // end with a space.
Chris@0 134 $name = trim($this->randomString(8));
Chris@0 135 }
Chris@0 136
Chris@0 137 // Check the all the permissions strings are valid.
Chris@0 138 if (!$this->checkPermissions($permissions)) {
Chris@0 139 return FALSE;
Chris@0 140 }
Chris@0 141
Chris@0 142 // Create new role.
Chris@0 143 $role = Role::create([
Chris@0 144 'id' => $rid,
Chris@0 145 'label' => $name,
Chris@0 146 ]);
Chris@0 147 if (isset($weight)) {
Chris@0 148 $role->set('weight', $weight);
Chris@0 149 }
Chris@0 150 $result = $role->save();
Chris@0 151
Chris@0 152 $this->assertIdentical($result, SAVED_NEW, SafeMarkup::format('Created role ID @rid with name @name.', [
Chris@0 153 '@name' => var_export($role->label(), TRUE),
Chris@0 154 '@rid' => var_export($role->id(), TRUE),
Chris@0 155 ]), 'Role');
Chris@0 156
Chris@0 157 if ($result === SAVED_NEW) {
Chris@0 158 // Grant the specified permissions to the role, if any.
Chris@0 159 if (!empty($permissions)) {
Chris@0 160 $this->grantPermissions($role, $permissions);
Chris@0 161 $assigned_permissions = Role::load($role->id())->getPermissions();
Chris@0 162 $missing_permissions = array_diff($permissions, $assigned_permissions);
Chris@0 163 if (!$missing_permissions) {
Chris@0 164 $this->pass(SafeMarkup::format('Created permissions: @perms', ['@perms' => implode(', ', $permissions)]), 'Role');
Chris@0 165 }
Chris@0 166 else {
Chris@0 167 $this->fail(SafeMarkup::format('Failed to create permissions: @perms', ['@perms' => implode(', ', $missing_permissions)]), 'Role');
Chris@0 168 }
Chris@0 169 }
Chris@0 170 return $role->id();
Chris@0 171 }
Chris@0 172 else {
Chris@0 173 return FALSE;
Chris@0 174 }
Chris@0 175 }
Chris@0 176
Chris@0 177 /**
Chris@0 178 * Checks whether a given list of permission names is valid.
Chris@0 179 *
Chris@0 180 * @param array $permissions
Chris@0 181 * The permission names to check.
Chris@0 182 *
Chris@0 183 * @return bool
Chris@0 184 * TRUE if the permissions are valid, FALSE otherwise.
Chris@0 185 */
Chris@0 186 protected function checkPermissions(array $permissions) {
Chris@0 187 $available = array_keys(\Drupal::service('user.permissions')->getPermissions());
Chris@0 188 $valid = TRUE;
Chris@0 189 foreach ($permissions as $permission) {
Chris@0 190 if (!in_array($permission, $available)) {
Chris@0 191 $this->fail(SafeMarkup::format('Invalid permission %permission.', ['%permission' => $permission]), 'Role');
Chris@0 192 $valid = FALSE;
Chris@0 193 }
Chris@0 194 }
Chris@0 195 return $valid;
Chris@0 196 }
Chris@0 197
Chris@0 198 /**
Chris@0 199 * Grant permissions to a user role.
Chris@0 200 *
Chris@0 201 * @param \Drupal\user\RoleInterface $role
Chris@0 202 * The ID of a user role to alter.
Chris@0 203 * @param array $permissions
Chris@0 204 * (optional) A list of permission names to grant.
Chris@0 205 */
Chris@0 206 protected function grantPermissions(RoleInterface $role, array $permissions) {
Chris@0 207 foreach ($permissions as $permission) {
Chris@0 208 $role->grantPermission($permission);
Chris@0 209 }
Chris@0 210 $role->trustData()->save();
Chris@0 211 }
Chris@0 212
Chris@0 213 }