| Code Coverage | ||||||||||
| Classes and Traits | Functions and Methods | Lines | ||||||||
| Total |  | 0.00% | 0 / 1 |  | 0.00% | 0 / 6 | CRAP |  | 0.00% | 0 / 66 | 
| UserCreationTrait |  | 0.00% | 0 / 1 |  | 0.00% | 0 / 6 | 552 |  | 0.00% | 0 / 66 | 
| setCurrentUser |  | 0.00% | 0 / 1 | 2 |  | 0.00% | 0 / 2 | |||
| createUser |  | 0.00% | 0 / 1 | 56 |  | 0.00% | 0 / 21 | |||
| createAdminRole |  | 0.00% | 0 / 1 | 6 |  | 0.00% | 0 / 6 | |||
| createRole |  | 0.00% | 0 / 1 | 72 |  | 0.00% | 0 / 26 | |||
| checkPermissions |  | 0.00% | 0 / 1 | 12 |  | 0.00% | 0 / 7 | |||
| grantPermissions |  | 0.00% | 0 / 1 | 6 |  | 0.00% | 0 / 4 | |||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\simpletest\UserCreationTrait. | |
| */ | |
| namespace Drupal\simpletest; | |
| use Drupal\Component\Utility\SafeMarkup; | |
| use Drupal\Core\Session\AccountInterface; | |
| use Drupal\user\Entity\Role; | |
| use Drupal\user\Entity\User; | |
| use Drupal\user\RoleInterface; | |
| /** | |
| * Provides methods to create additional test users and switch the currently | |
| * logged in one. | |
| * | |
| * This trait is meant to be used only by test classes extending | |
| * \Drupal\simpletest\TestBase. | |
| */ | |
| trait UserCreationTrait { | |
| /** | |
| * Switch the current logged in user. | |
| * | |
| * @param \Drupal\Core\Session\AccountInterface $account | |
| * The user account object. | |
| */ | |
| protected function setCurrentUser(AccountInterface $account) { | |
| \Drupal::currentUser()->setAccount($account); | |
| } | |
| /** | |
| * Create a user with a given set of permissions. | |
| * | |
| * @param array $permissions | |
| * Array of permission names to assign to user. Note that the user always | |
| * has the default permissions derived from the "authenticated users" role. | |
| * @param string $name | |
| * The user name. | |
| * @param bool $admin | |
| * (optional) Whether the user should be an administrator | |
| * with all the available permissions. | |
| * | |
| * @return \Drupal\user\Entity\User|false | |
| * A fully loaded user object with pass_raw property, or FALSE if account | |
| * creation fails. | |
| */ | |
| protected function createUser(array $permissions = array(), $name = NULL, $admin = FALSE) { | |
| // Create a role with the given permission set, if any. | |
| $rid = FALSE; | |
| if ($permissions) { | |
| $rid = $this->createRole($permissions); | |
| if (!$rid) { | |
| return FALSE; | |
| } | |
| } | |
| // Create a user assigned to that role. | |
| $edit = array(); | |
| $edit['name'] = !empty($name) ? $name : $this->randomMachineName(); | |
| $edit['mail'] = $edit['name'] . '@example.com'; | |
| $edit['pass'] = user_password(); | |
| $edit['status'] = 1; | |
| if ($rid) { | |
| $edit['roles'] = array($rid); | |
| } | |
| if ($admin) { | |
| $edit['roles'][] = $this->createAdminRole(); | |
| } | |
| $account = User::create($edit); | |
| $account->save(); | |
| $this->assertTrue($account->id(), SafeMarkup::format('User created with name %name and pass %pass', array('%name' => $edit['name'], '%pass' => $edit['pass'])), 'User login'); | |
| if (!$account->id()) { | |
| return FALSE; | |
| } | |
| // Add the raw password so that we can log in as this user. | |
| $account->pass_raw = $edit['pass']; | |
| return $account; | |
| } | |
| /** | |
| * Creates an administrative role. | |
| * | |
| * @param string $rid | |
| * (optional) The role ID (machine name). Defaults to a random name. | |
| * @param string $name | |
| * (optional) The label for the role. Defaults to a random string. | |
| * @param int $weight | |
| * (optional) The weight for the role. Defaults NULL so that entity_create() | |
| * sets the weight to maximum + 1. | |
| * | |
| * @return string | |
| * Role ID of newly created role, or FALSE if role creation failed. | |
| */ | |
| protected function createAdminRole($rid = NULL, $name = NULL, $weight = NULL) { | |
| $rid = $this->createRole([], $rid, $name, $weight); | |
| if ($rid) { | |
| /** @var \Drupal\user\RoleInterface $role */ | |
| $role = Role::load($rid); | |
| $role->setIsAdmin(TRUE); | |
| $role->save(); | |
| } | |
| return $rid; | |
| } | |
| /** | |
| * Creates a role with specified permissions. | |
| * | |
| * @param array $permissions | |
| * Array of permission names to assign to role. | |
| * @param string $rid | |
| * (optional) The role ID (machine name). Defaults to a random name. | |
| * @param string $name | |
| * (optional) The label for the role. Defaults to a random string. | |
| * @param int $weight | |
| * (optional) The weight for the role. Defaults NULL so that entity_create() | |
| * sets the weight to maximum + 1. | |
| * | |
| * @return string | |
| * Role ID of newly created role, or FALSE if role creation failed. | |
| */ | |
| protected function createRole(array $permissions, $rid = NULL, $name = NULL, $weight = NULL) { | |
| // Generate a random, lowercase machine name if none was passed. | |
| if (!isset($rid)) { | |
| $rid = strtolower($this->randomMachineName(8)); | |
| } | |
| // Generate a random label. | |
| if (!isset($name)) { | |
| // In the role UI role names are trimmed and random string can start or | |
| // end with a space. | |
| $name = trim($this->randomString(8)); | |
| } | |
| // Check the all the permissions strings are valid. | |
| if (!$this->checkPermissions($permissions)) { | |
| return FALSE; | |
| } | |
| // Create new role. | |
| $role = Role::create(array( | |
| 'id' => $rid, | |
| 'label' => $name, | |
| )); | |
| if (isset($weight)) { | |
| $role->set('weight', $weight); | |
| } | |
| $result = $role->save(); | |
| $this->assertIdentical($result, SAVED_NEW, SafeMarkup::format('Created role ID @rid with name @name.', array( | |
| '@name' => var_export($role->label(), TRUE), | |
| '@rid' => var_export($role->id(), TRUE), | |
| )), 'Role'); | |
| if ($result === SAVED_NEW) { | |
| // Grant the specified permissions to the role, if any. | |
| if (!empty($permissions)) { | |
| $this->grantPermissions($role, $permissions); | |
| $assigned_permissions = Role::load($role->id())->getPermissions(); | |
| $missing_permissions = array_diff($permissions, $assigned_permissions); | |
| if (!$missing_permissions) { | |
| $this->pass(SafeMarkup::format('Created permissions: @perms', array('@perms' => implode(', ', $permissions))), 'Role'); | |
| } | |
| else { | |
| $this->fail(SafeMarkup::format('Failed to create permissions: @perms', array('@perms' => implode(', ', $missing_permissions))), 'Role'); | |
| } | |
| } | |
| return $role->id(); | |
| } | |
| else { | |
| return FALSE; | |
| } | |
| } | |
| /** | |
| * Checks whether a given list of permission names is valid. | |
| * | |
| * @param array $permissions | |
| * The permission names to check. | |
| * | |
| * @return bool | |
| * TRUE if the permissions are valid, FALSE otherwise. | |
| */ | |
| protected function checkPermissions(array $permissions) { | |
| $available = array_keys(\Drupal::service('user.permissions')->getPermissions()); | |
| $valid = TRUE; | |
| foreach ($permissions as $permission) { | |
| if (!in_array($permission, $available)) { | |
| $this->fail(SafeMarkup::format('Invalid permission %permission.', array('%permission' => $permission)), 'Role'); | |
| $valid = FALSE; | |
| } | |
| } | |
| return $valid; | |
| } | |
| /** | |
| * Grant permissions to a user role. | |
| * | |
| * @param \Drupal\user\RoleInterface $role | |
| * The ID of a user role to alter. | |
| * @param array $permissions | |
| * (optional) A list of permission names to grant. | |
| */ | |
| protected function grantPermissions(RoleInterface $role, array $permissions) { | |
| foreach ($permissions as $permission) { | |
| $role->grantPermission($permission); | |
| } | |
| $role->trustData()->save(); | |
| } | |
| } |