Fix Email test issue discovered in #5271.

Updated/added tests for changed- and forgot-password Emails.
Updated fixture and tests to no longer use a real Email address.
This commit is contained in:
Roman Schmid 2016-04-11 13:46:41 +02:00
parent 1d3b621460
commit 9146450c49
4 changed files with 60 additions and 34 deletions

View File

@ -222,12 +222,6 @@ class SapphireTest extends PHPUnit_Framework_TestCase {
$prefix = defined('SS_DATABASE_PREFIX') ? SS_DATABASE_PREFIX : 'ss_'; $prefix = defined('SS_DATABASE_PREFIX') ? SS_DATABASE_PREFIX : 'ss_';
// Set up email
$this->originalMailer = Email::mailer();
$this->mailer = new TestMailer();
Injector::inst()->registerService($this->mailer, 'Mailer');
Config::inst()->remove('Email', 'send_all_emails_to');
// Todo: this could be a special test model // Todo: this could be a special test model
$this->model = DataModel::inst(); $this->model = DataModel::inst();
@ -288,6 +282,12 @@ class SapphireTest extends PHPUnit_Framework_TestCase {
// Clear requirements // Clear requirements
Requirements::clear(); Requirements::clear();
// Set up email
$this->originalMailer = Email::mailer();
$this->mailer = new TestMailer();
Injector::inst()->registerService($this->mailer, 'Mailer');
Config::inst()->remove('Email', 'send_all_emails_to');
} }
/** /**

View File

@ -185,16 +185,42 @@ class MemberTest extends FunctionalTest {
* Test that changed passwords will send an email * Test that changed passwords will send an email
*/ */
public function testChangedPasswordEmaling() { public function testChangedPasswordEmaling() {
Config::inst()->update('Member', 'notify_password_change', true);
$this->clearEmails(); $this->clearEmails();
$member = $this->objFromFixture('Member', 'test'); $member = $this->objFromFixture('Member', 'test');
$this->assertNotNull($member); $this->assertNotNull($member);
$valid = $member->changePassword('32asDF##$$%%'); $valid = $member->changePassword('32asDF##$$%%');
$this->assertTrue($valid->valid()); $this->assertTrue($valid->valid());
/*
$this->assertEmailSent("sam@silverstripe.com", null, "/changed password/", $this->assertEmailSent('testuser@example.com', null, 'Your password has been changed',
'/sam@silverstripe\.com.*32asDF##\$\$%%/'); '/testuser@example\.com/');
*/
}
/**
* Test that triggering "forgotPassword" sends an Email with a reset link
*/
public function testForgotPasswordEmaling() {
$this->clearEmails();
$this->autoFollowRedirection = false;
$member = $this->objFromFixture('Member', 'test');
$this->assertNotNull($member);
// Initiate a password-reset
$response = $this->post('Security/LostPasswordForm', array('Email' => $member->Email));
$this->assertEquals($response->getStatusCode(), 302);
// We should get redirected to Security/passwordsent
$this->assertContains('Security/passwordsent/testuser@example.com',
urldecode($response->getHeader('Location')));
// Check existance of reset link
$this->assertEmailSent("testuser@example.com", null, 'Your password reset link',
'/Security\/changepassword\?m='.$member->ID.'&t=[^"]+/');
} }
/** /**

View File

@ -42,7 +42,7 @@ Member:
test: test:
FirstName: Test FirstName: Test
Surname: User Surname: User
Email: sam@silverstripe.com Email: testuser@example.com
Password: 1nitialPassword Password: 1nitialPassword
PasswordExpiry: 2030-01-01 PasswordExpiry: 2030-01-01
Groups: =>Group.securityadminsgroup Groups: =>Group.securityadminsgroup

View File

@ -301,13 +301,13 @@ class SecurityTest extends FunctionalTest {
*/ */
public function testExpiredPassword() { public function testExpiredPassword() {
/* BAD PASSWORDS ARE LOCKED OUT */ /* BAD PASSWORDS ARE LOCKED OUT */
$badResponse = $this->doTestLoginForm('sam@silverstripe.com' , 'badpassword'); $badResponse = $this->doTestLoginForm('testuser@example.com' , 'badpassword');
$this->assertEquals(302, $badResponse->getStatusCode()); $this->assertEquals(302, $badResponse->getStatusCode());
$this->assertRegExp('/Security\/login/', $badResponse->getHeader('Location')); $this->assertRegExp('/Security\/login/', $badResponse->getHeader('Location'));
$this->assertNull($this->session()->inst_get('loggedInAs')); $this->assertNull($this->session()->inst_get('loggedInAs'));
/* UNEXPIRED PASSWORD GO THROUGH WITHOUT A HITCH */ /* UNEXPIRED PASSWORD GO THROUGH WITHOUT A HITCH */
$goodResponse = $this->doTestLoginForm('sam@silverstripe.com' , '1nitialPassword'); $goodResponse = $this->doTestLoginForm('testuser@example.com' , '1nitialPassword');
$this->assertEquals(302, $goodResponse->getStatusCode()); $this->assertEquals(302, $goodResponse->getStatusCode());
$this->assertEquals( $this->assertEquals(
Controller::join_links(Director::absoluteBaseURL(), 'test/link'), Controller::join_links(Director::absoluteBaseURL(), 'test/link'),
@ -336,7 +336,7 @@ class SecurityTest extends FunctionalTest {
} }
public function testChangePasswordForLoggedInUsers() { public function testChangePasswordForLoggedInUsers() {
$goodResponse = $this->doTestLoginForm('sam@silverstripe.com' , '1nitialPassword'); $goodResponse = $this->doTestLoginForm('testuser@example.com' , '1nitialPassword');
// Change the password // Change the password
$this->get('Security/changepassword?BackURL=test/back'); $this->get('Security/changepassword?BackURL=test/back');
@ -349,7 +349,7 @@ class SecurityTest extends FunctionalTest {
$this->assertEquals($this->idFromFixture('Member', 'test'), $this->session()->inst_get('loggedInAs')); $this->assertEquals($this->idFromFixture('Member', 'test'), $this->session()->inst_get('loggedInAs'));
// Check if we can login with the new password // Check if we can login with the new password
$goodResponse = $this->doTestLoginForm('sam@silverstripe.com' , 'changedPassword'); $goodResponse = $this->doTestLoginForm('testuser@example.com' , 'changedPassword');
$this->assertEquals(302, $goodResponse->getStatusCode()); $this->assertEquals(302, $goodResponse->getStatusCode());
$this->assertEquals( $this->assertEquals(
Controller::join_links(Director::absoluteBaseURL(), 'test/link'), Controller::join_links(Director::absoluteBaseURL(), 'test/link'),
@ -368,9 +368,9 @@ class SecurityTest extends FunctionalTest {
// Request new password by email // Request new password by email
$response = $this->get('Security/lostpassword'); $response = $this->get('Security/lostpassword');
$response = $this->post('Security/LostPasswordForm', array('Email' => 'sam@silverstripe.com')); $response = $this->post('Security/LostPasswordForm', array('Email' => 'testuser@example.com'));
$this->assertEmailSent('sam@silverstripe.com'); $this->assertEmailSent('testuser@example.com');
// Load password link from email // Load password link from email
$admin = DataObject::get_by_id('Member', $admin->ID); $admin = DataObject::get_by_id('Member', $admin->ID);
@ -390,7 +390,7 @@ class SecurityTest extends FunctionalTest {
$this->assertEquals($this->idFromFixture('Member', 'test'), $this->session()->inst_get('loggedInAs')); $this->assertEquals($this->idFromFixture('Member', 'test'), $this->session()->inst_get('loggedInAs'));
// Check if we can login with the new password // Check if we can login with the new password
$goodResponse = $this->doTestLoginForm('sam@silverstripe.com' , 'changedPassword'); $goodResponse = $this->doTestLoginForm('testuser@example.com' , 'changedPassword');
$this->assertEquals(302, $goodResponse->getStatusCode()); $this->assertEquals(302, $goodResponse->getStatusCode());
$this->assertEquals($this->idFromFixture('Member', 'test'), $this->session()->inst_get('loggedInAs')); $this->assertEquals($this->idFromFixture('Member', 'test'), $this->session()->inst_get('loggedInAs'));
@ -408,7 +408,7 @@ class SecurityTest extends FunctionalTest {
// Login with a wrong password for more than the defined threshold // Login with a wrong password for more than the defined threshold
for($i = 1; $i <= Member::config()->lock_out_after_incorrect_logins+1; $i++) { for($i = 1; $i <= Member::config()->lock_out_after_incorrect_logins+1; $i++) {
$this->doTestLoginForm('sam@silverstripe.com' , 'incorrectpassword'); $this->doTestLoginForm('testuser@example.com' , 'incorrectpassword');
$member = DataObject::get_by_id("Member", $this->idFromFixture('Member', 'test')); $member = DataObject::get_by_id("Member", $this->idFromFixture('Member', 'test'));
if($i < Member::config()->lock_out_after_incorrect_logins) { if($i < Member::config()->lock_out_after_incorrect_logins) {
@ -438,7 +438,7 @@ class SecurityTest extends FunctionalTest {
} }
} }
$this->doTestLoginForm('sam@silverstripe.com' , '1nitialPassword'); $this->doTestLoginForm('testuser@example.com' , '1nitialPassword');
$this->assertNull( $this->assertNull(
$this->session()->inst_get('loggedInAs'), $this->session()->inst_get('loggedInAs'),
'The user can\'t log in after being locked out, even with the right password' 'The user can\'t log in after being locked out, even with the right password'
@ -448,7 +448,7 @@ class SecurityTest extends FunctionalTest {
$member = DataObject::get_by_id("Member", $this->idFromFixture('Member', 'test')); $member = DataObject::get_by_id("Member", $this->idFromFixture('Member', 'test'));
$member->LockedOutUntil = date('Y-m-d H:i:s', time() - 30); $member->LockedOutUntil = date('Y-m-d H:i:s', time() - 30);
$member->write(); $member->write();
$this->doTestLoginForm('sam@silverstripe.com' , '1nitialPassword'); $this->doTestLoginForm('testuser@example.com' , '1nitialPassword');
$this->assertEquals( $this->assertEquals(
$this->session()->inst_get('loggedInAs'), $this->session()->inst_get('loggedInAs'),
$member->ID, $member->ID,
@ -460,7 +460,7 @@ class SecurityTest extends FunctionalTest {
// Login again with wrong password, but less attempts than threshold // Login again with wrong password, but less attempts than threshold
for($i = 1; $i < Member::config()->lock_out_after_incorrect_logins; $i++) { for($i = 1; $i < Member::config()->lock_out_after_incorrect_logins; $i++) {
$this->doTestLoginForm('sam@silverstripe.com' , 'incorrectpassword'); $this->doTestLoginForm('testuser@example.com' , 'incorrectpassword');
} }
$this->assertNull($this->session()->inst_get('loggedInAs')); $this->assertNull($this->session()->inst_get('loggedInAs'));
$this->assertContains( $this->assertContains(
@ -469,7 +469,7 @@ class SecurityTest extends FunctionalTest {
'The user can retry with a wrong password after the lockout expires' 'The user can retry with a wrong password after the lockout expires'
); );
$this->doTestLoginForm('sam@silverstripe.com' , '1nitialPassword'); $this->doTestLoginForm('testuser@example.com' , '1nitialPassword');
$this->assertEquals( $this->assertEquals(
$this->session()->inst_get('loggedInAs'), $this->session()->inst_get('loggedInAs'),
$member->ID, $member->ID,
@ -484,8 +484,8 @@ class SecurityTest extends FunctionalTest {
// ATTEMPTING LOG-IN TWICE WITH ONE ACCOUNT AND TWICE WITH ANOTHER SHOULDN'T LOCK ANYBODY OUT // ATTEMPTING LOG-IN TWICE WITH ONE ACCOUNT AND TWICE WITH ANOTHER SHOULDN'T LOCK ANYBODY OUT
$this->doTestLoginForm('sam@silverstripe.com' , 'incorrectpassword'); $this->doTestLoginForm('testuser@example.com' , 'incorrectpassword');
$this->doTestLoginForm('sam@silverstripe.com' , 'incorrectpassword'); $this->doTestLoginForm('testuser@example.com' , 'incorrectpassword');
$this->doTestLoginForm('noexpiry@silverstripe.com' , 'incorrectpassword'); $this->doTestLoginForm('noexpiry@silverstripe.com' , 'incorrectpassword');
$this->doTestLoginForm('noexpiry@silverstripe.com' , 'incorrectpassword'); $this->doTestLoginForm('noexpiry@silverstripe.com' , 'incorrectpassword');
@ -499,7 +499,7 @@ class SecurityTest extends FunctionalTest {
// BUT, DOING AN ADDITIONAL LOG-IN WITH EITHER OF THEM WILL LOCK OUT, SINCE THAT IS THE 3RD FAILURE IN // BUT, DOING AN ADDITIONAL LOG-IN WITH EITHER OF THEM WILL LOCK OUT, SINCE THAT IS THE 3RD FAILURE IN
// THIS SESSION // THIS SESSION
$this->doTestLoginForm('sam@silverstripe.com' , 'incorrectpassword'); $this->doTestLoginForm('testuser@example.com' , 'incorrectpassword');
$member1 = DataObject::get_by_id("Member", $this->idFromFixture('Member', 'test')); $member1 = DataObject::get_by_id("Member", $this->idFromFixture('Member', 'test'));
$this->assertNotNull($member1->LockedOutUntil); $this->assertNotNull($member1->LockedOutUntil);
@ -512,16 +512,16 @@ class SecurityTest extends FunctionalTest {
Security::config()->login_recording = true; Security::config()->login_recording = true;
/* UNSUCCESSFUL ATTEMPTS WITH WRONG PASSWORD FOR EXISTING USER ARE LOGGED */ /* UNSUCCESSFUL ATTEMPTS WITH WRONG PASSWORD FOR EXISTING USER ARE LOGGED */
$this->doTestLoginForm('sam@silverstripe.com', 'wrongpassword'); $this->doTestLoginForm('testuser@example.com', 'wrongpassword');
$attempt = DataObject::get_one('LoginAttempt', array( $attempt = DataObject::get_one('LoginAttempt', array(
'"LoginAttempt"."Email"' => 'sam@silverstripe.com' '"LoginAttempt"."Email"' => 'testuser@example.com'
)); ));
$this->assertTrue(is_object($attempt)); $this->assertTrue(is_object($attempt));
$member = DataObject::get_one('Member', array( $member = DataObject::get_one('Member', array(
'"Member"."Email"' => 'sam@silverstripe.com' '"Member"."Email"' => 'testuser@example.com'
)); ));
$this->assertEquals($attempt->Status, 'Failure'); $this->assertEquals($attempt->Status, 'Failure');
$this->assertEquals($attempt->Email, 'sam@silverstripe.com'); $this->assertEquals($attempt->Email, 'testuser@example.com');
$this->assertEquals($attempt->Member(), $member); $this->assertEquals($attempt->Member(), $member);
/* UNSUCCESSFUL ATTEMPTS WITH NONEXISTING USER ARE LOGGED */ /* UNSUCCESSFUL ATTEMPTS WITH NONEXISTING USER ARE LOGGED */
@ -541,16 +541,16 @@ class SecurityTest extends FunctionalTest {
Security::config()->login_recording = true; Security::config()->login_recording = true;
/* SUCCESSFUL ATTEMPTS ARE LOGGED */ /* SUCCESSFUL ATTEMPTS ARE LOGGED */
$this->doTestLoginForm('sam@silverstripe.com', '1nitialPassword'); $this->doTestLoginForm('testuser@example.com', '1nitialPassword');
$attempt = DataObject::get_one('LoginAttempt', array( $attempt = DataObject::get_one('LoginAttempt', array(
'"LoginAttempt"."Email"' => 'sam@silverstripe.com' '"LoginAttempt"."Email"' => 'testuser@example.com'
)); ));
$member = DataObject::get_one('Member', array( $member = DataObject::get_one('Member', array(
'"Member"."Email"' => 'sam@silverstripe.com' '"Member"."Email"' => 'testuser@example.com'
)); ));
$this->assertTrue(is_object($attempt)); $this->assertTrue(is_object($attempt));
$this->assertEquals($attempt->Status, 'Success'); $this->assertEquals($attempt->Status, 'Success');
$this->assertEquals($attempt->Email, 'sam@silverstripe.com'); $this->assertEquals($attempt->Email, 'testuser@example.com');
$this->assertEquals($attempt->Member(), $member); $this->assertEquals($attempt->Member(), $member);
} }