Merge "Revert "Log the reason why revision->getContent() returns null""
[lhc/web/wiklou.git] / tests / phpunit / includes / parser / ParserOutputTest.php
1 <?php
2
3 /**
4 * @group Database
5 * ^--- trigger DB shadowing because we are using Title magic
6 */
7 class ParserOutputTest extends MediaWikiTestCase {
8
9 public static function provideIsLinkInternal() {
10 return [
11 // Different domains
12 [ false, 'http://example.org', 'http://mediawiki.org' ],
13 // Same domains
14 [ true, 'http://example.org', 'http://example.org' ],
15 [ true, 'https://example.org', 'https://example.org' ],
16 [ true, '//example.org', '//example.org' ],
17 // Same domain different cases
18 [ true, 'http://example.org', 'http://EXAMPLE.ORG' ],
19 // Paths, queries, and fragments are not relevant
20 [ true, 'http://example.org', 'http://example.org/wiki/Main_Page' ],
21 [ true, 'http://example.org', 'http://example.org?my=query' ],
22 [ true, 'http://example.org', 'http://example.org#its-a-fragment' ],
23 // Different protocols
24 [ false, 'http://example.org', 'https://example.org' ],
25 [ false, 'https://example.org', 'http://example.org' ],
26 // Protocol relative servers always match http and https links
27 [ true, '//example.org', 'http://example.org' ],
28 [ true, '//example.org', 'https://example.org' ],
29 // But they don't match strange things like this
30 [ false, '//example.org', 'irc://example.org' ],
31 ];
32 }
33
34 /**
35 * Test to make sure ParserOutput::isLinkInternal behaves properly
36 * @dataProvider provideIsLinkInternal
37 * @covers ParserOutput::isLinkInternal
38 */
39 public function testIsLinkInternal( $shouldMatch, $server, $url ) {
40 $this->assertEquals( $shouldMatch, ParserOutput::isLinkInternal( $server, $url ) );
41 }
42
43 /**
44 * @covers ParserOutput::setExtensionData
45 * @covers ParserOutput::getExtensionData
46 */
47 public function testExtensionData() {
48 $po = new ParserOutput();
49
50 $po->setExtensionData( "one", "Foo" );
51
52 $this->assertEquals( "Foo", $po->getExtensionData( "one" ) );
53 $this->assertNull( $po->getExtensionData( "spam" ) );
54
55 $po->setExtensionData( "two", "Bar" );
56 $this->assertEquals( "Foo", $po->getExtensionData( "one" ) );
57 $this->assertEquals( "Bar", $po->getExtensionData( "two" ) );
58
59 $po->setExtensionData( "one", null );
60 $this->assertNull( $po->getExtensionData( "one" ) );
61 $this->assertEquals( "Bar", $po->getExtensionData( "two" ) );
62 }
63
64 /**
65 * @covers ParserOutput::setProperty
66 * @covers ParserOutput::getProperty
67 * @covers ParserOutput::unsetProperty
68 * @covers ParserOutput::getProperties
69 */
70 public function testProperties() {
71 $po = new ParserOutput();
72
73 $po->setProperty( 'foo', 'val' );
74
75 $properties = $po->getProperties();
76 $this->assertEquals( $po->getProperty( 'foo' ), 'val' );
77 $this->assertEquals( $properties['foo'], 'val' );
78
79 $po->setProperty( 'foo', 'second val' );
80
81 $properties = $po->getProperties();
82 $this->assertEquals( $po->getProperty( 'foo' ), 'second val' );
83 $this->assertEquals( $properties['foo'], 'second val' );
84
85 $po->unsetProperty( 'foo' );
86
87 $properties = $po->getProperties();
88 $this->assertEquals( $po->getProperty( 'foo' ), false );
89 $this->assertArrayNotHasKey( 'foo', $properties );
90 }
91
92 /**
93 * @covers ParserOutput::getText
94 * @dataProvider provideGetText
95 * @param array $options Options to getText()
96 * @param string $text Parser text
97 * @param string $expect Expected output
98 */
99 public function testGetText( $options, $text, $expect ) {
100 $this->setMwGlobals( [
101 'wgArticlePath' => '/wiki/$1',
102 'wgScriptPath' => '/w',
103 'wgScript' => '/w/index.php',
104 ] );
105
106 $po = new ParserOutput( $text );
107 $actual = $po->getText( $options );
108 $this->assertSame( $expect, $actual );
109 }
110
111 public static function provideGetText() {
112 // phpcs:disable Generic.Files.LineLength
113 $text = <<<EOF
114 <div class="mw-parser-output"><p>Test document.
115 </p>
116 <mw:toc><div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
117 <ul>
118 <li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a></li>
119 <li class="toclevel-1 tocsection-2"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a>
120 <ul>
121 <li class="toclevel-2 tocsection-3"><a href="#Section_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Section 2.1</span></a></li>
122 </ul>
123 </li>
124 <li class="toclevel-1 tocsection-4"><a href="#Section_3"><span class="tocnumber">3</span> <span class="toctext">Section 3</span></a></li>
125 </ul>
126 </div>
127 </mw:toc>
128 <h2><span class="mw-headline" id="Section_1">Section 1</span><mw:editsection page="Test Page" section="1">Section 1</mw:editsection></h2>
129 <p>One
130 </p>
131 <h2><span class="mw-headline" id="Section_2">Section 2</span><mw:editsection page="Test Page" section="2">Section 2</mw:editsection></h2>
132 <p>Two
133 </p>
134 <h3><span class="mw-headline" id="Section_2.1">Section 2.1</span><mw:editsection page="Test Page" section="3">Section 2.1</mw:editsection></h3>
135 <p>Two point one
136 </p>
137 <h2><span class="mw-headline" id="Section_3">Section 3</span><mw:editsection page="Test Page" section="4">Section 3</mw:editsection></h2>
138 <p>Three
139 </p></div>
140 EOF;
141
142 $dedupText = <<<EOF
143 <p>This is a test document.</p>
144 <style data-mw-deduplicate="duplicate1">.Duplicate1 {}</style>
145 <style data-mw-deduplicate="duplicate1">.Duplicate1 {}</style>
146 <style data-mw-deduplicate="duplicate2">.Duplicate2 {}</style>
147 <style data-mw-deduplicate="duplicate1">.Duplicate1 {}</style>
148 <style data-mw-deduplicate="duplicate2">.Duplicate2 {}</style>
149 <style data-mw-not-deduplicate="duplicate1">.Duplicate1 {}</style>
150 <style data-mw-deduplicate="duplicate1">.Same-attribute-different-content {}</style>
151 <style data-mw-deduplicate="duplicate3">.Duplicate1 {}</style>
152 <style>.Duplicate1 {}</style>
153 EOF;
154
155 return [
156 'No options' => [
157 [], $text, <<<EOF
158 <div class="mw-parser-output"><p>Test document.
159 </p>
160 <div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
161 <ul>
162 <li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a></li>
163 <li class="toclevel-1 tocsection-2"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a>
164 <ul>
165 <li class="toclevel-2 tocsection-3"><a href="#Section_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Section 2.1</span></a></li>
166 </ul>
167 </li>
168 <li class="toclevel-1 tocsection-4"><a href="#Section_3"><span class="tocnumber">3</span> <span class="toctext">Section 3</span></a></li>
169 </ul>
170 </div>
171
172 <h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
173 <p>One
174 </p>
175 <h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=2" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
176 <p>Two
177 </p>
178 <h3><span class="mw-headline" id="Section_2.1">Section 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=3" title="Edit section: Section 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
179 <p>Two point one
180 </p>
181 <h2><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=4" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
182 <p>Three
183 </p></div>
184 EOF
185 ],
186 'Disable section edit links' => [
187 [ 'enableSectionEditLinks' => false ], $text, <<<EOF
188 <div class="mw-parser-output"><p>Test document.
189 </p>
190 <div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
191 <ul>
192 <li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a></li>
193 <li class="toclevel-1 tocsection-2"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a>
194 <ul>
195 <li class="toclevel-2 tocsection-3"><a href="#Section_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Section 2.1</span></a></li>
196 </ul>
197 </li>
198 <li class="toclevel-1 tocsection-4"><a href="#Section_3"><span class="tocnumber">3</span> <span class="toctext">Section 3</span></a></li>
199 </ul>
200 </div>
201
202 <h2><span class="mw-headline" id="Section_1">Section 1</span></h2>
203 <p>One
204 </p>
205 <h2><span class="mw-headline" id="Section_2">Section 2</span></h2>
206 <p>Two
207 </p>
208 <h3><span class="mw-headline" id="Section_2.1">Section 2.1</span></h3>
209 <p>Two point one
210 </p>
211 <h2><span class="mw-headline" id="Section_3">Section 3</span></h2>
212 <p>Three
213 </p></div>
214 EOF
215 ],
216 'Disable TOC' => [
217 [ 'allowTOC' => false ], $text, <<<EOF
218 <div class="mw-parser-output"><p>Test document.
219 </p>
220
221 <h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
222 <p>One
223 </p>
224 <h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=2" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
225 <p>Two
226 </p>
227 <h3><span class="mw-headline" id="Section_2.1">Section 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=3" title="Edit section: Section 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
228 <p>Two point one
229 </p>
230 <h2><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=4" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
231 <p>Three
232 </p></div>
233 EOF
234 ],
235 'Unwrap text' => [
236 [ 'unwrap' => true ], $text, <<<EOF
237 <p>Test document.
238 </p>
239 <div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
240 <ul>
241 <li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a></li>
242 <li class="toclevel-1 tocsection-2"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a>
243 <ul>
244 <li class="toclevel-2 tocsection-3"><a href="#Section_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Section 2.1</span></a></li>
245 </ul>
246 </li>
247 <li class="toclevel-1 tocsection-4"><a href="#Section_3"><span class="tocnumber">3</span> <span class="toctext">Section 3</span></a></li>
248 </ul>
249 </div>
250
251 <h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
252 <p>One
253 </p>
254 <h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=2" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
255 <p>Two
256 </p>
257 <h3><span class="mw-headline" id="Section_2.1">Section 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=3" title="Edit section: Section 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
258 <p>Two point one
259 </p>
260 <h2><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=4" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
261 <p>Three
262 </p>
263 EOF
264 ],
265 'Unwrap without a mw-parser-output wrapper' => [
266 [ 'unwrap' => true ], '<div class="foobar">Content</div>', '<div class="foobar">Content</div>'
267 ],
268 'Unwrap with extra comment at end' => [
269 [ 'unwrap' => true ], '<div class="mw-parser-output"><p>Test document.</p></div>
270 <!-- Saved in parser cache... -->', '<p>Test document.</p>
271 <!-- Saved in parser cache... -->'
272 ],
273 'Style deduplication' => [
274 [], $dedupText, <<<EOF
275 <p>This is a test document.</p>
276 <style data-mw-deduplicate="duplicate1">.Duplicate1 {}</style>
277 <link rel="mw-deduplicated-inline-style" href="mw-data:duplicate1"/>
278 <style data-mw-deduplicate="duplicate2">.Duplicate2 {}</style>
279 <link rel="mw-deduplicated-inline-style" href="mw-data:duplicate1"/>
280 <link rel="mw-deduplicated-inline-style" href="mw-data:duplicate2"/>
281 <style data-mw-not-deduplicate="duplicate1">.Duplicate1 {}</style>
282 <link rel="mw-deduplicated-inline-style" href="mw-data:duplicate1"/>
283 <style data-mw-deduplicate="duplicate3">.Duplicate1 {}</style>
284 <style>.Duplicate1 {}</style>
285 EOF
286 ],
287 'Style deduplication disabled' => [
288 [ 'deduplicateStyles' => false ], $dedupText, $dedupText
289 ],
290 ];
291 // phpcs:enable
292 }
293
294 }