You are here

public function UserAdminTest::testUserAdmin in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/user/tests/src/Functional/UserAdminTest.php \Drupal\Tests\user\Functional\UserAdminTest::testUserAdmin()
  2. 10 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() {
  $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(t('Edit'), 'edit-form', [
    'query' => [
      'destination' => $user_a
        ->toUrl('collection')
        ->toString(),
    ],
  ])
    ->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
  $editunblock = [];
  $editunblock['action'] = 'user_unblock_user_action';
  $editunblock['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($editunblock, '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");
}