function UserAdminTest::testUserAdmin

Same name and namespace 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.