public function execute()
 {
     $users = 10;
     // For number of translations, limited to [0,20]
     $mean = 15;
     $stddev = 20;
     $stash = new TranslationStashStorage(wfGetDB(DB_MASTER));
     $languages = array_keys(Language::fetchLanguageNames());
     for ($i = 0; $i < $users; $i++) {
         $username = '******' . wfRandomString(6);
         $password = wfRandomString(12);
         $email = "{$username}.{$password}@blackhole.io";
         $user = TranslateSandbox::addUser($username, $password, $email);
         $language = $languages[rand(0, count($languages) - 1)];
         $count = wfGaussMs($mean, $stddev);
         $count = min(20, $count);
         $count = max(0, $count);
         for ($j = 0; $j < $count; $j++) {
             $title = Title::makeTitle(NS_MEDIAWIKI, wfRandomString(24) . '/' . $language);
             $value = array('Pupu söi');
             for ($k = rand(0, 20); $k > 0; $k--) {
                 $value[] = wfRandomString(rand(1, 28));
             }
             $value = implode("\n", $value);
             $translation = new StashedTranslation($user, $title, $value);
             $stash->addTranslation($translation);
         }
     }
 }
 protected function doCreate()
 {
     $params = $this->extractRequestParams();
     // Do validations
     foreach (explode('|', 'username|password|email') as $field) {
         if (!isset($params[$field])) {
             $this->dieUsage("Missing parameter {$field}", 'missingparam');
         }
     }
     $username = $params['username'];
     if (User::getCanonicalName($username, 'creatable') === false) {
         $this->dieUsage("User name is not acceptable", 'invalidusername');
     }
     $user = User::newFromName($username);
     if ($user->getID() !== 0) {
         $this->dieUsage("User name is in use", 'nonfreeusername');
     }
     $password = $params['password'];
     if (!$user->isValidPassword($password)) {
         $this->dieUsage("Password is not acceptable", 'invalidpassword');
     }
     $email = $params['email'];
     if (!Sanitizer::validateEmail($email)) {
         $this->dieUsage("Email is not acceptable", 'invalidemail');
     }
     $user = TranslateSandbox::addUser($username, $email, $password);
     $output = array('user' => array('name' => $user->getName(), 'id' => $user->getId()));
     $user->setOption('language', $this->getContext()->getLanguage()->getCode());
     $user->saveSettings();
     $this->getResult()->addValue(null, $this->getModuleName(), $output);
 }
 public function testPermissions()
 {
     $user = TranslateSandbox::addUser('Test user7', '*****@*****.**', 'test password');
     $title = Title::makeTitle(NS_USER_TALK, $user->getName());
     $this->assertFalse($title->userCan('edit', $user), 'Sandboxed users cannot edit their own talk page');
     TranslateSandbox::promoteUser($user);
     $this->assertTrue($title->userCan('edit', $user), 'Promoted users can edit their own talk page');
 }
 /**
  * Add users to the sandbox or delete them to facilitate browsers tests.
  * Use with caution!
  */
 public function prepareForTests()
 {
     global $wgTranslateTestUsers;
     $user = $this->getUser();
     $request = $this->getRequest();
     if (!in_array($user->getName(), $wgTranslateTestUsers, true)) {
         return;
     }
     if ($request->getVal('integrationtesting') === 'populate') {
         // Empty all the users, even if they were created manually
         // to ensure the number of users is what the tests expect
         $this->emptySandbox();
         $textUsernamePrefixes = array('Pupu', 'Orava');
         $testLanguages = array('fi', 'uk', 'nl', 'he', 'bn');
         $testLanguagesCount = count($testLanguages);
         foreach ($textUsernamePrefixes as $prefix) {
             for ($i = 0; $i < $testLanguagesCount; $i++) {
                 $name = "{$prefix}{$i}";
                 // Get rid of users, even if promoted during tests
                 $userToDelete = User::newFromName($name, false);
                 $this->deleteUserPage($userToDelete);
                 TranslateSandbox::deleteUser($userToDelete, 'force');
                 $user = TranslateSandbox::addUser($name, "{$name}@blackhole.io", 'porkkana');
                 $user->setOption('translate-sandbox', FormatJson::encode(array('languages' => array($testLanguages[$i]), 'comment' => '')));
                 $reminders = array();
                 for ($reminderIndex = 0; $reminderIndex < $i; $reminderIndex++) {
                     $reminders[] = wfTimestamp() - $reminderIndex * $i * 10000;
                 }
                 $user->setOption('translate-sandbox-reminders', implode('|', $reminders));
                 $user->saveSettings();
                 for ($j = 0; $j < $i; $j++) {
                     $title = Title::makeTitle(NS_MEDIAWIKI, wfRandomString(24) . '/' . $testLanguages[$i]);
                     $translation = 'plop';
                     $stashedTranslation = new StashedTranslation($user, $title, $translation);
                     $this->stash->addTranslation($stashedTranslation);
                 }
             }
         }
         // Another account for testing a translator to multiple languages
         $oldPolyglotUser = User::newFromName('Kissa', false);
         $this->deleteUserPage($oldPolyglotUser);
         TranslateSandbox::deleteUser($oldPolyglotUser, 'force');
         $polyglotUser = TranslateSandbox::addUser('Kissa', '*****@*****.**', 'porkkana');
         $polyglotUser->setOption('translate-sandbox', FormatJson::encode(array('languages' => $testLanguages, 'comment' => "I know some languages, and I'm a developer.")));
         $polyglotUser->saveSettings();
         for ($polyglotLang = 0; $polyglotLang < $testLanguagesCount; $polyglotLang++) {
             $title = Title::makeTitle(NS_MEDIAWIKI, wfRandomString(24) . '/' . $testLanguages[$polyglotLang]);
             $translation = "plop in {$testLanguages[$polyglotLang]}";
             $stashedTranslation = new StashedTranslation($polyglotUser, $title, $translation);
             $this->stash->addTranslation($stashedTranslation);
         }
     } elseif ($request->getVal('integrationtesting') === 'empty') {
         $this->emptySandbox();
     }
 }