You are here

function UserRegistrationTest::testUserRegistration in SimpleTest 6

Same name and namespace in other branches
  1. 5 tests/user_registration_test.test \UserRegistrationTest::testUserRegistration()

File

tests/user_module.test, line 12

Class

UserRegistrationTest
Class to test the user registration process,

Code

function testUserRegistration() {

  /* We first allow every user to login instantly. */
  $this
    ->drupalVariableSet('user_register', 1);

  /* make sure the profile module is disabled to avoid conflicts */
  $this
    ->drupalModuleDisable('profile');
  $name = $this
    ->randomName();
  $mail = "{$name}@example.com";
  $edit = array(
    'name' => $name,
    'mail' => $mail,
  );
  $this
    ->drupalPost('user/register', $edit, 'Create new account');
  $this
    ->assertText(t('Your password and further instructions have been sent to your e-mail address.'), 'Your password and further instructions ... found');
  $this
    ->assertNoText(t('The name %name has been denied access.', array(
    '%name' => $name,
  )), 'not denied access');

  // now we check database fields
  // we can use an 'edit' array to load user variable
  $user = user_load($edit);
  $this
    ->assertTrue(isset($user->uid), 'user->uid set');
  $this
    ->assertTrue($user->uid > 0, 'uid > 0');
  if (!isset($user->uid) || $user->uid == 0) {
    return FALSE;
  }
  $this
    ->assertEqual($user->name, $name, 'Checking name of user');
  $this
    ->assertEqual($user->mail, $mail, 'Checking e-mail address');
  $this
    ->assertEqual($user->mode, 0, 'Checking mode field');
  $this
    ->assertEqual($user->sort, 0, 'Checking sort field');
  $this
    ->assertEqual($user->threshold, 0, 'Checking treshold field');
  $this
    ->assertEqual($user->theme, '', 'Checking theme field');
  $this
    ->assertEqual($user->signature, '', 'Checking signature field');
  $this
    ->assertTrue($user->created > time() - 20, 0, 'Checking creation time.');
  $this
    ->assertEqual($user->status, variable_get('user_register', 1) == 1 ? 1 : 0, 'Checking status field');
  $this
    ->assertEqual($user->timezone, variable_get('date_default_timezone', NULL), 'Checking timezone field');
  $this
    ->assertEqual($user->language, '', 'Checking language field');
  $this
    ->assertEqual($user->picture, '', 'Check picture field');
  $this
    ->assertEqual($user->init, $mail, 'Check init field');

  /* We try to login with a wrong password */
  $login_edit = array(
    'name' => $name,
    'pass' => 'foo',
  );
  $this
    ->drupalPost('user', $login_edit, 'Log in');
  $this
    ->assertText(t('Sorry, unrecognized username or password. Have you forgotten your password?'), 'Test for failed Login');
  $url = user_pass_reset_url($user);

  /* TODO: find a better way, we currently have to do it that way, see user.module line 1041. */
  sleep(1);
  $this->_browser
    ->get($url);

  // Will proabaly not work localised as the text is sent to tranlate wrapped in <p> usually
  $this
    ->assertText(t('This login can be used only once.'), "Check for 'used only once' notice");
  $this->_browser
    ->clickSubmit(t('Log in'));
  $this
    ->assertText(t('You have just used your one-time login link. It is no longer necessary to use this link to login. Please change your password.'), "Check for one time login notice after clicking Login button.");

  /* now lets change our password */
  $new_pass = user_password();
  $this
    ->assertTrue($this->_browser
    ->setField('pass[pass1]', $new_pass), 'Pass1 field set.');
  $this
    ->assertTrue($this->_browser
    ->setField('pass[pass2]', $new_pass), 'Pass2 field set.');
  $this->_browser
    ->clickSubmit(t('Save'));
  $this
    ->assertText(t('The changes have been saved.'), "Changed password to '{$new_pass}'");

  /* Check if the password changes are present in db */
  $user = user_load(array(
    'uid' => $user->uid,
  ));
  $this
    ->assertEqual($user->pass, md5($new_pass), 'Correct password in database');

  /* logout */
  $this
    ->clickLink('Log out');
  $this
    ->assertNoText($user->name, 'Logged out');

  /* login again */
  $login_edit['pass'] = $new_pass;
  $this
    ->drupalPost('user', $login_edit, 'Log in');
  $pname = $user->name;
  $this
    ->assertText($pname, 'Logged in (name found)');
  $this
    ->assertNoText(t('Sorry. Unrecognized username or password.'), 'Logged in (no message for unrecognized username or password)');
  $this
    ->assertNoText(t('User login'), 'Logged in (no user login form present)');

  // I can't find this in Drupal anywhere, but I left it in for now.
  $this
    ->assertNoUnwantedRaw(t('The username %name has been blocked.', array(
    '%name' => $pname,
  )), 'Not blocked');
  $this
    ->assertNoUnwantedRaw(t('The name %name is a reserved username.', array(
    '%name' => $pname,
  )), 'Access granted');
  $this->_browser
    ->get(url('user'), array(
    'absolute' => TRUE,
  ));
  $this
    ->assertText($pname, 'user as auth lands on the user profile');
  $this
    ->assertText(t('View'), 'View tab on the profile page');
  $this
    ->assertText(t('Edit'), 'Edit tab on the profile page');

  /* delete test user, roles and maybe authmap */
  db_query('DELETE FROM {users} WHERE uid = %d', $user->uid);
  db_query('DELETE FROM {users_roles} WHERE uid = %d', $user->uid);
  db_query('DELETE FROM {authmap} WHERE uid = %d', $user->uid);
}