? sites/all/modules/cck
? sites/all/modules/devel
? sites/default/settings.php
? sites/default/files/.htaccess
? sites/default/files/simpletest
Index: modules/user/user.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.test,v
retrieving revision 1.43
diff -u -p -r1.43 user.test
--- modules/user/user.test	13 Jun 2009 20:40:09 -0000	1.43
+++ modules/user/user.test	14 Jun 2009 19:03:15 -0000
@@ -55,15 +55,72 @@ class UserRegistrationTestCase extends D
     $this->drupalPost('user', $edit, t('Log in'));
     $this->assertText(t('Sorry, unrecognized username or password. Have you forgotten your password?'), t('Invalid login attempt failed.'));
 
-    // Login using password reset page.
-    $url = user_pass_reset_url($user);
-    $this->drupalGet($url);
-    $this->assertText(t('This login can be used only once.'), t('Login can be used only once.'));
+    // Try to reset the password for an invalid account.
+    $this->drupalGet('user/password');
+    $edit = array();
+    $edit['name'] = $this->randomName(32);
+    $this->drupalPost(NULL, $edit, t('E-mail new password'));
+    $this->assertRaw(t('Sorry, %name is not recognized as a user name or an e-mail address.', array('%name' => $edit['name'])), t('Validation message shown when trying to request password for invalid account.'));
+    $this->assertEqual(count($this->drupalGetMails(array('id' => 'user_password_reset'))), 0, t('No e-mail was sent when requesting a password for an invalid account.'));
 
+    // Reset the password via the password reset page and reset by username.
+    $edit = array();
+    $edit['name'] = $name;
+    $this->drupalPost(NULL, $edit, t('E-mail new password'));
+
+    // Verify that the user received an e-mail.
+    $this->assertMail('to', $user->mail, t('Password e-mail sent to user.'));
+    $subject = t('Replacement login information for !username at !site', array('!username' => $name, '!site' => variable_get('site_name', 'Drupal')));
+    $this->assertMail('subject', $subject, t('Password reset e-mail subject is correct.'));
+
+    // Try to extract the one-time login link from the body of that e-mail.
+    $mail = $this->drupalGetMails(
+      array(
+        'to' => $user->mail,
+        'id' => 'user_password_reset',
+      )
+    );
+    preg_match('~user/reset/\d+/\d+/[a-z\d]+~', $mail[0]['body'], $match);
+    $this->assertTrue(count($match) == 1, t('E-mail contains one-time login link.'));
+    $this->drupalGet($match[0]);
+
+    // Check the one-time login page.
+    $this->assertText($name, t('One-time login page contains the correct username.') );
+    $this->assertText(t('This login can be used only once.'), t('Login can be used only once.'));
     $this->drupalPost(NULL, NULL, 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.'), t('This link is no longer valid.'));
 
-    // Check password type validation
+    // Log out, and try to log in again using the same one-time link.
+    $this->drupalLogout();
+    $this->drupalGet($match[0]);
+    $this->assertText(t('You have tried to use a one-time login link which has either been used or is no longer valid.'), t('One-time link is no longer valid.'));
+
+    // Request a new password again, this time using the e-mail address.
+    $this->drupalGet('user/password');
+    $edit = array();
+    $edit['name'] = $user->mail;
+    $this->drupalPost(NULL, $edit, t('E-mail new password'));
+
+    // Verify that the user received an e-mail.
+    $this->assertMail('to', $user->mail, t('Password e-mail sent to user.'));
+
+    // Try to extract the one-time login link from the body of that e-mail.
+    $mail = $this->drupalGetMails(
+      array(
+        'to' => $user->mail,
+        'subject' => t('Replacement login information for !username at !site', array('!username' => $name, '!site' => variable_get('site_name', 'Drupal'))),
+      )
+    );
+    preg_match('~user/reset/\d+/\d+/[a-z\d]+~', $mail[1]['body'], $match);
+    $this->assertTrue(count($match) == 1, t('E-mail contains one-time login link.'));
+    $this->drupalGet($match[0]);
+
+    // Check the one-time login page.
+    $this->assertText($name, t('One-time login page contains the correct username.') );
+    $this->assertText(t('This login can be used only once.'), t('Login can be used only once.'));
+    $this->drupalPost(NULL, NULL, t('Log in'));
+
+    // Check password type validation.
     $edit = array();
     $edit['pass[pass1]'] = '99999.0';
     $edit['pass[pass2]'] = '99999';
