Use stashed ParserOutput during saving.
[lhc/web/wiklou.git] / tests / phpunit / includes / Revision / RevisionRendererTest.php
index fc0fa0c..5c75ede 100644 (file)
@@ -2,14 +2,18 @@
 
 namespace MediaWiki\Tests\Revision;
 
+use CommentStoreComment;
+use Content;
 use Language;
 use LogicException;
+use MediaWiki\Revision\MutableRevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use MediaWiki\Revision\RevisionRenderer;
-use MediaWiki\Storage\MutableRevisionRecord;
-use MediaWiki\Storage\RevisionRecord;
-use MediaWiki\User\UserIdentityValue;
+use MediaWiki\Revision\SlotRecord;
 use MediaWikiTestCase;
+use MediaWiki\User\UserIdentityValue;
 use ParserOptions;
+use ParserOutput;
 use PHPUnit\Framework\MockObject\MockObject;
 use Title;
 use User;
@@ -141,6 +145,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $rev = new MutableRevisionRecord( $title );
                $rev->setUser( new UserIdentityValue( 9, 'Frank', 0 ) );
                $rev->setTimestamp( '20180101000003' );
+               $rev->setComment( CommentStoreComment::newUnsavedComment( '' ) );
 
                $text = "";
                $text .= "* page:{{PAGENAME}}\n";
@@ -149,7 +154,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
                $text .= "* [[Link It]]\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options );
@@ -166,7 +171,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank', $html );
                $this->assertContains( 'time:20180101000003', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRenderedRevision_current() {
@@ -177,6 +182,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $rev->setId( 21 ); // current!
                $rev->setUser( new UserIdentityValue( 9, 'Frank', 0 ) );
                $rev->setTimestamp( '20180101000003' );
+               $rev->setComment( CommentStoreComment::newUnsavedComment( '' ) );
 
                $text = "";
                $text .= "* page:{{PAGENAME}}\n";
@@ -184,7 +190,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options );
@@ -201,7 +207,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank', $html );
                $this->assertContains( 'time:20180101000003', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRenderedRevision_master() {
@@ -212,6 +218,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $rev->setId( 21 ); // current!
                $rev->setUser( new UserIdentityValue( 9, 'Frank', 0 ) );
                $rev->setTimestamp( '20180101000003' );
+               $rev->setComment( CommentStoreComment::newUnsavedComment( '' ) );
 
                $text = "";
                $text .= "* page:{{PAGENAME}}\n";
@@ -219,7 +226,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options, null, [ 'use-master' => true ] );
@@ -230,7 +237,35 @@ class RevisionRendererTest extends MediaWikiTestCase {
 
                $this->assertContains( 'rev:21', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
+       }
+
+       public function testGetRenderedRevision_known() {
+               $renderer = $this->newRevisionRenderer( 100, true ); // use master
+               $title = $this->getMockTitle( 7, 21 );
+
+               $rev = new MutableRevisionRecord( $title );
+               $rev->setId( 21 ); // current!
+               $rev->setUser( new UserIdentityValue( 9, 'Frank', 0 ) );
+               $rev->setTimestamp( '20180101000003' );
+               $rev->setComment( CommentStoreComment::newUnsavedComment( '' ) );
+
+               $text = "uncached text";
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
+
+               $output = new ParserOutput( 'cached text' );
+
+               $options = ParserOptions::newCanonical( 'canonical' );
+               $rr = $renderer->getRenderedRevision(
+                       $rev,
+                       $options,
+                       null,
+                       [ 'known-revision-output' => $output ]
+               );
+
+               $this->assertSame( $output, $rr->getRevisionParserOutput() );
+               $this->assertSame( 'cached text', $rr->getRevisionParserOutput()->getText() );
+               $this->assertSame( 'cached text', $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRenderedRevision_old() {
@@ -241,6 +276,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $rev->setId( 11 ); // old!
                $rev->setUser( new UserIdentityValue( 9, 'Frank', 0 ) );
                $rev->setTimestamp( '20180101000003' );
+               $rev->setComment( CommentStoreComment::newUnsavedComment( '' ) );
 
                $text = "";
                $text .= "* page:{{PAGENAME}}\n";
@@ -248,7 +284,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options );
@@ -277,6 +313,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $rev->setVisibility( RevisionRecord::DELETED_TEXT ); // suppressed!
                $rev->setUser( new UserIdentityValue( 9, 'Frank', 0 ) );
                $rev->setTimestamp( '20180101000003' );
+               $rev->setComment( CommentStoreComment::newUnsavedComment( '' ) );
 
                $text = "";
                $text .= "* page:{{PAGENAME}}\n";
@@ -284,7 +321,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options );
@@ -301,6 +338,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $rev->setVisibility( RevisionRecord::DELETED_TEXT ); // suppressed!
                $rev->setUser( new UserIdentityValue( 9, 'Frank', 0 ) );
                $rev->setTimestamp( '20180101000003' );
+               $rev->setComment( CommentStoreComment::newUnsavedComment( '' ) );
 
                $text = "";
                $text .= "* page:{{PAGENAME}}\n";
@@ -308,7 +346,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $sysop = $this->getTestUser( [ 'sysop' ] )->getUser(); // privileged!
@@ -339,6 +377,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $rev->setVisibility( RevisionRecord::DELETED_TEXT ); // suppressed!
                $rev->setUser( new UserIdentityValue( 9, 'Frank', 0 ) );
                $rev->setTimestamp( '20180101000003' );
+               $rev->setComment( CommentStoreComment::newUnsavedComment( '' ) );
 
                $text = "";
                $text .= "* page:{{PAGENAME}}\n";
@@ -346,7 +385,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision(
@@ -379,14 +418,15 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $rev = new MutableRevisionRecord( $title );
                $rev->setUser( new UserIdentityValue( 9, 'Frank', 0 ) );
                $rev->setTimestamp( '20180101000003' );
+               $rev->setComment( CommentStoreComment::newUnsavedComment( '' ) );
 
-               $rev->setContent( 'main', new WikitextContent( '[[Kittens]]' ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( '[[Kittens]]' ) );
                $rev->setContent( 'aux', new WikitextContent( '[[Goats]]' ) );
 
                $rr = $renderer->getRenderedRevision( $rev );
 
                $combinedOutput = $rr->getRevisionParserOutput();
-               $mainOutput = $rr->getSlotParserOutput( 'main' );
+               $mainOutput = $rr->getSlotParserOutput( SlotRecord::MAIN );
                $auxOutput = $rr->getSlotParserOutput( 'aux' );
 
                $combinedHtml = $combinedOutput->getText();
@@ -420,4 +460,39 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $this->assertFalse( isset( $auxLinks[NS_MAIN]['Kittens'] ), 'no main links in aux' );
        }
 
+       public function testGetRenderedRevision_noHtml() {
+               /** @var MockObject|Content $mockContent */
+               $mockContent = $this->getMockBuilder( WikitextContent::class )
+                       ->setMethods( [ 'getParserOutput' ] )
+                       ->setConstructorArgs( [ 'Whatever' ] )
+                       ->getMock();
+               $mockContent->method( 'getParserOutput' )
+                       ->willReturnCallback( function ( Title $title, $revId = null,
+                               ParserOptions $options = null, $generateHtml = true
+                       ) {
+                               if ( !$generateHtml ) {
+                                       return new ParserOutput( null );
+                               } else {
+                                       $this->fail( 'Should not be called with $generateHtml == true' );
+                                       return null; // never happens, make analyzer happy
+                               }
+                       } );
+
+               $renderer = $this->newRevisionRenderer();
+               $title = $this->getMockTitle( 7, 21 );
+
+               $rev = new MutableRevisionRecord( $title );
+               $rev->setContent( SlotRecord::MAIN, $mockContent );
+               $rev->setContent( 'aux', $mockContent );
+
+               // NOTE: we are testing the private combineSlotOutput() callback here.
+               $rr = $renderer->getRenderedRevision( $rev );
+
+               $output = $rr->getSlotParserOutput( SlotRecord::MAIN, [ 'generate-html' => false ] );
+               $this->assertFalse( $output->hasText(), 'hasText' );
+
+               $output = $rr->getRevisionParserOutput( [ 'generate-html' => false ] );
+               $this->assertFalse( $output->hasText(), 'hasText' );
+       }
+
 }