Split large hook handler function into named methods

Change-Id: Ided2c233829166bd691f01cb8b619f03c1ca4ff2
This commit is contained in:
thiemowmde 2023-11-07 14:02:26 +01:00
parent fc4cef8c8d
commit d20cead930
2 changed files with 62 additions and 52 deletions

View file

@ -2,13 +2,15 @@
namespace MediaWiki\Extension\RevisionSlider;
use Config;
use ConfigFactory;
use Html;
use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
use MediaWiki\Config\Config;
use MediaWiki\Config\ConfigFactory;
use MediaWiki\Diff\Hook\DifferenceEngineViewHeaderHook;
use MediaWiki\Html\Html;
use MediaWiki\MainConfigNames;
use MediaWiki\Preferences\Hook\GetPreferencesHook;
use MediaWiki\Revision\RevisionRecord;
use MediaWiki\User\User;
use MediaWiki\User\UserOptionsLookup;
use Message;
use OOUI\ButtonWidget;
@ -43,12 +45,6 @@ class RevisionSliderHooks implements DifferenceEngineViewHeaderHook, GetPreferen
$oldRevRecord = $differenceEngine->getOldRevision();
$newRevRecord = $differenceEngine->getNewRevision();
// sometimes the old revision can be null (e.g. missing rev), and perhaps also the
// new one (T167359)
if ( $oldRevRecord === null || $newRevRecord === null ) {
return;
}
// do not show on MobileDiff page
// Note: Since T245172, DifferenceEngine::getTitle() is the title of the page being diffed.
if ( $differenceEngine->getOutput()->getTitle()->isSpecial( 'MobileDiff' ) ) {
@ -59,21 +55,7 @@ class RevisionSliderHooks implements DifferenceEngineViewHeaderHook, GetPreferen
* If the user is logged in and has explictly requested to disable the extension don't load.
*/
$user = $differenceEngine->getUser();
if ( $user->isNamed() && $this->userOptionsLookup->getBoolOption( $user, 'revisionslider-disable' ) ) {
return;
}
/**
* Do not show the RevisionSlider when revisions from two different pages are being compared
*
* Since RevisionRecord::getPageAsLinkTarget only returns a LinkTarget, which doesn't
* have an equals method, compare manually by namespace and text
*/
$oldTitle = $oldRevRecord->getPageAsLinkTarget();
$newTitle = $newRevRecord->getPageAsLinkTarget();
if ( $oldTitle->getNamespace() !== $newTitle->getNamespace() ||
$oldTitle->getDBKey() !== $newTitle->getDBKey()
) {
if ( $this->isDisabled( $user ) || !$this->isSamePage( $oldRevRecord, $newRevRecord ) ) {
return;
}
@ -100,6 +82,34 @@ class RevisionSliderHooks implements DifferenceEngineViewHeaderHook, GetPreferen
$out->addJsConfigVars( 'extRevisionSliderTimeOffset', intval( $timeOffset ) );
$out->enableOOUI();
$out->prependHTML( $this->getContainerHtml( $autoExpand ) );
}
public function isDisabled( User $user ): bool {
return $user->isNamed() &&
$this->userOptionsLookup->getBoolOption( $user, 'revisionslider-disable' );
}
private function isSamePage( ?RevisionRecord $oldRevRecord, ?RevisionRecord $newRevRecord ): bool {
// sometimes the old revision can be null (e.g. missing rev), and perhaps also the
// new one (T167359)
if ( !$oldRevRecord || !$newRevRecord ) {
return false;
}
/**
* Do not show the RevisionSlider when revisions from two different pages are being compared
*
* Since RevisionRecord::getPageAsLinkTarget only returns a LinkTarget, which doesn't
* have an equals method, compare manually by namespace and text
*/
$oldTitle = $oldRevRecord->getPageAsLinkTarget();
$newTitle = $newRevRecord->getPageAsLinkTarget();
return $oldTitle->getNamespace() === $newTitle->getNamespace() &&
$oldTitle->getDBKey() === $newTitle->getDBKey();
}
private function getContainerHtml( bool $autoExpand ): string {
$toggleButton = new ButtonWidget( [
'label' => ( new Message( 'revisionslider-toggle-label' ) )->text(),
'indicator' => 'down',
@ -117,21 +127,17 @@ class RevisionSliderHooks implements DifferenceEngineViewHeaderHook, GetPreferen
)
);
$out->prependHTML(
Html::rawElement(
'div',
[ 'class' => 'mw-revslider-container' ],
$toggleButton .
Html::rawElement(
'div',
[
'class' => 'mw-revslider-slider-wrapper',
'style' => ( !$autoExpand ? ' display: none;' : '' ),
],
Html::rawElement(
'div', [ 'class' => 'mw-revslider-placeholder' ],
$loadingSpinner
)
return Html::rawElement( 'div',
[ 'class' => 'mw-revslider-container' ],
$toggleButton .
Html::rawElement( 'div',
[
'class' => 'mw-revslider-slider-wrapper',
'style' => $autoExpand ? null : 'display: none;',
],
Html::rawElement( 'div',
[ 'class' => 'mw-revslider-placeholder' ],
$loadingSpinner
)
)
);

View file

@ -10,12 +10,17 @@ use MediaWiki\User\StaticUserOptionsLookup;
class RevisionSliderHooksTest extends \MediaWikiIntegrationTestCase {
public function testShouldNotLoadWithoutRevisions() {
// Assert
$output = null;
// Arrange
$output = $this->createMock( OutputPage::class );
$output->method( 'getTitle' )
->willReturn( $this->createMock( Title::class ) );
$diffEngine = $this->newDiffEngine( null, $output );
// Assert
$output->expects( $this->never() )
->method( 'addModules' );
// Act
$this->newInstance()->onDifferenceEngineViewHeader( $diffEngine );
}
@ -45,16 +50,13 @@ class RevisionSliderHooksTest extends \MediaWikiIntegrationTestCase {
public function testShouldNotLoadWhenUserIsLoggedInAndDisabledExtension() {
// Arrange
$options = [ 'revisionslider-disable' => true ];
$user = $this->createMock( User::class );
$user->method( 'isNamed' )
->willReturn( true );
$output = $this->createMock( OutputPage::class );
$output->method( 'getTitle' )
->willReturn( $this->createMock( Title::class ) );
$revision = $this->createMock( RevisionRecord::class );
$diffEngine = $this->newDiffEngine( $revision, $output, $user );
$diffEngine = $this->newDiffEngine( $revision, $output, true );
// Assert
$output->expects( $this->never() )
@ -94,19 +96,21 @@ class RevisionSliderHooksTest extends \MediaWikiIntegrationTestCase {
private function newDiffEngine(
?RevisionRecord $revision,
?OutputPage $output,
?User $user = null
OutputPage $output,
bool $isNamed = false
): DifferenceEngine {
$user = $this->createMock( User::class );
$user->method( 'isNamed' )
->willReturn( $isNamed );
$diffEngine = $this->createMock( DifferenceEngine::class );
$diffEngine->method( 'getOldRevision' )
->willReturn( $revision );
$diffEngine->method( 'getNewRevision' )
->willReturn( $revision );
$diffEngine->expects( $output ? $this->atLeastOnce() : $this->never() )
->method( 'getOutput' )
$diffEngine->method( 'getOutput' )
->willReturn( $output );
$diffEngine->expects( $user ? $this->once() : $this->never() )
->method( 'getUser' )
$diffEngine->method( 'getUser' )
->willReturn( $user );
return $diffEngine;
}