public function testgetReviewBlockers()
 {
     $superUser1 = new MockSuperUser();
     $superUser1->setId(1);
     $superUser2 = new MockSuperUser();
     $superUser2->setId(2);
     $plainUser = User::newFromName('PlainUser');
     $title = Title::makeTitle(NS_MEDIAWIKI, 'Ugakey1/fi');
     $content = ContentHandler::makeContent('trans1', $title);
     WikiPage::factory($title)->doEditContent($content, __METHOD__, 0, false, $superUser1);
     $title = Title::makeTitle(NS_MEDIAWIKI, 'Ugakey2/fi');
     $content = ContentHandler::makeContent('!!FUZZY!!trans2', $title);
     WikiPage::factory($title)->doEditContent($content, __METHOD__, 0, false, $superUser2);
     $title = Title::makeTitle(NS_MEDIAWIKI, 'Ugakey3/fi');
     $content = ContentHandler::makeContent('unknown message', $title);
     WikiPage::factory($title)->doEditContent($content, __METHOD__, 0, false, $superUser1);
     $testcases = array(array('permissiondenied', $plainUser, 'Ugakey1/fi', 'Unpriviledged user is not allowed to change state'), array('owntranslation', $superUser1, 'Ugakey1/fi', 'Cannot approve own translation'), array('fuzzymessage', $superUser1, 'Ugakey2/fi', 'Cannot approve fuzzy translation'), array('unknownmessage', $superUser1, 'Ugakey3/fi', 'Cannot approve unknown translation'), array('', $superUser2, 'Ugakey1/fi', 'Can approve non-fuzzy known non-own translation'));
     foreach ($testcases as $case) {
         list($expected, $user, $page, $comment) = $case;
         $revision = Revision::newFromTitle(Title::makeTitle(NS_MEDIAWIKI, $page));
         $ok = ApiTranslationReview::getReviewBlockers($user, $revision);
         $this->assertEquals($expected, $ok, $comment);
     }
 }
 protected function getReviewButton(TMessage $message)
 {
     $revision = $message->getProperty('revision');
     $user = $this->context->getUser();
     if (!$this->reviewMode || !$user->isAllowed('translate-messagereview') || !$revision) {
         return '';
     }
     $attribs = array('type' => 'button', 'class' => 'mw-translate-messagereviewbutton', 'data-token' => ApiTranslationReview::getToken(0, ''), 'data-revision' => $revision, 'name' => 'acceptbutton-' . $revision);
     $reviewers = (array) $message->getProperty('reviewers');
     if (in_array($user->getId(), $reviewers)) {
         $attribs['value'] = wfMessage('translate-messagereview-done')->text();
         $attribs['disabled'] = 'disabled';
         $attribs['title'] = wfMessage('translate-messagereview-doit')->text();
     } elseif ($message->hasTag('fuzzy')) {
         $attribs['value'] = wfMessage('translate-messagereview-submit')->text();
         $attribs['disabled'] = 'disabled';
         $attribs['title'] = wfMessage('translate-messagereview-no-fuzzy')->text();
     } elseif ($user->getName() === $message->getProperty('last-translator-text')) {
         $attribs['value'] = wfMessage('translate-messagereview-submit')->text();
         $attribs['disabled'] = 'disabled';
         $attribs['title'] = wfMessage('translate-messagereview-no-own')->text();
     } else {
         $attribs['value'] = wfMessage('translate-messagereview-submit')->text();
     }
     $review = Html::element('input', $attribs);
     return $review;
 }
 /**
  * @group Broken
  * This tests fails regularly on WMF CI but haven't been able to reproduce locally.
  */
 public function testHooks()
 {
     $user = new MockSuperUser();
     $group = MessageGroups::getGroup('group-trans');
     // In the beginning...
     $currentState = ApiGroupReview::getState($group, 'fi');
     $this->assertEquals(false, $currentState, 'groups start from unset state');
     // First translation
     $title = Title::newFromText('MediaWiki:key1/fi');
     $page = WikiPage::factory($title);
     $content = ContentHandler::makeContent('trans1', $title);
     $status = $page->doEditContent($content, __METHOD__, 0, false, $user);
     self::runJobs();
     $currentState = ApiGroupReview::getState($group, 'fi');
     $this->assertEquals('inprogress', $currentState, 'in progress after first translation');
     // First review
     ApiTranslationReview::doReview($user, self::getRevision($status), __METHOD__);
     self::runJobs();
     $currentState = ApiGroupReview::getState($group, 'fi');
     $this->assertEquals('inprogress', $currentState, 'in progress while untranslated messages');
     // Second translation
     $title = Title::newFromText('MediaWiki:key2/fi');
     $page = WikiPage::factory($title);
     $content = ContentHandler::makeContent('trans2', $title);
     $status = $page->doEditContent($content, __METHOD__, 0, false, $user);
     self::runJobs();
     $currentState = ApiGroupReview::getState($group, 'fi');
     $this->assertEquals('proofreading', $currentState, 'proofreading after second translation');
     // Second review
     ApiTranslationReview::doReview($user, self::getRevision($status), __METHOD__);
     self::runJobs();
     $currentState = ApiGroupReview::getState($group, 'fi');
     $this->assertEquals('ready', $currentState, 'ready when all proofread');
     // Change to translation
     $title = Title::newFromText('MediaWiki:key1/fi');
     $page = WikiPage::factory($title);
     $content = ContentHandler::makeContent('trans1 updated', $title);
     $page->doEditContent($content, __METHOD__, 0, false, $user);
     self::runJobs();
     $currentState = ApiGroupReview::getState($group, 'fi');
     $this->assertEquals('proofreading', $currentState, 'back to proofreading after translation changed');
 }