public function tearDown()
 {
     // Preserve memory settings
     ini_set('memory_limit', $this->originalMemoryLimit ? $this->originalMemoryLimit : -1);
     // Restore email configuration
     $this->originalMailer = null;
     $this->mailer = null;
     // Restore password validation
     if ($this->originalMemberPasswordValidator) {
         Member::set_password_validator($this->originalMemberPasswordValidator);
     }
     // Restore requirements
     if ($this->originalRequirements) {
         Requirements::set_backend($this->originalRequirements);
     }
     // Mark test as no longer being run - we use originalIsRunningTest to allow for nested SapphireTest calls
     self::$is_running_test = $this->originalIsRunningTest;
     $this->originalIsRunningTest = null;
     // Reset mocked datetime
     DBDatetime::clear_mock_now();
     // Stop the redirection that might have been requested in the test.
     // Note: Ideally a clean Controller should be created for each test.
     // Now all tests executed in a batch share the same controller.
     $controller = Controller::has_curr() ? Controller::curr() : null;
     if ($controller && $controller->response && $controller->response->getHeader('Location')) {
         $controller->response->setStatusCode(200);
         $controller->response->removeHeader('Location');
     }
     Versioned::set_reading_mode($this->originalReadingMode);
     //unnest injector / config now that tests are over
     Injector::unnest();
     Config::unnest();
 }
 /**
  * Test that passwords validate against NZ e-government guidelines
  *  - don't allow the use of the last 6 passwords
  *  - require at least 3 of lowercase, uppercase, digits and punctuation
  *  - at least 7 characters long
  */
 public function testValidatePassword()
 {
     $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'test');
     $this->assertNotNull($member);
     Member::set_password_validator(new MemberTest_PasswordValidator());
     // BAD PASSWORDS
     $valid = $member->changePassword('shorty');
     $this->assertFalse($valid->valid());
     $this->assertContains("TOO_SHORT", $valid->codeList());
     $valid = $member->changePassword('longone');
     $this->assertNotContains("TOO_SHORT", $valid->codeList());
     $this->assertContains("LOW_CHARACTER_STRENGTH", $valid->codeList());
     $this->assertFalse($valid->valid());
     $valid = $member->changePassword('w1thNumb3rs');
     $this->assertNotContains("LOW_CHARACTER_STRENGTH", $valid->codeList());
     $this->assertTrue($valid->valid());
     // Clear out the MemberPassword table to ensure that the system functions properly in that situation
     DB::query("DELETE FROM \"MemberPassword\"");
     // GOOD PASSWORDS
     $valid = $member->changePassword('withSym###Ls');
     $this->assertNotContains("LOW_CHARACTER_STRENGTH", $valid->codeList());
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls2');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls3');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls4');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls5');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls6');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls7');
     $this->assertTrue($valid->valid());
     // CAN'T USE PASSWORDS 2-7, but I can use pasword 1
     $valid = $member->changePassword('withSym###Ls2');
     $this->assertFalse($valid->valid());
     $this->assertContains("PREVIOUS_PASSWORD", $valid->codeList());
     $valid = $member->changePassword('withSym###Ls5');
     $this->assertFalse($valid->valid());
     $this->assertContains("PREVIOUS_PASSWORD", $valid->codeList());
     $valid = $member->changePassword('withSym###Ls7');
     $this->assertFalse($valid->valid());
     $this->assertContains("PREVIOUS_PASSWORD", $valid->codeList());
     $valid = $member->changePassword('withSym###Ls');
     $this->assertTrue($valid->valid());
     // HAVING DONE THAT, PASSWORD 2 is now available from the list
     $valid = $member->changePassword('withSym###Ls2');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls3');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls4');
     $this->assertTrue($valid->valid());
     Member::set_password_validator(null);
 }