function DbLogTest::doUser

Same name and namespace in other branches
  1. 9 core/modules/dblog/tests/src/Functional/DbLogTest.php \Drupal\Tests\dblog\Functional\DbLogTest::doUser()
  2. 10 core/modules/dblog/tests/src/Functional/DbLogTest.php \Drupal\Tests\dblog\Functional\DbLogTest::doUser()
  3. 11.x 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]');
}

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