diff --git a/tests/phpunit/LinkerTest.php b/tests/phpunit/LinkerTest.php index 5b9a97b..c53333c 100644 --- a/tests/phpunit/LinkerTest.php +++ b/tests/phpunit/LinkerTest.php @@ -1,5 +1,7 @@ ('bovender') * * This program is free software; you can redistribute it and/or modify @@ -26,136 +28,206 @@ * The test class is prefixed with 'LinkTitles' to avoid a naming collision * with a class that exists in the MediaWiki core. * - * Ideally the test classes should be namespaced, but when you do that, they - * will no longer be automatically discovered. + * (Ideally the test classes should be namespaced, but when you do that, they + * will no longer be automatically discovered.) * * @group Database */ class LinkTitlesLinkerTest extends LinkTitles\TestCase { - protected $title; + protected $title; - protected function setUp() { - $this->title = $this->insertPage( 'source page', 'This page is the test page' )['title']; - parent::setUp(); // call last to have the Targets object invalidated after inserting the page + protected function setUp() { + $this->title = $this->insertPage( 'source page', 'This page is the test page' )['title']; + parent::setUp(); // call last to have the Targets object invalidated after inserting the page + } + + + public function addDBDataOnce() { + $this->insertPage( 'link target', 'This page serves as a link target' ); + parent::addDBDataOnce(); // call parent after adding page to have targets invalidated } - /** - * @dataProvider provideLinkContentSmartModeData - */ - public function testLinkContentSmartMode( $capitalLinks, $smartMode, $input, $expectedOutput ) { - $this->setMwGlobals( 'wgCapitalLinks', $capitalLinks ); - $config = new LinkTitles\Config(); - $config->firstOnly = false; - $config->smartMode = $smartMode; - $linker = new LinkTitles\Linker( $config ); - $this->assertSame( $expectedOutput, $linker->linkContent( $this->title, $input )); - } - public function provideLinkContentSmartModeData() { - return [ - [ - true, // wgCapitalLinks - true, // smartMode - 'With smart mode on and $wgCapitalLinks = true, this page should link to link target', - 'With smart mode on and $wgCapitalLinks = true, this page should link to [[link target]]' - ], - [ - true, // wgCapitalLinks - false, // smartMode - 'With smart mode off and $wgCapitalLinks = true, this page should link to link target', - 'With smart mode off and $wgCapitalLinks = true, this page should link to [[link target]]' - ], - [ - true, // wgCapitalLinks - true, // smartMode - 'With smart mode on and $wgCapitalLinks = true, this page should link to Link Target', - 'With smart mode on and $wgCapitalLinks = true, this page should link to [[Link target|Link Target]]' - ], - [ - true, // wgCapitalLinks - false, // smartMode - 'With smart mode off and $wgCapitalLinks = true, this page should not link to Link Target', - 'With smart mode off and $wgCapitalLinks = true, this page should not link to Link Target' - ], - [ - false, // wgCapitalLinks - true, // smartMode - 'With smart mode on and $wgCapitalLinks = false, this page should link to Link target', - 'With smart mode on and $wgCapitalLinks = false, this page should link to [[Link target]]' - ], - [ - false, // wgCapitalLinks - true, // smartMode - 'With smart mode on and $wgCapitalLinks = false, this page should link to link target', - 'With smart mode on and $wgCapitalLinks = false, this page should link to [[Link target|link target]]' - ], - [ - false, // wgCapitalLinks - false, // smartMode - 'With smart mode off and $wgCapitalLinks = false, this page should not link to link target', - 'With smart mode off and $wgCapitalLinks = false, this page should not link to link target' - ], - [ - false, // wgCapitalLinks - false, // smartMode - 'With smart mode off and $wgCapitalLinks = false, this page should not link to Link target', - 'With smart mode off and $wgCapitalLinks = false, this page should not link to [[Link target]]' - ], - [ - false, // wgCapitalLinks - true, // smartMode - 'With smart mode on and $wgCapitalLinks = false, this page should link to Link Target', - 'With smart mode on and $wgCapitalLinks = false, this page should link to [[Link target|Link Target]]' - ], - [ - false, // wgCapitalLinks - false, // smartMode - 'With smart mode off and $wgCapitalLinks = false, this page should not link to Link Target', - 'With smart mode off and $wgCapitalLinks = false, this page should not link to Link Target' - ], - ]; - } + /** + * @dataProvider provideLinkContentData + */ + public function testLinkContentTemplates( $skipTemplates, $input, $expectedOutput ) { + $config = new LinkTitles\Config(); + $config->firstOnly = false; + $config->skipTemplates = $skipTemplates; + $linker = new LinkTitles\Linker( $config ); + $this->assertSame( $expectedOutput, $linker->linkContent( $this->title, $input )); + } - /** - * @dataProvider provideLinkContentFirstOnlyData - */ - public function testLinkContentFirstOnly( $firstOnly, $input, $expectedOutput ) { - $config = new LinkTitles\Config(); - $config->firstOnly = $firstOnly; - $linker = new LinkTitles\Linker( $config ); - $this->assertSame( $expectedOutput, $linker->linkContent( $this->title, $input )); - } + public function provideLinkContentTemplatesData() { + return [ + [ + true, // skipTemplates + 'With skipTemplates = true, a {{template|with=link target}} in it should not be linked', + 'With skipTemplates = true, a {{template|with=link target}} in it should not be linked', + ], + [ + false, // skipTemplates + 'With skipTemplates = false, a {{template|with=link target}} in it should be linked', + 'With skipTemplates = false, a {{template|with=[[link target]]}} in it should be linked', + ], + [ + false, // skipTemplates + 'With skipTemplates = false, a {{template|with=already linked [[link target]]}} in it should not be linked again', + 'With skipTemplates = false, a {{template|with=already linked [[link target]]}} in it should not be linked again', + ] + ]; + } - public function provideLinkContentFirstOnlyData() { - return [ - [ - false, // firstOnly - 'With firstOnly = false, link target is a link target multiple times', - 'With firstOnly = false, [[link target]] is a [[link target]] multiple times' - ], - [ - false, // firstOnly - 'With firstOnly = false, [[link target]] is a link target multiple times', - 'With firstOnly = false, [[link target]] is a [[link target]] multiple times' - ], - [ - true, // firstOnly - 'With firstOnly = true, link target is a link target only once', - 'With firstOnly = true, [[link target]] is a link target only once' - ], - [ - true, // firstOnly - 'With firstOnly = true, [[link target]] is a link target only once', - 'With firstOnly = true, [[link target]] is a link target only once' - ], - ]; - } - public function testLinkContentBlackList() { - $config = new LinkTitles\Config(); - $config->blackList = [ 'Foo', 'Link target', 'Bar' ]; - $linker = new LinkTitles\Linker( $config ); - $text = 'If the link target is blacklisted, it should not be linked'; - $this->assertSame( $text, $linker->linkContent( $this->title, $text ) ); - } + /** + * @dataProvider provideLinkContentSmartModeData + */ + public function testLinkContentSmartMode( $capitalLinks, $smartMode, $input, $expectedOutput ) { + $this->setMwGlobals( 'wgCapitalLinks', $capitalLinks ); + $config = new LinkTitles\Config(); + $config->firstOnly = false; + $config->smartMode = $smartMode; + $linker = new LinkTitles\Linker( $config ); + $this->assertSame( $expectedOutput, $linker->linkContent( $this->title, $input )); + } + + public function provideLinkContentSmartModeData() { + return [ + [ + true, // wgCapitalLinks + true, // smartMode + 'With smart mode on and $wgCapitalLinks = true, this page should link to link target', + 'With smart mode on and $wgCapitalLinks = true, this page should link to [[link target]]' + ], + [ + true, // wgCapitalLinks + false, // smartMode + 'With smart mode off and $wgCapitalLinks = true, this page should link to link target', + 'With smart mode off and $wgCapitalLinks = true, this page should link to [[link target]]' + ], + [ + true, // wgCapitalLinks + true, // smartMode + 'With smart mode on and $wgCapitalLinks = true, this page should link to Link Target', + 'With smart mode on and $wgCapitalLinks = true, this page should link to [[Link target|Link Target]]' + ], + [ + true, // wgCapitalLinks + false, // smartMode + 'With smart mode off and $wgCapitalLinks = true, this page should not link to Link Target', + 'With smart mode off and $wgCapitalLinks = true, this page should not link to Link Target' + ], + [ + false, // wgCapitalLinks + true, // smartMode + 'With smart mode on and $wgCapitalLinks = false, this page should link to Link target', + 'With smart mode on and $wgCapitalLinks = false, this page should link to [[Link target]]' + ], + [ + false, // wgCapitalLinks + true, // smartMode + 'With smart mode on and $wgCapitalLinks = false, this page should link to link target', + 'With smart mode on and $wgCapitalLinks = false, this page should link to [[Link target|link target]]' + ], + [ + false, // wgCapitalLinks + false, // smartMode + 'With smart mode off and $wgCapitalLinks = false, this page should not link to link target', + 'With smart mode off and $wgCapitalLinks = false, this page should not link to link target' + ], + [ + false, // wgCapitalLinks + false, // smartMode + 'With smart mode off and $wgCapitalLinks = false, this page should not link to Link target', + 'With smart mode off and $wgCapitalLinks = false, this page should not link to [[Link target]]' + ], + [ + false, // wgCapitalLinks + true, // smartMode + 'With smart mode on and $wgCapitalLinks = false, this page should link to Link Target', + 'With smart mode on and $wgCapitalLinks = false, this page should link to [[Link target|Link Target]]' + ], + [ + false, // wgCapitalLinks + false, // smartMode + 'With smart mode off and $wgCapitalLinks = false, this page should not link to Link Target', + 'With smart mode off and $wgCapitalLinks = false, this page should not link to Link Target' + ], + ]; + } + + /** + * @dataProvider provideLinkContentFirstOnlyData + */ + public function testLinkContentFirstOnly( $firstOnly, $input, $expectedOutput ) { + $config = new LinkTitles\Config(); + $config->firstOnly = $firstOnly; + $linker = new LinkTitles\Linker( $config ); + $this->assertSame( $expectedOutput, $linker->linkContent( $this->title, $input )); + } + + public function provideLinkContentFirstOnlyData() { + return [ + [ + false, // firstOnly + 'With firstOnly = false, link target is a link target multiple times', + 'With firstOnly = false, [[link target]] is a [[link target]] multiple times' + ], + [ + false, // firstOnly + 'With firstOnly = false, [[link target]] is a link target multiple times', + 'With firstOnly = false, [[link target]] is a [[link target]] multiple times' + ], + [ + true, // firstOnly + 'With firstOnly = true, link target is a link target only once', + 'With firstOnly = true, [[link target]] is a link target only once' + ], + [ + true, // firstOnly + 'With firstOnly = true, [[link target]] is a link target only once', + 'With firstOnly = true, [[link target]] is a link target only once' + ], + ]; + } + + public function testLinkContentBlackList() { + $config = new LinkTitles\Config(); + $config->blackList = [ 'Foo', 'link target', 'Bar' ]; + $linker = new LinkTitles\Linker( $config ); + $text = 'If the link target is blacklisted, it should not be linked'; + $this->assertSame( $text, $linker->linkContent( $this->title, $text ) ); + } + + /** + * @dataProvider provideLinkContentNameSpacesData + */ + public function testLinkContentNameSpaces( $nameSpaces, $input, $expectedOutput ) { + $ns = 3000; + $this->setMwGlobals( [ + "wgExtraNameSpaces[$ns]" => 'custom_namespace' + ] ); + $this->insertPage( 'in custom namespace', 'This is a page in a custom namespace', $ns ); + $config = new LinkTitles\Config(); + $config->nameSpaces = $nameSpaces; + $linker = new LinkTitles\Linker( $config ); + $this->assertSame( $expectedOutput, $linker->linkContent( $this->title, $input )); + } + + public function provideLinkContentNameSpacesData() { + return [ + [ + [], // nameSpaces + 'With nameSpaces = [], page in custom namespace should not be linked', + 'With firstOnly = [], page in custom namespace should not be linked' + ], + [ + [ 3000 ], // nameSpaces + 'With nameSpaces = [], page in custom namespace should be linked', + 'With firstOnly = [], page [[in custom namespace]] should be linked' + ], + ]; + } + }