summaryrefslogtreecommitdiff
path: root/tests/phpunit/includes/TestUser.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/phpunit/includes/TestUser.php')
-rw-r--r--tests/phpunit/includes/TestUser.php126
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;
}
}