Introducing TitleValue
[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 * @license GPL 2+
20 * @author Daniel Kinzler
21 */
22
23 /**
24 * @covers MediaWikiPageLinkRenderer
25 *
26 * @group Title
27 */
28 class MediaWikiPageLinkRendererTest extends MediaWikiTestCase {
29
30 /**
31 * Returns a mock GenderCache that will return "female" always.
32 *
33 * @return GenderCache
34 */
35 private function getGenderCache() {
36 $genderCache = $this->getMockBuilder( 'GenderCache' )
37 ->disableOriginalConstructor()
38 ->getMock();
39
40 $genderCache->expects( $this->any() )
41 ->method( 'getGenderOf' )
42 ->will( $this->returnValue( 'female' ) );
43
44 return $genderCache;
45 }
46
47 public function provideGetPageUrl() {
48 return array(
49 array(
50 new TitleValue( NS_MAIN, 'Foo_Bar' ),
51 array(),
52 '/Foo_Bar'
53 ),
54 array(
55 new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
56 array( 'foo' => 'bar' ),
57 '/User:Hansi_Maier?foo=bar#stuff'
58 ),
59 );
60 }
61
62 /**
63 * @dataProvider provideGetPageUrl
64 */
65 public function testGetPageUrl( TitleValue $title, $params, $url ) {
66 // NOTE: was of Feb 2014, MediaWikiPageLinkRenderer *ignores* the
67 // WikitextTitleFormatter we pass here, and relies on the Linker
68 // class for generating the link! This may break the test e.g.
69 // of Linker uses a different language for the namespace names.
70
71 $lang = Language::factory( 'en' );
72
73 $formatter = new MediaWikiTitleCodec( $lang, $this->getGenderCache() );
74 $renderer = new MediaWikiPageLinkRenderer( $formatter, '/' );
75 $actual = $renderer->getPageUrl( $title, $params );
76
77 $this->assertEquals( $url, $actual );
78 }
79
80 public function provideRenderHtmlLink() {
81 return array(
82 array(
83 new TitleValue( NS_MAIN, 'Foo_Bar' ),
84 'Foo Bar',
85 '!<a .*href=".*?Foo_Bar.*?".*?>Foo Bar</a>!'
86 ),
87 array(
88 //NOTE: Linker doesn't include fragments in "broken" links
89 //NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
90 new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
91 'Hansi Maier\'s Stuff',
92 '!<a .*href=".*?User:Hansi_Maier.*?>Hansi Maier\'s Stuff</a>!'
93 ),
94 array(
95 //NOTE: Linker doesn't include fragments in "broken" links
96 //NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
97 new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
98 null,
99 '!<a .*href=".*?User:Hansi_Maier.*?>User:Hansi Maier#stuff</a>!'
100 ),
101 );
102 }
103
104 /**
105 * @dataProvider provideRenderHtmlLink
106 */
107 public function testRenderHtmlLink( TitleValue $title, $text, $pattern ) {
108 // NOTE: was of Feb 2014, MediaWikiPageLinkRenderer *ignores* the
109 // WikitextTitleFormatter we pass here, and relies on the Linker
110 // class for generating the link! This may break the test e.g.
111 // of Linker uses a different language for the namespace names.
112
113 $lang = Language::factory( 'en' );
114
115 $formatter = new MediaWikiTitleCodec( $lang, $this->getGenderCache() );
116 $renderer = new MediaWikiPageLinkRenderer( $formatter );
117 $actual = $renderer->renderHtmlLink( $title, $text );
118
119 $this->assertRegExp( $pattern, $actual );
120 }
121
122 public function provideRenderWikitextLink() {
123 return array(
124 array(
125 new TitleValue( NS_MAIN, 'Foo_Bar' ),
126 'Foo Bar',
127 '[[:0:Foo Bar|Foo Bar]]'
128 ),
129 array(
130 new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
131 'Hansi Maier\'s Stuff',
132 '[[:2:Hansi Maier#stuff|Hansi Maier&#39;s Stuff]]'
133 ),
134 array(
135 new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
136 null,
137 '[[:2:Hansi Maier#stuff|2:Hansi Maier#stuff]]'
138 ),
139 );
140 }
141
142 /**
143 * @dataProvider provideRenderWikitextLink
144 */
145 public function testRenderWikitextLink( TitleValue $title, $text, $expected ) {
146 $formatter = $this->getMock( 'TitleFormatter' );
147 $formatter->expects( $this->any() )
148 ->method( 'getFullText' )
149 ->will( $this->returnCallback(
150 function( TitleValue $title ) {
151 return str_replace( '_', ' ', "$title" );
152 }
153 ));
154
155 $renderer = new MediaWikiPageLinkRenderer( $formatter, '/' );
156 $actual = $renderer->renderWikitextLink( $title, $text );
157
158 $this->assertEquals( $expected, $actual );
159 }
160 }