diff options
Diffstat (limited to 'tests/phpunit/includes/TestUser.php')
-rw-r--r-- | tests/phpunit/includes/TestUser.php | 126 |
1 files changed, 105 insertions, 21 deletions
diff --git a/tests/phpunit/includes/TestUser.php b/tests/phpunit/includes/TestUser.php index 610a6acd..754568d0 100644 --- a/tests/phpunit/includes/TestUser.php +++ b/tests/phpunit/includes/TestUser.php @@ -5,24 +5,41 @@ * like password if we log in via the API. */ class TestUser { + /** + * @deprecated Since 1.25. Use TestUser::getUser()->getName() + * @private + * @var string + */ public $username; + + /** + * @deprecated Since 1.25. Use TestUser::getPassword() + * @private + * @var string + */ public $password; - public $email; - public $groups; + + /** + * @deprecated Since 1.25. Use TestUser::getUser() + * @private + * @var User + */ public $user; + private function assertNotReal() { + global $wgDBprefix; + if ( $wgDBprefix !== MediaWikiTestCase::DB_PREFIX && $wgDBprefix !== MediaWikiTestCase::ORA_DB_PREFIX ) { + throw new MWException( "Can't create user on real database" ); + } + } + public function __construct( $username, $realname = 'Real Name', $email = 'sample@example.com', $groups = array() ) { - $this->username = $username; - $this->realname = $realname; - $this->email = $email; - $this->groups = $groups; + $this->assertNotReal(); - // don't allow user to hardcode or select passwords -- people sometimes run tests - // on live wikis. Sometimes we create sysop users in these tests. A sysop user with - // a known password would be a Bad Thing. - $this->password = User::randomPassword(); + $this->username = $username; + $this->password = 'TestUser'; $this->user = User::newFromName( $this->username ); $this->user->load(); @@ -31,32 +48,99 @@ class TestUser { // But for now, we just need to create or update the user with the desired properties. // we particularly need the new password, since we just generated it randomly. // In core MediaWiki, there is no functionality to delete users, so this is the best we can do. - if ( !$this->user->getID() ) { + if ( !$this->user->isLoggedIn() ) { // create the user $this->user = User::createNew( $this->username, array( - "email" => $this->email, - "real_name" => $this->realname + "email" => $email, + "real_name" => $realname ) ); + if ( !$this->user ) { - throw new Exception( "error creating user" ); + throw new MWException( "Error creating TestUser " . $username ); } } - // update the user to use the new random password and other details - $this->user->setPassword( $this->password ); - $this->user->setEmail( $this->email ); - $this->user->setRealName( $this->realname ); + // Update the user to use the password and other details + $change = $this->setPassword( $this->password ) || + $this->setEmail( $email ) || + $this->setRealName( $realname ); // Adjust groups by adding any missing ones and removing any extras $currentGroups = $this->user->getGroups(); - foreach ( array_diff( $this->groups, $currentGroups ) as $group ) { + foreach ( array_diff( $groups, $currentGroups ) as $group ) { $this->user->addGroup( $group ); } - foreach ( array_diff( $currentGroups, $this->groups ) as $group ) { + foreach ( array_diff( $currentGroups, $groups ) as $group ) { $this->user->removeGroup( $group ); } - $this->user->saveSettings(); + if ( $change ) { + $this->user->saveSettings(); + } + } + + /** + * @param string $realname + * @return bool + */ + private function setRealName( $realname ) { + if ( $this->user->getRealName() !== $realname ) { + $this->user->setRealName( $realname ); + return true; + } + + return false; + } + + /** + * @param string $email + * @return bool + */ + private function setEmail( $email ) { + if ( $this->user->getEmail() !== $email ) { + $this->user->setEmail( $email ); + return true; + } + + return false; + } + + /** + * @param string $password + * @return bool + */ + private function setPassword( $password ) { + $passwordFactory = $this->user->getPasswordFactory(); + $oldDefaultType = $passwordFactory->getDefaultType(); + + // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only + $passwordFactory->setDefaultType( 'A' ); + $newPassword = $passwordFactory->newFromPlaintext( $password, $this->user->getPassword() ); + + $change = false; + if ( !$this->user->getPassword()->equals( $newPassword ) ) { + // Password changed + $this->user->setPassword( $password ); + $change = true; + } + + $passwordFactory->setDefaultType( $oldDefaultType ); + + return $change; + } + + /** + * @return User + */ + public function getUser() { + return $this->user; + } + + /** + * @return string + */ + public function getPassword() { + return $this->password; } } |