MediaWiki  REL1_20
RevisionStorageTest.php
Go to the documentation of this file.
00001 <?php
00002 
00012 class RevisionStorageTest extends MediaWikiTestCase {
00013 
00014         var $the_page;
00015 
00016         function  __construct( $name = null, array $data = array(), $dataName = '' ) {
00017                 parent::__construct( $name, $data, $dataName );
00018 
00019                 $this->tablesUsed = array_merge( $this->tablesUsed,
00020                                                  array( 'page',
00021                                                       'revision',
00022                                                       'text',
00023 
00024                                                       'recentchanges',
00025                                                       'logging',
00026 
00027                                                       'page_props',
00028                                                       'pagelinks',
00029                                                       'categorylinks',
00030                                                       'langlinks',
00031                                                       'externallinks',
00032                                                       'imagelinks',
00033                                                       'templatelinks',
00034                                                       'iwlinks' ) );
00035         }
00036 
00037         public function setUp() {
00038                 if ( !$this->the_page ) {
00039                         $this->the_page = $this->createPage( 'RevisionStorageTest_the_page', "just a dummy page" );
00040                 }
00041         }
00042 
00043         protected function makeRevision( $props = null ) {
00044                 if ( $props === null ) $props = array();
00045 
00046                 if ( !isset( $props['content'] ) && !isset( $props['text'] ) ) $props['text'] = 'Lorem Ipsum';
00047                 if ( !isset( $props['comment'] ) ) $props['comment'] = 'just a test';
00048                 if ( !isset( $props['page'] ) ) $props['page'] = $this->the_page->getId();
00049 
00050                 $rev = new Revision( $props );
00051 
00052                 $dbw = wfgetDB( DB_MASTER );
00053                 $rev->insertOn( $dbw );
00054 
00055                 return $rev;
00056         }
00057 
00058         protected function createPage( $page, $text, $model = null ) {
00059                 if ( is_string( $page ) ) $page = Title::newFromText( $page );
00060                 if ( $page instanceof Title ) $page = new WikiPage( $page );
00061 
00062                 if ( $page->exists() ) {
00063                         $page->doDeleteArticle( "done" );
00064                 }
00065 
00066                 $page->doEdit( $text, "testing", EDIT_NEW );
00067 
00068                 return $page;
00069         }
00070 
00071         protected function assertRevEquals( Revision $orig, Revision $rev = null ) {
00072                 $this->assertNotNull( $rev, 'missing revision' );
00073 
00074                 $this->assertEquals( $orig->getId(), $rev->getId() );
00075                 $this->assertEquals( $orig->getPage(), $rev->getPage() );
00076                 $this->assertEquals( $orig->getTimestamp(), $rev->getTimestamp() );
00077                 $this->assertEquals( $orig->getUser(), $rev->getUser() );
00078                 $this->assertEquals( $orig->getSha1(), $rev->getSha1() );
00079         }
00080 
00084         public function testConstructFromRow()
00085         {
00086                 $orig = $this->makeRevision();
00087 
00088                 $dbr = wfgetDB( DB_SLAVE );
00089                 $res = $dbr->select( 'revision', '*', array( 'rev_id' => $orig->getId() ) );
00090                 $this->assertTrue( is_object( $res ), 'query failed' );
00091 
00092                 $row = $res->fetchObject();
00093                 $res->free();
00094 
00095                 $rev = new Revision( $row );
00096 
00097                 $this->assertRevEquals( $orig, $rev );
00098         }
00099 
00103         public function testNewFromRow()
00104         {
00105                 $orig = $this->makeRevision();
00106 
00107                 $dbr = wfgetDB( DB_SLAVE );
00108                 $res = $dbr->select( 'revision', '*', array( 'rev_id' => $orig->getId() ) );
00109                 $this->assertTrue( is_object( $res ), 'query failed' );
00110 
00111                 $row = $res->fetchObject();
00112                 $res->free();
00113 
00114                 $rev = Revision::newFromRow( $row );
00115 
00116                 $this->assertRevEquals( $orig, $rev );
00117         }
00118 
00119 
00123         public function testNewFromArchiveRow()
00124         {
00125                 $page = $this->createPage( 'RevisionStorageTest_testNewFromArchiveRow', 'Lorem Ipsum' );
00126                 $orig = $page->getRevision();
00127                 $page->doDeleteArticle( 'test Revision::newFromArchiveRow' );
00128 
00129                 $dbr = wfgetDB( DB_SLAVE );
00130                 $res = $dbr->select( 'archive', '*', array( 'ar_rev_id' => $orig->getId() ) );
00131                 $this->assertTrue( is_object( $res ), 'query failed' );
00132 
00133                 $row = $res->fetchObject();
00134                 $res->free();
00135 
00136                 $rev = Revision::newFromArchiveRow( $row );
00137 
00138                 $this->assertRevEquals( $orig, $rev );
00139         }
00140 
00144         public function testNewFromId()
00145         {
00146                 $orig = $this->makeRevision();
00147 
00148                 $rev = Revision::newFromId( $orig->getId() );
00149 
00150                 $this->assertRevEquals( $orig, $rev );
00151         }
00152 
00156         public function testFetchRevision()
00157         {
00158                 $page = $this->createPage( 'RevisionStorageTest_testFetchRevision', 'one' );
00159                 $id1 = $page->getRevision()->getId();
00160 
00161                 $page->doEdit( 'two', 'second rev' );
00162                 $id2 = $page->getRevision()->getId();
00163 
00164                 $res = Revision::fetchRevision( $page->getTitle() );
00165 
00166                 #note: order is unspecified
00167                 $rows = array();
00168                 while ( ( $row = $res->fetchObject() ) ) {
00169                         $rows[ $row->rev_id ]= $row;
00170                 }
00171 
00172                 $row = $res->fetchObject();
00173                 $this->assertEquals( 1, count($rows), 'expected exactly one revision' );
00174                 $this->assertArrayHasKey( $id2, $rows, 'missing revision with id ' . $id2 );
00175         }
00176 
00180         public function testSelectFields()
00181         {
00182                 $fields = Revision::selectFields();
00183 
00184                 $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields');
00185                 $this->assertTrue( in_array( 'rev_page', $fields ), 'missing rev_page in list of fields');
00186                 $this->assertTrue( in_array( 'rev_timestamp', $fields ), 'missing rev_timestamp in list of fields');
00187                 $this->assertTrue( in_array( 'rev_user', $fields ), 'missing rev_user in list of fields');
00188         }
00189 
00193         public function testGetPage()
00194         {
00195                 $page = $this->the_page;
00196 
00197                 $orig = $this->makeRevision( array( 'page' => $page->getId() ) );
00198                 $rev = Revision::newFromId( $orig->getId() );
00199 
00200                 $this->assertEquals( $page->getId(), $rev->getPage() );
00201         }
00202 
00206         public function testGetText()
00207         {
00208                 $orig = $this->makeRevision( array( 'text' => 'hello hello.' ) );
00209                 $rev = Revision::newFromId( $orig->getId() );
00210 
00211                 $this->assertEquals( 'hello hello.', $rev->getText() );
00212         }
00213 
00217         public function testRevText()
00218         {
00219                 $this->hideDeprecated( 'Revision::revText' );
00220                 $orig = $this->makeRevision( array( 'text' => 'hello hello rev.' ) );
00221                 $rev = Revision::newFromId( $orig->getId() );
00222 
00223                 $this->assertEquals( 'hello hello rev.', $rev->revText() );
00224         }
00225 
00229         public function testGetRawText()
00230         {
00231                 $orig = $this->makeRevision( array( 'text' => 'hello hello raw.' ) );
00232                 $rev = Revision::newFromId( $orig->getId() );
00233 
00234                 $this->assertEquals( 'hello hello raw.', $rev->getRawText() );
00235         }
00239         public function testIsCurrent()
00240         {
00241                 $page = $this->createPage( 'RevisionStorageTest_testIsCurrent', 'Lorem Ipsum' );
00242                 $rev1 = $page->getRevision();
00243 
00244                 # @todo: find out if this should be true
00245                 # $this->assertTrue( $rev1->isCurrent() );
00246 
00247                 $rev1x = Revision::newFromId( $rev1->getId() );
00248                 $this->assertTrue( $rev1x->isCurrent() );
00249 
00250                 $page->doEdit( 'Bla bla', 'second rev' );
00251                 $rev2 = $page->getRevision();
00252 
00253                 # @todo: find out if this should be true
00254                 # $this->assertTrue( $rev2->isCurrent() );
00255 
00256                 $rev1x = Revision::newFromId( $rev1->getId() );
00257                 $this->assertFalse( $rev1x->isCurrent() );
00258 
00259                 $rev2x = Revision::newFromId( $rev2->getId() );
00260                 $this->assertTrue( $rev2x->isCurrent() );
00261         }
00262 
00266         public function testGetPrevious()
00267         {
00268                 $page = $this->createPage( 'RevisionStorageTest_testGetPrevious', 'Lorem Ipsum testGetPrevious' );
00269                 $rev1 = $page->getRevision();
00270 
00271                 $this->assertNull( $rev1->getPrevious() );
00272 
00273                 $page->doEdit( 'Bla bla', 'second rev testGetPrevious' );
00274                 $rev2 = $page->getRevision();
00275 
00276                 $this->assertNotNull( $rev2->getPrevious() );
00277                 $this->assertEquals( $rev1->getId(), $rev2->getPrevious()->getId() );
00278         }
00279 
00283         public function testGetNext()
00284         {
00285                 $page = $this->createPage( 'RevisionStorageTest_testGetNext', 'Lorem Ipsum testGetNext' );
00286                 $rev1 = $page->getRevision();
00287 
00288                 $this->assertNull( $rev1->getNext() );
00289 
00290                 $page->doEdit( 'Bla bla', 'second rev testGetNext' );
00291                 $rev2 = $page->getRevision();
00292 
00293                 $this->assertNotNull( $rev1->getNext() );
00294                 $this->assertEquals( $rev2->getId(), $rev1->getNext()->getId() );
00295         }
00296 
00300         public function testNewNullRevision()
00301         {
00302                 $page = $this->createPage( 'RevisionStorageTest_testNewNullRevision', 'some testing text' );
00303                 $orig = $page->getRevision();
00304 
00305                 $dbw = wfGetDB( DB_MASTER );
00306                 $rev = Revision::newNullRevision( $dbw, $page->getId(), 'a null revision', false );
00307 
00308                 $this->assertNotEquals( $orig->getId(), $rev->getId(), 'new null revision shold have a different id from the original revision' );
00309                 $this->assertEquals( $orig->getTextId(), $rev->getTextId(), 'new null revision shold have the same text id as the original revision' );
00310                 $this->assertEquals( 'some testing text', $rev->getText() );
00311         }
00312 
00313         public function dataUserWasLastToEdit() {
00314                 return array(
00315                         array( #0
00316                                 3, true, # actually the last edit
00317                         ),
00318                         array( #1
00319                                 2, true, # not the current edit, but still by this user
00320                         ),
00321                         array( #2
00322                                 1, false, # edit by another user
00323                         ),
00324                         array( #3
00325                                 0, false, # first edit, by this user, but another user edited in the mean time
00326                         ),
00327                 );
00328         }
00329 
00333         public function testUserWasLastToEdit( $sinceIdx, $expectedLast ) {
00334                 $userA = \User::newFromName( "RevisionStorageTest_userA" );
00335                 $userB = \User::newFromName( "RevisionStorageTest_userB" );
00336 
00337                 if ( $userA->getId() === 0 ) {
00338                         $userA = \User::createNew( $userA->getName() );
00339                 }
00340 
00341                 if ( $userB->getId() === 0 ) {
00342                         $userB = \User::createNew( $userB->getName() );
00343                 }
00344 
00345                 $dbw = wfGetDB( DB_MASTER );
00346                 $revisions = array();
00347 
00348                 // create revisions -----------------------------
00349                 $page = WikiPage::factory( Title::newFromText( 'RevisionStorageTest_testUserWasLastToEdit' ) );
00350 
00351                 # zero
00352                 $revisions[0] = new Revision( array(
00353                         'page' => $page->getId(),
00354                         'timestamp' => '20120101000000',
00355                         'user' => $userA->getId(),
00356                         'text' => 'zero',
00357                         'summary' => 'edit zero'
00358                 ) );
00359                 $revisions[0]->insertOn( $dbw );
00360 
00361                 # one
00362                 $revisions[1] = new Revision( array(
00363                         'page' => $page->getId(),
00364                         'timestamp' => '20120101000100',
00365                         'user' => $userA->getId(),
00366                         'text' => 'one',
00367                         'summary' => 'edit one'
00368                 ) );
00369                 $revisions[1]->insertOn( $dbw );
00370 
00371                 # two
00372                 $revisions[2] = new Revision( array(
00373                         'page' => $page->getId(),
00374                         'timestamp' => '20120101000200',
00375                         'user' => $userB->getId(),
00376                         'text' => 'two',
00377                         'summary' => 'edit two'
00378                 ) );
00379                 $revisions[2]->insertOn( $dbw );
00380 
00381                 # three
00382                 $revisions[3] = new Revision( array(
00383                         'page' => $page->getId(),
00384                         'timestamp' => '20120101000300',
00385                         'user' => $userA->getId(),
00386                         'text' => 'three',
00387                         'summary' => 'edit three'
00388                 ) );
00389                 $revisions[3]->insertOn( $dbw );
00390 
00391                 # four
00392                 $revisions[4] = new Revision( array(
00393                         'page' => $page->getId(),
00394                         'timestamp' => '20120101000200',
00395                         'user' => $userA->getId(),
00396                         'text' => 'zero',
00397                         'summary' => 'edit four'
00398                 ) );
00399                 $revisions[4]->insertOn( $dbw );
00400 
00401                 // test it ---------------------------------
00402                 $since = $revisions[ $sinceIdx ]->getTimestamp();
00403 
00404                 $wasLast = Revision::userWasLastToEdit( $dbw, $page->getId(), $userA->getId(), $since );
00405 
00406                 $this->assertEquals( $expectedLast, $wasLast );
00407         }
00408 }