UserRolesAssignmentTest.php

Same filename and directory in other branches
  1. 9 core/modules/user/tests/src/Functional/UserRolesAssignmentTest.php
  2. 10 core/modules/user/tests/src/Functional/UserRolesAssignmentTest.php
  3. 11.x core/modules/user/tests/src/Functional/UserRolesAssignmentTest.php

Namespace

Drupal\Tests\user\Functional

File

core/modules/user/tests/src/Functional/UserRolesAssignmentTest.php

View source
<?php

namespace Drupal\Tests\user\Functional;

use Drupal\Tests\BrowserTestBase;

/**
 * Tests that users can be assigned and unassigned roles.
 *
 * @group user
 */
class UserRolesAssignmentTest extends BrowserTestBase {
    protected function setUp() {
        parent::setUp();
        $admin_user = $this->drupalCreateUser([
            'administer permissions',
            'administer users',
        ]);
        $this->drupalLogin($admin_user);
    }
    
    /**
     * {@inheritdoc}
     */
    protected $defaultTheme = 'stark';
    
    /**
     * Tests that a user can be assigned a role and that the role can be removed
     * again.
     */
    public function testAssignAndRemoveRole() {
        $rid = $this->drupalCreateRole([
            'administer users',
        ]);
        $account = $this->drupalCreateUser();
        // Assign the role to the user.
        $this->drupalPostForm('user/' . $account->id() . '/edit', [
            "roles[{$rid}]" => $rid,
        ], t('Save'));
        $this->assertText(t('The changes have been saved.'));
        $this->assertFieldChecked('edit-roles-' . $rid, 'Role is assigned.');
        $this->userLoadAndCheckRoleAssigned($account, $rid);
        // Remove the role from the user.
        $this->drupalPostForm('user/' . $account->id() . '/edit', [
            "roles[{$rid}]" => FALSE,
        ], t('Save'));
        $this->assertText(t('The changes have been saved.'));
        $this->assertNoFieldChecked('edit-roles-' . $rid, 'Role is removed from user.');
        $this->userLoadAndCheckRoleAssigned($account, $rid, FALSE);
    }
    
    /**
     * Tests that when creating a user the role can be assigned. And that it can
     * be removed again.
     */
    public function testCreateUserWithRole() {
        $rid = $this->drupalCreateRole([
            'administer users',
        ]);
        // Create a new user and add the role at the same time.
        $edit = [
            'name' => $this->randomMachineName(),
            'mail' => $this->randomMachineName() . '@example.com',
            'pass[pass1]' => $pass = $this->randomString(),
            'pass[pass2]' => $pass,
            "roles[{$rid}]" => $rid,
        ];
        $this->drupalPostForm('admin/people/create', $edit, t('Create new account'));
        $this->assertText(t('Created a new user account for @name.', [
            '@name' => $edit['name'],
        ]));
        // Get the newly added user.
        $account = user_load_by_name($edit['name']);
        $this->drupalGet('user/' . $account->id() . '/edit');
        $this->assertFieldChecked('edit-roles-' . $rid, 'Role is assigned.');
        $this->userLoadAndCheckRoleAssigned($account, $rid);
        // Remove the role again.
        $this->drupalPostForm('user/' . $account->id() . '/edit', [
            "roles[{$rid}]" => FALSE,
        ], t('Save'));
        $this->assertText(t('The changes have been saved.'));
        $this->assertNoFieldChecked('edit-roles-' . $rid, 'Role is removed from user.');
        $this->userLoadAndCheckRoleAssigned($account, $rid, FALSE);
    }
    
    /**
     * Check role on user object.
     *
     * @param object $account
     *   The user account to check.
     * @param string $rid
     *   The role ID to search for.
     * @param bool $is_assigned
     *   (optional) Whether to assert that $rid exists (TRUE) or not (FALSE).
     *   Defaults to TRUE.
     */
    private function userLoadAndCheckRoleAssigned($account, $rid, $is_assigned = TRUE) {
        $user_storage = $this->container
            ->get('entity_type.manager')
            ->getStorage('user');
        $user_storage->resetCache([
            $account->id(),
        ]);
        $account = $user_storage->load($account->id());
        if ($is_assigned) {
            $this->assertContains($rid, $account->getRoles());
        }
        else {
            $this->assertNotContains($rid, $account->getRoles());
        }
    }

}

Classes

Title Deprecated Summary
UserRolesAssignmentTest Tests that users can be assigned and unassigned roles.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.