221 lines
5.2 KiB
PHP
221 lines
5.2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @group Skin
|
|
*/
|
|
class SideBarTest extends MediaWikiLangTestCase {
|
|
|
|
/**
|
|
* A skin template, reinitialized before each test
|
|
* @var SkinTemplate
|
|
*/
|
|
private $skin;
|
|
/** Local cache for sidebar messages */
|
|
private $messages;
|
|
|
|
/** Build $this->messages array */
|
|
private function initMessagesHref() {
|
|
# List of default messages for the sidebar. The sidebar doesn't care at
|
|
# all whether they are full URLs, interwiki links or local titles.
|
|
$URL_messages = [
|
|
'mainpage',
|
|
'portal-url',
|
|
'currentevents-url',
|
|
'recentchanges-url',
|
|
'randompage-url',
|
|
'helppage',
|
|
];
|
|
|
|
# We're assuming that isValidURI works as advertised: it's also
|
|
# tested separately, in tests/phpunit/includes/HttpTest.php.
|
|
foreach ( $URL_messages as $m ) {
|
|
$titleName = MessageCache::singleton()->get( $m );
|
|
if ( Http::isValidURI( $titleName ) ) {
|
|
$this->messages[$m]['href'] = $titleName;
|
|
} else {
|
|
$title = Title::newFromText( $titleName );
|
|
$this->messages[$m]['href'] = $title->getLocalURL();
|
|
}
|
|
}
|
|
}
|
|
|
|
protected function setUp() {
|
|
parent::setUp();
|
|
$this->initMessagesHref();
|
|
$this->skin = new SkinTemplate();
|
|
$this->skin->getContext()->setLanguage( Language::factory( 'en' ) );
|
|
}
|
|
|
|
/**
|
|
* Internal helper to test the sidebar
|
|
* @param array $expected
|
|
* @param string $text
|
|
* @param string $message (Default: '')
|
|
* @todo this assert method to should be converted to a test using a dataprovider..
|
|
*/
|
|
private function assertSideBar( $expected, $text, $message = '' ) {
|
|
$bar = [];
|
|
$this->skin->addToSidebarPlain( $bar, $text );
|
|
$this->assertEquals( $expected, $bar, $message );
|
|
}
|
|
|
|
/**
|
|
* @covers SkinTemplate::addToSidebarPlain
|
|
*/
|
|
public function testSidebarWithOnlyTwoTitles() {
|
|
$this->assertSideBar(
|
|
[
|
|
'Title1' => [],
|
|
'Title2' => [],
|
|
],
|
|
'* Title1
|
|
* Title2
|
|
'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @covers SkinTemplate::addToSidebarPlain
|
|
*/
|
|
public function testExpandMessages() {
|
|
$this->assertSideBar(
|
|
[ 'Title' => [
|
|
[
|
|
'text' => 'Help',
|
|
'href' => $this->messages['helppage']['href'],
|
|
'id' => 'n-help',
|
|
'active' => null
|
|
]
|
|
] ],
|
|
'* Title
|
|
** helppage|help
|
|
'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @covers SkinTemplate::addToSidebarPlain
|
|
*/
|
|
public function testExternalUrlsRequireADescription() {
|
|
$this->setMwGlobals( [
|
|
'wgNoFollowLinks' => true,
|
|
'wgNoFollowDomainExceptions' => [],
|
|
'wgNoFollowNsExceptions' => [],
|
|
] );
|
|
$this->assertSideBar(
|
|
[ 'Title' => [
|
|
# ** https://www.mediawiki.org/| Home
|
|
[
|
|
'text' => 'Home',
|
|
'href' => 'https://www.mediawiki.org/',
|
|
'id' => 'n-Home',
|
|
'active' => null,
|
|
'rel' => 'nofollow',
|
|
],
|
|
# ** http://valid.no.desc.org/
|
|
# ... skipped since it is missing a pipe with a description
|
|
] ],
|
|
'* Title
|
|
** https://www.mediawiki.org/| Home
|
|
** http://valid.no.desc.org/
|
|
'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* T35321 - Make sure there's a | after transforming.
|
|
* @group Database
|
|
* @covers SkinTemplate::addToSidebarPlain
|
|
*/
|
|
public function testTrickyPipe() {
|
|
$this->assertSideBar(
|
|
[ 'Title' => [
|
|
# The first 2 are skipped
|
|
# Doesn't really test the url properly
|
|
# because it will vary with $wgArticlePath et al.
|
|
# ** Baz|Fred
|
|
[
|
|
'text' => 'Fred',
|
|
'href' => Title::newFromText( 'Baz' )->getLocalURL(),
|
|
'id' => 'n-Fred',
|
|
'active' => null,
|
|
],
|
|
[
|
|
'text' => 'title-to-display',
|
|
'href' => Title::newFromText( 'page-to-go-to' )->getLocalURL(),
|
|
'id' => 'n-title-to-display',
|
|
'active' => null,
|
|
],
|
|
] ],
|
|
'* Title
|
|
** {{PAGENAME|Foo}}
|
|
** Bar
|
|
** Baz|Fred
|
|
** {{PLURAL:1|page-to-go-to{{int:pipe-separator/en}}title-to-display|branch not taken}}
|
|
'
|
|
);
|
|
}
|
|
|
|
#### Attributes for external links ##########################
|
|
private function getAttribs() {
|
|
# Sidebar text we will use everytime
|
|
$text = '* Title
|
|
** https://www.mediawiki.org/| Home';
|
|
|
|
$bar = [];
|
|
$this->skin->addToSidebarPlain( $bar, $text );
|
|
|
|
return $bar['Title'][0];
|
|
}
|
|
|
|
/**
|
|
* Simple test to verify our helper assertAttribs() is functional
|
|
*/
|
|
public function testTestAttributesAssertionHelper() {
|
|
$this->setMwGlobals( [
|
|
'wgNoFollowLinks' => true,
|
|
'wgNoFollowDomainExceptions' => [],
|
|
'wgNoFollowNsExceptions' => [],
|
|
'wgExternalLinkTarget' => false,
|
|
] );
|
|
$attribs = $this->getAttribs();
|
|
|
|
$this->assertArrayHasKey( 'rel', $attribs );
|
|
$this->assertEquals( 'nofollow', $attribs['rel'] );
|
|
|
|
$this->assertArrayNotHasKey( 'target', $attribs );
|
|
}
|
|
|
|
/**
|
|
* Test $wgNoFollowLinks in sidebar
|
|
* @covers Skin::addToSidebarPlain
|
|
*/
|
|
public function testRespectWgnofollowlinks() {
|
|
$this->setMwGlobals( 'wgNoFollowLinks', false );
|
|
|
|
$attribs = $this->getAttribs();
|
|
$this->assertArrayNotHasKey( 'rel', $attribs,
|
|
'External URL in sidebar do not have rel=nofollow when $wgNoFollowLinks = false'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Test $wgExternaLinkTarget in sidebar
|
|
* @dataProvider dataRespectExternallinktarget
|
|
* @covers Skin::addToSidebarPlain
|
|
*/
|
|
public function testRespectExternallinktarget( $externalLinkTarget ) {
|
|
$this->setMwGlobals( 'wgExternalLinkTarget', $externalLinkTarget );
|
|
|
|
$attribs = $this->getAttribs();
|
|
$this->assertArrayHasKey( 'target', $attribs );
|
|
$this->assertEquals( $attribs['target'], $externalLinkTarget );
|
|
}
|
|
|
|
public static function dataRespectExternallinktarget() {
|
|
return [
|
|
[ '_blank' ],
|
|
[ '_self' ],
|
|
];
|
|
}
|
|
}
|