You are here

private function DBLogTestCase::doUser in Drupal 7

Generates and then verifies some user events.

1 call to DBLogTestCase::doUser()
DBLogTestCase::verifyEvents in modules/dblog/dblog.test
Generates and then verifies various types of events.

File

modules/dblog/dblog.test, line 212
Tests for dblog.module.

Class

DBLogTestCase
Tests logging messages to the database.

Code

private function doUser() {

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

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

  // Retrieve the user object.
  $user = user_load_by_name($name);
  $this
    ->assertTrue($user != NULL, format_string('User @name was loaded', array(
    '@name' => $name,
  )));

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

  // Login user.
  $this
    ->drupalLogin($user);

  // Logout user.
  $this
    ->drupalLogout();

  // Fetch the row IDs in watchdog that relate to the user.
  $result = db_query('SELECT wid FROM {watchdog} WHERE uid = :uid', array(
    ':uid' => $user->uid,
  ));
  foreach ($result as $row) {
    $ids[] = $row->wid;
  }
  $count_before = isset($ids) ? count($ids) : 0;
  $this
    ->assertTrue($count_before > 0, format_string('DBLog contains @count records for @name', array(
    '@count' => $count_before,
    '@name' => $user->name,
  )));

  // Login the admin user.
  $this
    ->drupalLogin($this->big_user);

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

  // View the database log report.
  $this
    ->drupalGet('admin/reports/dblog');
  $this
    ->assertResponse(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).', array(
    '%name' => $name,
    '%email' => $user->mail,
  )), 'DBLog event was recorded: [add user]');

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

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

  // Delete user.
  $message = t('Deleted user: %name %email.', array(
    '%name' => $name,
    '%email' => '<' . $user->mail . '>',
  ));
  $message_text = truncate_utf8(filter_xss($message, array()), 56, TRUE, TRUE);

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

    // Found link with the message text.
    $links = array_shift($links);
    foreach ($links
      ->attributes() as $attr => $value) {
      if ($attr == 'href') {

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

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

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

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

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