+ /**
+ * @covers WikiPage::newPageUpdater
+ * @covers WikiPage::getDerivedDataUpdater
+ */
+ public function testNewPageUpdater() {
+ $user = $this->getTestUser()->getUser();
+ $page = $this->newPage( __METHOD__, __METHOD__ );
+
+ /** @var Content $content */
+ $content = $this->getMockBuilder( WikitextContent::class )
+ ->setConstructorArgs( [ 'Hello World' ] )
+ ->setMethods( [ 'getParserOutput' ] )
+ ->getMock();
+ $content->expects( $this->once() )
+ ->method( 'getParserOutput' )
+ ->willReturn( new ParserOutput( 'HTML' ) );
+
+ $updater = $page->newPageUpdater( $user );
+ $updater->setContent( 'main', $content );
+ $revision = $updater->saveRevision(
+ CommentStoreComment::newUnsavedComment( 'test' ),
+ EDIT_NEW
+ );
+
+ $this->assertSame( $revision->getId(), $page->getLatest() );
+ }
+
+ /**
+ * @covers WikiPage::newPageUpdater
+ * @covers WikiPage::getDerivedDataUpdater
+ */
+ public function testGetDerivedDataUpdater() {
+ $admin = $this->getTestSysop()->getUser();
+
+ /** @var object $page */
+ $page = $this->createPage( __METHOD__, __METHOD__ );
+ $page = TestingAccessWrapper::newFromObject( $page );
+
+ $revision = $page->getRevision()->getRevisionRecord();
+ $user = $revision->getUser();
+
+ $slotsUpdate = new RevisionSlotsUpdate();
+ $slotsUpdate->modifyContent( 'main', new WikitextContent( 'Hello World' ) );
+
+ // get a virgin updater
+ $updater1 = $page->getDerivedDataUpdater( $user );
+ $this->assertFalse( $updater1->isUpdatePrepared() );
+
+ $updater1->prepareUpdate( $revision );
+
+ // Re-use updater with same revision or content
+ $this->assertSame( $updater1, $page->getDerivedDataUpdater( $user, $revision ) );
+
+ $slotsUpdate = RevisionSlotsUpdate::newFromContent(
+ [ 'main' => $revision->getContent( 'main' ) ]
+ );
+ $this->assertSame( $updater1, $page->getDerivedDataUpdater( $user, null, $slotsUpdate ) );
+
+ // Don't re-use with different user
+ $updater2a = $page->getDerivedDataUpdater( $admin, null, $slotsUpdate );
+ $updater2a->prepareContent( $admin, $slotsUpdate, false );
+
+ $updater2b = $page->getDerivedDataUpdater( $user, null, $slotsUpdate );
+ $updater2b->prepareContent( $user, $slotsUpdate, false );
+ $this->assertNotSame( $updater2a, $updater2b );
+
+ // Don't re-use with different content
+ $updater3 = $page->getDerivedDataUpdater( $admin, null, $slotsUpdate );
+ $updater3->prepareUpdate( $revision );
+ $this->assertNotSame( $updater2b, $updater3 );
+
+ // Don't re-use if no context given
+ $updater4 = $page->getDerivedDataUpdater( $admin );
+ $updater4->prepareUpdate( $revision );
+ $this->assertNotSame( $updater3, $updater4 );
+
+ // Don't re-use if AGAIN no context given
+ $updater5 = $page->getDerivedDataUpdater( $admin );
+ $this->assertNotSame( $updater4, $updater5 );
+
+ // Don't re-use cached "virgin" unprepared updater
+ $updater6 = $page->getDerivedDataUpdater( $admin, $revision );
+ $this->assertNotSame( $updater5, $updater6 );
+ }
+