1e5f9d0150351cee0dc1deacf2e987ad8353aaef
[lhc/web/wiklou.git] / tests / phpunit / includes / title / MediaWikiPageLinkRendererTest.php
1 <?php
2 /**
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 * http://www.gnu.org/copyleft/gpl.html
17 *
18 * @file
19 * @author Daniel Kinzler
20 */
21
22 /**
23 * @covers MediaWikiPageLinkRenderer
24 *
25 * @group Title
26 * @group Database
27 */
28 class MediaWikiPageLinkRendererTest extends MediaWikiTestCase {
29
30 protected function setUp() {
31 parent::setUp();
32
33 $this->setMwGlobals( array(
34 'wgContLang' => Language::factory( 'en' ),
35 ) );
36 }
37
38 /**
39 * Returns a mock GenderCache that will return "female" always.
40 *
41 * @return GenderCache
42 */
43 private function getGenderCache() {
44 $genderCache = $this->getMockBuilder( 'GenderCache' )
45 ->disableOriginalConstructor()
46 ->getMock();
47
48 $genderCache->expects( $this->any() )
49 ->method( 'getGenderOf' )
50 ->will( $this->returnValue( 'female' ) );
51
52 return $genderCache;
53 }
54
55 public static function provideGetPageUrl() {
56 return array(
57 array(
58 new TitleValue( NS_MAIN, 'Foo_Bar' ),
59 array(),
60 '/Foo_Bar'
61 ),
62 array(
63 new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
64 array( 'foo' => 'bar' ),
65 '/User:Hansi_Maier?foo=bar#stuff'
66 ),
67 );
68 }
69
70 /**
71 * @dataProvider provideGetPageUrl
72 */
73 public function testGetPageUrl( TitleValue $title, $params, $url ) {
74 // NOTE: was of Feb 2014, MediaWikiPageLinkRenderer *ignores* the
75 // WikitextTitleFormatter we pass here, and relies on the Linker
76 // class for generating the link! This may break the test e.g.
77 // of Linker uses a different language for the namespace names.
78
79 $lang = Language::factory( 'en' );
80
81 $formatter = new MediaWikiTitleCodec( $lang, $this->getGenderCache() );
82 $renderer = new MediaWikiPageLinkRenderer( $formatter, '/' );
83 $actual = $renderer->getPageUrl( $title, $params );
84
85 $this->assertEquals( $url, $actual );
86 }
87
88 public static function provideRenderHtmlLink() {
89 return array(
90 array(
91 new TitleValue( NS_MAIN, 'Foo_Bar' ),
92 'Foo Bar',
93 '!<a .*href=".*?Foo_Bar.*?".*?>Foo Bar</a>!'
94 ),
95 array(
96 //NOTE: Linker doesn't include fragments in "broken" links
97 //NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
98 new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
99 'Hansi Maier\'s Stuff',
100 '!<a .*href=".*?User:Hansi_Maier.*?>Hansi Maier\'s Stuff</a>!'
101 ),
102 array(
103 //NOTE: Linker doesn't include fragments in "broken" links
104 //NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
105 new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
106 null,
107 '!<a .*href=".*?User:Hansi_Maier.*?>User:Hansi Maier#stuff</a>!'
108 ),
109 );
110 }
111
112 /**
113 * @dataProvider provideRenderHtmlLink
114 */
115 public function testRenderHtmlLink( TitleValue $title, $text, $pattern ) {
116 // NOTE: was of Feb 2014, MediaWikiPageLinkRenderer *ignores* the
117 // WikitextTitleFormatter we pass here, and relies on the Linker
118 // class for generating the link! This may break the test e.g.
119 // of Linker uses a different language for the namespace names.
120
121 $lang = Language::factory( 'en' );
122
123 $formatter = new MediaWikiTitleCodec( $lang, $this->getGenderCache() );
124 $renderer = new MediaWikiPageLinkRenderer( $formatter );
125 $actual = $renderer->renderHtmlLink( $title, $text );
126
127 $this->assertRegExp( $pattern, $actual );
128 }
129
130 public static function provideRenderWikitextLink() {
131 return array(
132 array(
133 new TitleValue( NS_MAIN, 'Foo_Bar' ),
134 'Foo Bar',
135 '[[:0:Foo Bar|Foo Bar]]'
136 ),
137 array(
138 new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
139 'Hansi Maier\'s Stuff',
140 '[[:2:Hansi Maier#stuff|Hansi Maier&#39;s Stuff]]'
141 ),
142 array(
143 new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
144 null,
145 '[[:2:Hansi Maier#stuff|2:Hansi Maier#stuff]]'
146 ),
147 );
148 }
149
150 /**
151 * @dataProvider provideRenderWikitextLink
152 */
153 public function testRenderWikitextLink( TitleValue $title, $text, $expected ) {
154 $formatter = $this->getMock( 'TitleFormatter' );
155 $formatter->expects( $this->any() )
156 ->method( 'getFullText' )
157 ->will( $this->returnCallback(
158 function ( TitleValue $title ) {
159 return str_replace( '_', ' ', "$title" );
160 }
161 ) );
162
163 $renderer = new MediaWikiPageLinkRenderer( $formatter, '/' );
164 $actual = $renderer->renderWikitextLink( $title, $text );
165
166 $this->assertEquals( $expected, $actual );
167 }
168 }