function UserAdminTest::testUserAdmin

Same name in other branches
  1. 9 core/modules/user/tests/src/Functional/UserAdminTest.php \Drupal\Tests\user\Functional\UserAdminTest::testUserAdmin()
  2. 8.9.x core/modules/user/tests/src/Functional/UserAdminTest.php \Drupal\Tests\user\Functional\UserAdminTest::testUserAdmin()
  3. 11.x core/modules/user/tests/src/Functional/UserAdminTest.php \Drupal\Tests\user\Functional\UserAdminTest::testUserAdmin()

Registers a user and deletes it.

File

core/modules/user/tests/src/Functional/UserAdminTest.php, line 49

Class

UserAdminTest
Tests user administration page functionality.

Namespace

Drupal\Tests\user\Functional

Code

public function testUserAdmin() : void {
    $config = $this->config('user.settings');
    $user_a = $this->drupalCreateUser();
    $user_a->name = 'User A';
    $user_a->mail = $this->randomMachineName() . '@example.com';
    $user_a->save();
    $user_b = $this->drupalCreateUser([
        'administer taxonomy',
    ]);
    $user_b->name = 'User B';
    $user_b->save();
    $user_c = $this->drupalCreateUser([
        'administer taxonomy',
    ]);
    $user_c->name = 'User C';
    $user_c->save();
    $user_storage = $this->container
        ->get('entity_type.manager')
        ->getStorage('user');
    // Create admin user to delete registered user.
    $admin_user = $this->drupalCreateUser([
        'administer users',
    ]);
    // Use a predictable name so that we can reliably order the user admin page
    // by name.
    $admin_user->name = 'Admin user';
    $admin_user->save();
    $this->drupalLogin($admin_user);
    $this->drupalGet('admin/people');
    $this->assertSession()
        ->pageTextContains($user_a->getAccountName());
    $this->assertSession()
        ->pageTextContains($user_b->getAccountName());
    $this->assertSession()
        ->pageTextContains($user_c->getAccountName());
    $this->assertSession()
        ->pageTextContains($admin_user->getAccountName());
    // Test for existence of edit link in table.
    $link = $user_a->toLink('Edit', 'edit-form', [
        'query' => [
            'destination' => $user_a->toUrl('collection')
                ->toString(),
        ],
        'attributes' => [
            'aria-label' => 'Edit ' . $user_a->label(),
        ],
    ])
        ->toString();
    $this->assertSession()
        ->responseContains($link);
    // Test exposed filter elements.
    foreach ([
        'user',
        'role',
        'permission',
        'status',
    ] as $field) {
        $this->assertSession()
            ->fieldExists("edit-{$field}");
    }
    // Make sure the reduce duplicates element from the ManyToOneHelper is not
    // displayed.
    $this->assertSession()
        ->fieldNotExists('edit-reduce-duplicates');
    // Filter the users by name/email.
    $this->drupalGet('admin/people', [
        'query' => [
            'user' => $user_a->getAccountName(),
        ],
    ]);
    $result = $this->xpath('//table/tbody/tr');
    $this->assertCount(1, $result, 'Filter by username returned the right amount.');
    $this->assertEquals($user_a->getAccountName(), $result[0]->find('xpath', '/td[2]/a')
        ->getText(), 'Filter by username returned the right user.');
    $this->drupalGet('admin/people', [
        'query' => [
            'user' => $user_a->getEmail(),
        ],
    ]);
    $result = $this->xpath('//table/tbody/tr');
    $this->assertCount(1, $result, 'Filter by username returned the right amount.');
    $this->assertEquals($user_a->getAccountName(), $result[0]->find('xpath', '/td[2]/a')
        ->getText(), 'Filter by username returned the right user.');
    // Filter the users by permission 'administer taxonomy'.
    $this->drupalGet('admin/people', [
        'query' => [
            'permission' => 'administer taxonomy',
        ],
    ]);
    // Check if the correct users show up.
    $this->assertSession()
        ->elementNotExists('xpath', static::getLinkSelectorForUser($user_a));
    $this->assertSession()
        ->elementExists('xpath', static::getLinkSelectorForUser($user_b));
    $this->assertSession()
        ->elementExists('xpath', static::getLinkSelectorForUser($user_c));
    // Filter the users by role. Grab the system-generated role name for User C.
    $roles = $user_c->getRoles();
    unset($roles[array_search(RoleInterface::AUTHENTICATED_ID, $roles)]);
    $this->drupalGet('admin/people', [
        'query' => [
            'role' => reset($roles),
        ],
    ]);
    // Check if the correct users show up when filtered by role.
    $this->assertSession()
        ->elementNotExists('xpath', static::getLinkSelectorForUser($user_a));
    $this->assertSession()
        ->elementNotExists('xpath', static::getLinkSelectorForUser($user_b));
    $this->assertSession()
        ->elementExists('xpath', static::getLinkSelectorForUser($user_c));
    // Test blocking of a user.
    $account = $user_storage->load($user_c->id());
    $this->assertTrue($account->isActive(), 'User C not blocked');
    $edit = [];
    $edit['action'] = 'user_block_user_action';
    $edit['user_bulk_form[4]'] = TRUE;
    $config->set('notify.status_blocked', TRUE)
        ->save();
    $this->drupalGet('admin/people', [
        // Sort the table by username so that we know reliably which user will be
        // targeted with the blocking action.
'query' => [
            'order' => 'name',
            'sort' => 'asc',
        ],
    ]);
    $this->submitForm($edit, 'Apply to selected items');
    $site_name = $this->config('system.site')
        ->get('name');
    $this->assertMailString('body', 'Your account on ' . $site_name . ' has been blocked.', 1, 'Blocked message found in the mail sent to user C.');
    $user_storage->resetCache([
        $user_c->id(),
    ]);
    $account = $user_storage->load($user_c->id());
    $this->assertTrue($account->isBlocked(), 'User C blocked');
    // Test filtering on admin page for blocked users
    $this->drupalGet('admin/people', [
        'query' => [
            'status' => 2,
        ],
    ]);
    $this->assertSession()
        ->elementNotExists('xpath', static::getLinkSelectorForUser($user_a));
    $this->assertSession()
        ->elementNotExists('xpath', static::getLinkSelectorForUser($user_b));
    $this->assertSession()
        ->elementExists('xpath', static::getLinkSelectorForUser($user_c));
    // Test unblocking of a user from /admin/people page and sending of activation mail
    $edit_unblock = [];
    $edit_unblock['action'] = 'user_unblock_user_action';
    $edit_unblock['user_bulk_form[4]'] = TRUE;
    $this->drupalGet('admin/people', [
        // Sort the table by username so that we know reliably which user will be
        // targeted with the blocking action.
'query' => [
            'order' => 'name',
            'sort' => 'asc',
        ],
    ]);
    $this->submitForm($edit_unblock, 'Apply to selected items');
    $user_storage->resetCache([
        $user_c->id(),
    ]);
    $account = $user_storage->load($user_c->id());
    $this->assertTrue($account->isActive(), 'User C unblocked');
    $this->assertMail("to", $account->getEmail(), "Activation mail sent to user C");
    // Test blocking and unblocking another user from /user/[uid]/edit form and sending of activation mail
    $user_d = $this->drupalCreateUser([]);
    $user_storage->resetCache([
        $user_d->id(),
    ]);
    $account1 = $user_storage->load($user_d->id());
    $this->drupalGet('user/' . $account1->id() . '/edit');
    $this->submitForm([
        'status' => 0,
    ], 'Save');
    $user_storage->resetCache([
        $user_d->id(),
    ]);
    $account1 = $user_storage->load($user_d->id());
    $this->assertTrue($account1->isBlocked(), 'User D blocked');
    $this->drupalGet('user/' . $account1->id() . '/edit');
    $this->submitForm([
        'status' => TRUE,
    ], 'Save');
    $user_storage->resetCache([
        $user_d->id(),
    ]);
    $account1 = $user_storage->load($user_d->id());
    $this->assertTrue($account1->isActive(), 'User D unblocked');
    $this->assertMail("to", $account1->getEmail(), "Activation mail sent to user D");
}

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