Tests for preserving content ID and origin during undeletion
authordaniel <daniel.kinzler@wikimedia.de>
Tue, 10 Apr 2018 15:31:33 +0000 (17:31 +0200)
committerAddshore <addshorewiki@gmail.com>
Thu, 14 Jun 2018 13:51:01 +0000 (13:51 +0000)
Bug: T194015
Change-Id: I6d9a1390c7080d910d43097afb703d13cd500c1b

tests/phpunit/includes/Storage/RevisionStoreDbTestBase.php

index 5927cfc..7ea0627 100644 (file)
@@ -732,6 +732,26 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $this->assertSame( $rev->getContentFormat(), $record->getContent( 'main' )->getDefaultFormat() );
                $this->assertSame( $rev->getContentModel(), $record->getContent( 'main' )->getModel() );
                $this->assertLinkTargetsEqual( $rev->getTitle(), $record->getPageAsLinkTarget() );
+
+               $revRec = $rev->getRevisionRecord();
+               $revMain = $revRec->getSlot( 'main' );
+               $recMain = $record->getSlot( 'main' );
+
+               $this->assertSame( $revMain->hasOrigin(), $recMain->hasOrigin(), 'hasOrigin' );
+               $this->assertSame( $revMain->hasAddress(), $recMain->hasAddress(), 'hasAddress' );
+               $this->assertSame( $revMain->hasContentId(), $recMain->hasContentId(), 'hasContentId' );
+
+               if ( $revMain->hasOrigin() ) {
+                       $this->assertSame( $revMain->getOrigin(), $recMain->getOrigin(), 'getOrigin' );
+               }
+
+               if ( $revMain->hasAddress() ) {
+                       $this->assertSame( $revMain->getAddress(), $recMain->getAddress(), 'getAddress' );
+               }
+
+               if ( $revMain->hasContentId() ) {
+                       $this->assertSame( $revMain->getContentId(), $recMain->getContentId(), 'getContentId' );
+               }
        }
 
        /**
@@ -871,6 +891,58 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $this->assertSame( $text, $record->getContent( 'main' )->serialize() );
        }
 
+       /**
+        * @covers \MediaWiki\Storage\RevisionStore::insertRevisionOn
+        */
+       public function testInsertRevisionOn_archive() {
+               $store = MediaWikiServices::getInstance()->getRevisionStore();
+               $title = Title::newFromText( __METHOD__ );
+
+               $page = WikiPage::factory( $title );
+               /** @var Revision $origRev */
+               $page->doEditContent( new WikitextContent( "First" ), __METHOD__ . '-first' );
+               $origRev = $page->doEditContent( new WikitextContent( "Foo" ), __METHOD__ )
+                       ->value['revision'];
+               $orig = $origRev->getRevisionRecord();
+               $page->doDeleteArticle( __METHOD__ );
+
+               $db = wfGetDB( DB_MASTER );
+               $arQuery = $store->getArchiveQueryInfo();
+               $row = $db->selectRow(
+                       $arQuery['tables'], $arQuery['fields'], [ 'ar_rev_id' => $orig->getId() ],
+                       __METHOD__, [], $arQuery['joins']
+               );
+
+               $record = $store->newRevisionFromArchiveRow( $row );
+
+               $restored = $store->insertRevisionOn( $record, $db );
+               $this->assertSame( $orig->getPageId(), $restored->getPageId() );
+               $this->assertSame( $orig->getId(), $restored->getId() );
+               $this->assertSame( $orig->getComment()->text, $restored->getComment()->text );
+
+               $origMain = $orig->getSlot( 'main' );
+               $restoredMain = $restored->getSlot( 'main' );
+               $this->assertSame(
+                       $origMain->getOrigin(),
+                       $restoredMain->getOrigin()
+               );
+
+               if ( $origMain->hasContentId() ) {
+                       $this->assertSame(
+                               $origMain->getContentId(),
+                               $restoredMain->getContentId()
+                       );
+               }
+
+               // NOTE: we didn't restore the page row, so we can't use RevisionStore::getRevisionById
+               $this->assertSelect(
+                       'revision',
+                       [ 'rev_id' ],
+                       [ 'rev_id' => $orig->getId() ],
+                       [ [ $orig->getId() ] ]
+               );
+       }
+
        /**
         * @covers \MediaWiki\Storage\RevisionStore::loadRevisionFromId
         */