17 use PHPUnit\Framework\MockObject\MockObject;
37 ->disableOriginalConstructor()
39 $mock->expects( $this->
any() )
40 ->method(
'getNamespace' )
41 ->will( $this->returnValue(
NS_MAIN ) );
42 $mock->expects( $this->
any() )
44 ->will( $this->returnValue( __CLASS__ ) );
45 $mock->expects( $this->
any() )
46 ->method(
'getPrefixedText' )
47 ->will( $this->returnValue( __CLASS__ ) );
48 $mock->expects( $this->
any() )
49 ->method(
'getDBkey' )
50 ->will( $this->returnValue( __CLASS__ ) );
51 $mock->expects( $this->
any() )
52 ->method(
'getArticleID' )
53 ->will( $this->returnValue( $articleId ) );
54 $mock->expects( $this->
any() )
55 ->method(
'getLatestRevId' )
56 ->will( $this->returnValue( $revisionId ) );
57 $mock->expects( $this->
any() )
58 ->method(
'getContentModel' )
60 $mock->expects( $this->
any() )
61 ->method(
'getPageLanguage' )
63 $mock->expects( $this->
any() )
64 ->method(
'isContentPage' )
65 ->will( $this->returnValue(
true ) );
66 $mock->expects( $this->
any() )
69 function (
Title $other )
use ( $mock ) {
73 $mock->expects( $this->
any() )
77 return $user->isAllowed( $perm );
93 $db->method(
'selectField' )
95 function ( $table, $fields, $cond )
use ( $maxRev, $linkCount ) {
119 $lb->method(
'getConnection' )
122 $lb->method(
'getConnectionRef' )
125 $lb->method(
'getLazyConnectionRef' )
133 if ( [ $table, $fields, $cond ] === [
'revision',
'MAX(rev_id)', [] ] ) {
137 $this->fail(
'Unexpected call to selectField' );
138 throw new LogicException(
'Ooops' );
147 $rev->setTimestamp(
'20180101000003' );
151 $text .=
"* page:{{PAGENAME}}\n";
152 $text .=
"* rev:{{REVISIONID}}\n";
153 $text .=
"* user:{{REVISIONUSER}}\n";
154 $text .=
"* time:{{REVISIONTIMESTAMP}}\n";
155 $text .=
"* [[Link It]]\n";
162 $this->assertFalse( $rr->isContentDeleted(),
'isContentDeleted' );
164 $this->assertSame(
$rev, $rr->getRevision() );
165 $this->assertSame(
$options, $rr->getOptions() );
167 $html = $rr->getRevisionParserOutput()->getText();
169 $this->assertContains(
'page:' . __CLASS__,
$html );
170 $this->assertContains(
'rev:101',
$html );
171 $this->assertContains(
'user:Frank',
$html );
172 $this->assertContains(
'time:20180101000003',
$html );
184 $rev->setTimestamp(
'20180101000003' );
188 $text .=
"* page:{{PAGENAME}}\n";
189 $text .=
"* rev:{{REVISIONID}}\n";
190 $text .=
"* user:{{REVISIONUSER}}\n";
191 $text .=
"* time:{{REVISIONTIMESTAMP}}\n";
198 $this->assertFalse( $rr->isContentDeleted(),
'isContentDeleted' );
200 $this->assertSame(
$rev, $rr->getRevision() );
201 $this->assertSame(
$options, $rr->getOptions() );
203 $html = $rr->getRevisionParserOutput()->getText();
205 $this->assertContains(
'page:' . __CLASS__,
$html );
206 $this->assertContains(
'rev:21',
$html );
207 $this->assertContains(
'user:Frank',
$html );
208 $this->assertContains(
'time:20180101000003',
$html );
220 $rev->setTimestamp(
'20180101000003' );
224 $text .=
"* page:{{PAGENAME}}\n";
225 $text .=
"* rev:{{REVISIONID}}\n";
226 $text .=
"* user:{{REVISIONUSER}}\n";
227 $text .=
"* time:{{REVISIONTIMESTAMP}}\n";
232 $rr = $renderer->getRenderedRevision(
$rev,
$options,
null, [
'use-master' =>
true ] );
234 $this->assertFalse( $rr->isContentDeleted(),
'isContentDeleted' );
236 $html = $rr->getRevisionParserOutput()->getText();
238 $this->assertContains(
'rev:21',
$html );
250 $rev->setTimestamp(
'20180101000003' );
254 $text .=
"* page:{{PAGENAME}}\n";
255 $text .=
"* rev:{{REVISIONID}}\n";
256 $text .=
"* user:{{REVISIONUSER}}\n";
257 $text .=
"* time:{{REVISIONTIMESTAMP}}\n";
264 $this->assertFalse( $rr->isContentDeleted(),
'isContentDeleted' );
266 $this->assertSame(
$rev, $rr->getRevision() );
267 $this->assertSame(
$options, $rr->getOptions() );
269 $html = $rr->getRevisionParserOutput()->getText();
271 $this->assertContains(
'page:' . __CLASS__,
$html );
272 $this->assertContains(
'rev:11',
$html );
273 $this->assertContains(
'user:Frank',
$html );
274 $this->assertContains(
'time:20180101000003',
$html );
276 $this->assertSame(
$html, $rr->getSlotParserOutput(
'main' )->getText() );
287 $rev->setTimestamp(
'20180101000003' );
291 $text .=
"* page:{{PAGENAME}}\n";
292 $text .=
"* rev:{{REVISIONID}}\n";
293 $text .=
"* user:{{REVISIONUSER}}\n";
294 $text .=
"* time:{{REVISIONTIMESTAMP}}\n";
301 $this->assertNull( $rr,
'getRenderedRevision' );
312 $rev->setTimestamp(
'20180101000003' );
316 $text .=
"* page:{{PAGENAME}}\n";
317 $text .=
"* rev:{{REVISIONID}}\n";
318 $text .=
"* user:{{REVISIONUSER}}\n";
319 $text .=
"* time:{{REVISIONTIMESTAMP}}\n";
324 $sysop = $this->
getTestUser( [
'sysop' ] )->getUser();
325 $rr = $renderer->getRenderedRevision(
$rev,
$options, $sysop );
327 $this->assertTrue( $rr->isContentDeleted(),
'isContentDeleted' );
329 $this->assertSame(
$rev, $rr->getRevision() );
330 $this->assertSame(
$options, $rr->getOptions() );
332 $html = $rr->getRevisionParserOutput()->getText();
335 $this->assertContains(
'page:' . __CLASS__,
$html );
336 $this->assertContains(
'rev:11',
$html );
337 $this->assertContains(
'user:Frank',
$html );
338 $this->assertContains(
'time:20180101000003',
$html );
340 $this->assertSame(
$html, $rr->getSlotParserOutput(
'main' )->getText() );
351 $rev->setTimestamp(
'20180101000003' );
355 $text .=
"* page:{{PAGENAME}}\n";
356 $text .=
"* rev:{{REVISIONID}}\n";
357 $text .=
"* user:{{REVISIONUSER}}\n";
358 $text .=
"* time:{{REVISIONTIMESTAMP}}\n";
363 $rr = $renderer->getRenderedRevision(
370 $this->assertTrue( $rr->isContentDeleted(),
'isContentDeleted' );
372 $this->assertSame(
$rev, $rr->getRevision() );
373 $this->assertSame(
$options, $rr->getOptions() );
375 $html = $rr->getRevisionParserOutput()->getText();
378 $this->assertContains(
'page:' . __CLASS__,
$html );
379 $this->assertContains(
'rev:11',
$html );
380 $this->assertContains(
'user:Frank',
$html );
381 $this->assertContains(
'time:20180101000003',
$html );
383 $this->assertSame(
$html, $rr->getSlotParserOutput(
'main' )->getText() );
392 $rev->setTimestamp(
'20180101000003' );
398 $rr = $renderer->getRenderedRevision(
$rev );
400 $combinedOutput = $rr->getRevisionParserOutput();
402 $auxOutput = $rr->getSlotParserOutput(
'aux' );
404 $combinedHtml = $combinedOutput->getText();
405 $mainHtml = $mainOutput->getText();
406 $auxHtml = $auxOutput->getText();
408 $this->assertContains(
'Kittens', $mainHtml );
409 $this->assertContains(
'Goats', $auxHtml );
410 $this->assertNotContains(
'Goats', $mainHtml );
411 $this->assertNotContains(
'Kittens', $auxHtml );
412 $this->assertContains(
'Kittens', $combinedHtml );
413 $this->assertContains(
'Goats', $combinedHtml );
414 $this->assertContains(
'>aux<', $combinedHtml,
'slot header' );
415 $this->assertNotContains(
'<mw:slotheader', $combinedHtml,
'slot header placeholder' );
418 $this->assertContains(
'class="mw-parser-output"', $mainHtml );
419 $this->assertContains(
'class="mw-parser-output"', $auxHtml );
420 $this->assertContains(
'class="mw-parser-output"', $combinedHtml );
423 $this->assertSame( 1, preg_match_all(
'#class="mw-parser-output"#', $combinedHtml ) );
424 $this->assertNotContains(
'class="mw-parser-output"', $combinedOutput->getRawText() );
426 $combinedLinks = $combinedOutput->getLinks();
427 $mainLinks = $mainOutput->getLinks();
428 $auxLinks = $auxOutput->getLinks();
429 $this->assertTrue( isset( $combinedLinks[
NS_MAIN][
'Kittens'] ),
'links from main slot' );
430 $this->assertTrue( isset( $combinedLinks[
NS_MAIN][
'Goats'] ),
'links from aux slot' );
431 $this->assertFalse( isset( $mainLinks[
NS_MAIN][
'Goats'] ),
'no aux links in main' );
432 $this->assertFalse( isset( $auxLinks[
NS_MAIN][
'Kittens'] ),
'no main links in aux' );
438 ->setMethods( [
'getParserOutput' ] )
439 ->setConstructorArgs( [
'Whatever' ] )
441 $mockContent->method(
'getParserOutput' )
442 ->willReturnCallback(
function (
Title $title, $revId =
null,
445 if ( !$generateHtml ) {
448 $this->fail(
'Should not be called with $generateHtml == true' );
458 $rev->setContent(
'aux', $mockContent );
461 $rr = $renderer->getRenderedRevision(
$rev );
464 $this->assertFalse(
$output->hasText(),
'hasText' );
466 $output = $rr->getRevisionParserOutput( [
'generate-html' =>
false ] );
467 $this->assertFalse(
$output->hasText(),
'hasText' );