You are here

private function DbLogTest::doUser in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/dblog/tests/src/Functional/DbLogTest.php \Drupal\Tests\dblog\Functional\DbLogTest::doUser()

Generates and then verifies some user events.

1 call to DbLogTest::doUser()
DbLogTest::verifyEvents in core/modules/dblog/tests/src/Functional/DbLogTest.php
Generates and then verifies various types of events.

File

core/modules/dblog/tests/src/Functional/DbLogTest.php, line 410

Class

DbLogTest
Generate events and verify dblog entries; verify user access to log reports based on permissions.

Namespace

Drupal\Tests\dblog\Functional

Code

private function doUser() {

  // Set user variables.
  $name = $this
    ->randomMachineName();
  $pass = user_password();

  // Add a user using the form to generate an add user event (which is not
  // triggered by drupalCreateUser).
  $edit = [];
  $edit['name'] = $name;
  $edit['mail'] = $name . '@example.com';
  $edit['pass[pass1]'] = $pass;
  $edit['pass[pass2]'] = $pass;
  $edit['status'] = 1;
  $this
    ->drupalPostForm('admin/people/create', $edit, t('Create new account'));
  $this
    ->assertSession()
    ->statusCodeEquals(200);

  // Retrieve the user object.
  $user = user_load_by_name($name);
  $this
    ->assertNotNull($user, new FormattableMarkup('User @name was loaded', [
    '@name' => $name,
  ]));

  // pass_raw property is needed by drupalLogin.
  $user->passRaw = $pass;

  // Log in user.
  $this
    ->drupalLogin($user);

  // Log out user.
  $this
    ->drupalLogout();

  // Fetch the row IDs in watchdog that relate to the user.
  $result = Database::getConnection()
    ->select('watchdog', 'w')
    ->fields('w', [
    'wid',
  ])
    ->condition('uid', $user
    ->id())
    ->execute();
  foreach ($result as $row) {
    $ids[] = $row->wid;
  }
  $count_before = isset($ids) ? count($ids) : 0;
  $this
    ->assertGreaterThan(0, $count_before, new FormattableMarkup('DBLog contains @count records for @name', [
    '@count' => $count_before,
    '@name' => $user
      ->getAccountName(),
  ]));

  // Log in the admin user.
  $this
    ->drupalLogin($this->adminUser);

  // Delete the user created at the start of this test.
  // We need to POST here to invoke batch_process() in the internal browser.
  $this
    ->drupalPostForm('user/' . $user
    ->id() . '/cancel', [
    'user_cancel_method' => 'user_cancel_reassign',
  ], t('Cancel account'));

  // View the database log report.
  $this
    ->drupalGet('admin/reports/dblog');
  $this
    ->assertSession()
    ->statusCodeEquals(200);

  // Verify that the expected events were recorded.
  // Add user.
  // Default display includes name and email address; if too long, the email
  // address is replaced by three periods.
  $this
    ->assertLogMessage(t('New user: %name %email.', [
    '%name' => $name,
    '%email' => '<' . $user
      ->getEmail() . '>',
  ]), 'DBLog event was recorded: [add user]');

  // Log in user.
  $this
    ->assertLogMessage(t('Session opened for %name.', [
    '%name' => $name,
  ]), 'DBLog event was recorded: [login user]');

  // Log out user.
  $this
    ->assertLogMessage(t('Session closed for %name.', [
    '%name' => $name,
  ]), 'DBLog event was recorded: [logout user]');

  // Delete user.
  $message = t('Deleted user: %name %email.', [
    '%name' => $name,
    '%email' => '<' . $user
      ->getEmail() . '>',
  ]);
  $message_text = Unicode::truncate(Html::decodeEntities(strip_tags($message)), 56, TRUE, TRUE);

  // Verify that the full message displays on the details page.
  $link = FALSE;
  if ($links = $this
    ->xpath('//a[text()="' . $message_text . '"]')) {

    // Found link with the message text.
    $links = array_shift($links);
    $value = $links
      ->getAttribute('href');

    // Extract link to details page.
    $link = mb_substr($value, strpos($value, 'admin/reports/dblog/event/'));
    $this
      ->drupalGet($link);

    // Check for full message text on the details page.
    $this
      ->assertRaw($message, 'DBLog event details was found: [delete user]');
  }
  $this
    ->assertNotEmpty($link, 'DBLog event was recorded: [delete user]');

  // Visit random URL (to generate page not found event).
  $not_found_url = $this
    ->randomMachineName(60);
  $this
    ->drupalGet($not_found_url);
  $this
    ->assertSession()
    ->statusCodeEquals(404);

  // View the database log page-not-found report page.
  $this
    ->drupalGet('admin/reports/page-not-found');
  $this
    ->assertSession()
    ->statusCodeEquals(200);

  // Check that full-length URL displayed.
  $this
    ->assertText($not_found_url, 'DBLog event was recorded: [page not found]');
}