mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/DiscussionTools
synced 2024-12-18 02:51:26 +00:00
15a9304bc5
For example, in case nothing is ever called it's sometimes helpful to use "NoOp" mocks to make this more visible. There is also no actual OutputPage needed, just the much more narrow interface. Change-Id: I44522276726786abd75c85c02a7003c33a5602bb
149 lines
5.2 KiB
PHP
149 lines
5.2 KiB
PHP
<?php
|
|
|
|
namespace MediaWiki\Extension\DiscussionTools\Tests;
|
|
|
|
use FormatJson;
|
|
use MediaWiki\Cache\GenderCache;
|
|
use MediaWiki\Context\IContextSource;
|
|
use MediaWiki\MainConfigNames;
|
|
use MediaWiki\MediaWikiServices;
|
|
use MediaWiki\Output\OutputPage;
|
|
use MediaWiki\Parser\ParserOutput;
|
|
use MediaWiki\Title\Title;
|
|
use MediaWiki\User\User;
|
|
use Skin;
|
|
use Wikimedia\TestingAccessWrapper;
|
|
|
|
/**
|
|
* @covers \MediaWiki\Extension\DiscussionTools\CommentFormatter
|
|
* @covers \MediaWiki\Extension\DiscussionTools\CommentUtils
|
|
*/
|
|
class CommentFormatterTest extends IntegrationTestCase {
|
|
|
|
/**
|
|
* @dataProvider provideIsLanguageRequiringReplyIcon
|
|
*/
|
|
public function testIsLanguageRequiringReplyIcon(
|
|
string $langCode, bool $expected, ?array $config = null
|
|
): void {
|
|
$lang = MediaWikiServices::getInstance()->getLanguageFactory()->getLanguage( $langCode );
|
|
if ( $config ) {
|
|
$this->overrideConfigValues( [
|
|
'DiscussionTools_visualenhancements_reply_icon_languages' => $config
|
|
] );
|
|
}
|
|
$actual = MockCommentFormatter::isLanguageRequiringReplyIcon( $lang );
|
|
static::assertEquals( $expected, $actual, $langCode );
|
|
}
|
|
|
|
public static function provideIsLanguageRequiringReplyIcon(): array {
|
|
return [
|
|
[ 'zh', true ],
|
|
[ 'zh-hant', true ],
|
|
[ 'ar', true ],
|
|
[ 'arz', true ],
|
|
[ 'arz', false, [ 'ar' => true, 'arz' => false ] ],
|
|
[ 'en', false ],
|
|
[ 'he', false ],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideAddDiscussionToolsInternal
|
|
*/
|
|
public function testAddDiscussionToolsInternal(
|
|
string $name, string $titleText, string $dom, string $expected, string $config, string $data,
|
|
bool $isMobile, bool $useButtons
|
|
): void {
|
|
$this->setService( 'GenderCache', $this->createNoOpMock( GenderCache::class ) );
|
|
$dom = static::getHtml( $dom );
|
|
$expectedPath = $expected;
|
|
$expected = static::getText( $expectedPath );
|
|
$config = static::getJson( $config );
|
|
$data = static::getJson( $data );
|
|
|
|
$this->overrideConfigValues( [
|
|
// Consistent defaults for generating canonical URLs
|
|
MainConfigNames::Server => 'https://example.org',
|
|
MainConfigNames::CanonicalServer => 'https://example.org',
|
|
MainConfigNames::ArticlePath => '/wiki/$1',
|
|
MainConfigNames::ScriptPath => '/w',
|
|
MainConfigNames::Script => '/w/index.php',
|
|
] );
|
|
|
|
$title = Title::newFromText( $titleText );
|
|
$subscriptionStore = new MockSubscriptionStore();
|
|
$user = $this->createMock( User::class );
|
|
$qqxLang = MediaWikiServices::getInstance()->getLanguageFactory()->getLanguage( 'qqx' );
|
|
$skin = $this->createMock( Skin::class );
|
|
$skin->method( 'getSkinName' )->willReturn( 'minerva' );
|
|
$outputPage = $this->createMock( IContextSource::class );
|
|
$outputPage->method( 'getTitle' )->willReturn( $title );
|
|
$outputPage->method( 'getUser' )->willReturn( $user );
|
|
$outputPage->method( 'getLanguage' )->willReturn( $qqxLang );
|
|
$outputPage->method( 'getSkin' )->willReturn( $skin );
|
|
$outputPage->method( 'msg' )->willReturn( 'a label' );
|
|
|
|
MockCommentFormatter::$parser = $this->createParser( $config, $data );
|
|
$commentFormatter = TestingAccessWrapper::newFromClass( MockCommentFormatter::class );
|
|
|
|
$pout = new ParserOutput();
|
|
$preprocessed = $commentFormatter->addDiscussionToolsInternal( $dom, $pout, $title );
|
|
$preprocessed .= "\n<pre>\n" .
|
|
"newestComment: " . FormatJson::encode(
|
|
$pout->getExtensionData( 'DiscussionTools-newestComment' ), "\t", FormatJson::ALL_OK ) . "\n" .
|
|
( $pout->getExtensionData( 'DiscussionTools-hasLedeContent' ) ?
|
|
"hasLedeContent\n" : '' ) .
|
|
( $pout->getExtensionData( 'DiscussionTools-hasCommentsInLedeContent' ) ?
|
|
"hasCommentsInLedeContent\n" : '' ) .
|
|
( $pout->getExtensionData( 'DiscussionTools-isEmptyTalkPage' ) ?
|
|
"isEmptyTalkPage\n" : '' ) .
|
|
FormatJson::encode( $pout->getJsConfigVars(), "\t", FormatJson::ALL_OK ) .
|
|
"\n</pre>";
|
|
|
|
OutputPage::setupOOUI();
|
|
|
|
$actual = $preprocessed;
|
|
|
|
$actual = MockCommentFormatter::postprocessTopicSubscription(
|
|
$actual, $outputPage, $subscriptionStore, $isMobile, $useButtons
|
|
);
|
|
|
|
$actual = MockCommentFormatter::postprocessVisualEnhancements(
|
|
$actual, $outputPage, $isMobile
|
|
);
|
|
|
|
$actual = MockCommentFormatter::postprocessReplyTool(
|
|
$actual, $outputPage, $isMobile, $useButtons
|
|
);
|
|
|
|
// OOUI ID's are non-deterministic, so strip them from test output
|
|
$actual = preg_replace( '/ id=[\'"]ooui-php-[0-9]+[\'"]/', '', $actual );
|
|
|
|
// Optionally write updated content to the "reply HTML" files
|
|
if ( getenv( 'DISCUSSIONTOOLS_OVERWRITE_TESTS' ) ) {
|
|
static::overwriteTextFile( $expectedPath, $actual );
|
|
}
|
|
|
|
static::assertEquals( $expected, $actual, $name );
|
|
}
|
|
|
|
/**
|
|
* @return iterable<array>
|
|
*/
|
|
public static function provideAddDiscussionToolsInternal() {
|
|
foreach ( static::getJson( '../cases/formatted.json' ) as $case ) {
|
|
// Run each test case twice, for desktop and mobile output
|
|
yield array_merge( $case,
|
|
[ 'expected' => $case['expected']['desktop'], 'isMobile' => false, 'useButtons' => true ] );
|
|
yield array_merge( $case,
|
|
[ 'expected' => $case['expected']['mobile'], 'isMobile' => true, 'useButtons' => true ] );
|
|
|
|
// Test the legacy output without visual enhancements (only available on desktop)
|
|
yield array_merge( $case,
|
|
[ 'expected' => $case['expected']['legacy'], 'isMobile' => false, 'useButtons' => false ] );
|
|
}
|
|
}
|
|
|
|
}
|