MediaWiki
REL1_20
|
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 }