MediaWiki
REL1_24
|
00001 <?php 00002 00009 class WikiPageTest extends MediaWikiLangTestCase { 00010 00011 protected $pages_to_delete; 00012 00013 function __construct( $name = null, array $data = array(), $dataName = '' ) { 00014 parent::__construct( $name, $data, $dataName ); 00015 00016 $this->tablesUsed = array_merge( 00017 $this->tablesUsed, 00018 array( 'page', 00019 'revision', 00020 'text', 00021 00022 'recentchanges', 00023 'logging', 00024 00025 'page_props', 00026 'pagelinks', 00027 'categorylinks', 00028 'langlinks', 00029 'externallinks', 00030 'imagelinks', 00031 'templatelinks', 00032 'iwlinks' ) ); 00033 } 00034 00035 protected function setUp() { 00036 parent::setUp(); 00037 $this->pages_to_delete = array(); 00038 00039 LinkCache::singleton()->clear(); # avoid cached redirect status, etc 00040 } 00041 00042 protected function tearDown() { 00043 foreach ( $this->pages_to_delete as $p ) { 00044 /* @var $p WikiPage */ 00045 00046 try { 00047 if ( $p->exists() ) { 00048 $p->doDeleteArticle( "testing done." ); 00049 } 00050 } catch ( MWException $ex ) { 00051 // fail silently 00052 } 00053 } 00054 parent::tearDown(); 00055 } 00056 00062 protected function newPage( $title, $model = null ) { 00063 if ( is_string( $title ) ) { 00064 $ns = $this->getDefaultWikitextNS(); 00065 $title = Title::newFromText( $title, $ns ); 00066 } 00067 00068 $p = new WikiPage( $title ); 00069 00070 $this->pages_to_delete[] = $p; 00071 00072 return $p; 00073 } 00074 00082 protected function createPage( $page, $text, $model = null ) { 00083 if ( is_string( $page ) || $page instanceof Title ) { 00084 $page = $this->newPage( $page, $model ); 00085 } 00086 00087 $content = ContentHandler::makeContent( $text, $page->getTitle(), $model ); 00088 $page->doEditContent( $content, "testing", EDIT_NEW ); 00089 00090 return $page; 00091 } 00092 00096 public function testDoEditContent() { 00097 $page = $this->newPage( "WikiPageTest_testDoEditContent" ); 00098 $title = $page->getTitle(); 00099 00100 $content = ContentHandler::makeContent( 00101 "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam " 00102 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.", 00103 $title, 00104 CONTENT_MODEL_WIKITEXT 00105 ); 00106 00107 $page->doEditContent( $content, "[[testing]] 1" ); 00108 00109 $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" ); 00110 $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" ); 00111 $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" ); 00112 $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" ); 00113 00114 $id = $page->getId(); 00115 00116 # ------------------------ 00117 $dbr = wfGetDB( DB_SLAVE ); 00118 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) ); 00119 $n = $res->numRows(); 00120 $res->free(); 00121 00122 $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' ); 00123 00124 # ------------------------ 00125 $page = new WikiPage( $title ); 00126 00127 $retrieved = $page->getContent(); 00128 $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' ); 00129 00130 # ------------------------ 00131 $content = ContentHandler::makeContent( 00132 "At vero eos et accusam et justo duo [[dolores]] et ea rebum. " 00133 . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.", 00134 $title, 00135 CONTENT_MODEL_WIKITEXT 00136 ); 00137 00138 $page->doEditContent( $content, "testing 2" ); 00139 00140 # ------------------------ 00141 $page = new WikiPage( $title ); 00142 00143 $retrieved = $page->getContent(); 00144 $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' ); 00145 00146 # ------------------------ 00147 $dbr = wfGetDB( DB_SLAVE ); 00148 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) ); 00149 $n = $res->numRows(); 00150 $res->free(); 00151 00152 $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' ); 00153 } 00154 00158 public function testDoEdit() { 00159 $this->hideDeprecated( "WikiPage::doEdit" ); 00160 $this->hideDeprecated( "WikiPage::getText" ); 00161 $this->hideDeprecated( "Revision::getText" ); 00162 00163 //NOTE: assume help namespace will default to wikitext 00164 $title = Title::newFromText( "Help:WikiPageTest_testDoEdit" ); 00165 00166 $page = $this->newPage( $title ); 00167 00168 $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam " 00169 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat."; 00170 00171 $page->doEdit( $text, "[[testing]] 1" ); 00172 00173 $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" ); 00174 $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" ); 00175 $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" ); 00176 $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" ); 00177 00178 $id = $page->getId(); 00179 00180 # ------------------------ 00181 $dbr = wfGetDB( DB_SLAVE ); 00182 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) ); 00183 $n = $res->numRows(); 00184 $res->free(); 00185 00186 $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' ); 00187 00188 # ------------------------ 00189 $page = new WikiPage( $title ); 00190 00191 $retrieved = $page->getText(); 00192 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' ); 00193 00194 # ------------------------ 00195 $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. " 00196 . "Stet clita kasd [[gubergren]], no sea takimata sanctus est."; 00197 00198 $page->doEdit( $text, "testing 2" ); 00199 00200 # ------------------------ 00201 $page = new WikiPage( $title ); 00202 00203 $retrieved = $page->getText(); 00204 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' ); 00205 00206 # ------------------------ 00207 $dbr = wfGetDB( DB_SLAVE ); 00208 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) ); 00209 $n = $res->numRows(); 00210 $res->free(); 00211 00212 $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' ); 00213 } 00214 00218 public function testDoQuickEdit() { 00219 global $wgUser; 00220 00221 $this->hideDeprecated( "WikiPage::doQuickEdit" ); 00222 00223 //NOTE: assume help namespace will default to wikitext 00224 $page = $this->createPage( "Help:WikiPageTest_testDoQuickEdit", "original text" ); 00225 00226 $text = "quick text"; 00227 $page->doQuickEdit( $text, $wgUser, "testing q" ); 00228 00229 # --------------------- 00230 $page = new WikiPage( $page->getTitle() ); 00231 $this->assertEquals( $text, $page->getText() ); 00232 } 00233 00237 public function testDoQuickEditContent() { 00238 global $wgUser; 00239 00240 $page = $this->createPage( 00241 "WikiPageTest_testDoQuickEditContent", 00242 "original text", 00243 CONTENT_MODEL_WIKITEXT 00244 ); 00245 00246 $content = ContentHandler::makeContent( 00247 "quick text", 00248 $page->getTitle(), 00249 CONTENT_MODEL_WIKITEXT 00250 ); 00251 $page->doQuickEditContent( $content, $wgUser, "testing q" ); 00252 00253 # --------------------- 00254 $page = new WikiPage( $page->getTitle() ); 00255 $this->assertTrue( $content->equals( $page->getContent() ) ); 00256 } 00257 00261 public function testDoDeleteArticle() { 00262 $page = $this->createPage( 00263 "WikiPageTest_testDoDeleteArticle", 00264 "[[original text]] foo", 00265 CONTENT_MODEL_WIKITEXT 00266 ); 00267 $id = $page->getId(); 00268 00269 $page->doDeleteArticle( "testing deletion" ); 00270 00271 $this->assertFalse( 00272 $page->getTitle()->getArticleID() > 0, 00273 "Title object should now have page id 0" 00274 ); 00275 $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" ); 00276 $this->assertFalse( 00277 $page->exists(), 00278 "WikiPage::exists should return false after page was deleted" 00279 ); 00280 $this->assertNull( 00281 $page->getContent(), 00282 "WikiPage::getContent should return null after page was deleted" 00283 ); 00284 $this->assertFalse( 00285 $page->getText(), 00286 "WikiPage::getText should return false after page was deleted" 00287 ); 00288 00289 $t = Title::newFromText( $page->getTitle()->getPrefixedText() ); 00290 $this->assertFalse( 00291 $t->exists(), 00292 "Title::exists should return false after page was deleted" 00293 ); 00294 00295 # ------------------------ 00296 $dbr = wfGetDB( DB_SLAVE ); 00297 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) ); 00298 $n = $res->numRows(); 00299 $res->free(); 00300 00301 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' ); 00302 } 00303 00307 public function testDoDeleteUpdates() { 00308 $page = $this->createPage( 00309 "WikiPageTest_testDoDeleteArticle", 00310 "[[original text]] foo", 00311 CONTENT_MODEL_WIKITEXT 00312 ); 00313 $id = $page->getId(); 00314 00315 $page->doDeleteUpdates( $id ); 00316 00317 # ------------------------ 00318 $dbr = wfGetDB( DB_SLAVE ); 00319 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) ); 00320 $n = $res->numRows(); 00321 $res->free(); 00322 00323 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' ); 00324 } 00325 00329 public function testGetRevision() { 00330 $page = $this->newPage( "WikiPageTest_testGetRevision" ); 00331 00332 $rev = $page->getRevision(); 00333 $this->assertNull( $rev ); 00334 00335 # ----------------- 00336 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT ); 00337 00338 $rev = $page->getRevision(); 00339 00340 $this->assertEquals( $page->getLatest(), $rev->getId() ); 00341 $this->assertEquals( "some text", $rev->getContent()->getNativeData() ); 00342 } 00343 00347 public function testGetContent() { 00348 $page = $this->newPage( "WikiPageTest_testGetContent" ); 00349 00350 $content = $page->getContent(); 00351 $this->assertNull( $content ); 00352 00353 # ----------------- 00354 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT ); 00355 00356 $content = $page->getContent(); 00357 $this->assertEquals( "some text", $content->getNativeData() ); 00358 } 00359 00363 public function testGetText() { 00364 $this->hideDeprecated( "WikiPage::getText" ); 00365 00366 $page = $this->newPage( "WikiPageTest_testGetText" ); 00367 00368 $text = $page->getText(); 00369 $this->assertFalse( $text ); 00370 00371 # ----------------- 00372 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT ); 00373 00374 $text = $page->getText(); 00375 $this->assertEquals( "some text", $text ); 00376 } 00377 00381 public function testGetRawText() { 00382 $this->hideDeprecated( "WikiPage::getRawText" ); 00383 00384 $page = $this->newPage( "WikiPageTest_testGetRawText" ); 00385 00386 $text = $page->getRawText(); 00387 $this->assertFalse( $text ); 00388 00389 # ----------------- 00390 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT ); 00391 00392 $text = $page->getRawText(); 00393 $this->assertEquals( "some text", $text ); 00394 } 00395 00399 public function testGetContentModel() { 00400 global $wgContentHandlerUseDB; 00401 00402 if ( !$wgContentHandlerUseDB ) { 00403 $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' ); 00404 } 00405 00406 $page = $this->createPage( 00407 "WikiPageTest_testGetContentModel", 00408 "some text", 00409 CONTENT_MODEL_JAVASCRIPT 00410 ); 00411 00412 $page = new WikiPage( $page->getTitle() ); 00413 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() ); 00414 } 00415 00419 public function testGetContentHandler() { 00420 global $wgContentHandlerUseDB; 00421 00422 if ( !$wgContentHandlerUseDB ) { 00423 $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' ); 00424 } 00425 00426 $page = $this->createPage( 00427 "WikiPageTest_testGetContentHandler", 00428 "some text", 00429 CONTENT_MODEL_JAVASCRIPT 00430 ); 00431 00432 $page = new WikiPage( $page->getTitle() ); 00433 $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) ); 00434 } 00435 00439 public function testExists() { 00440 $page = $this->newPage( "WikiPageTest_testExists" ); 00441 $this->assertFalse( $page->exists() ); 00442 00443 # ----------------- 00444 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT ); 00445 $this->assertTrue( $page->exists() ); 00446 00447 $page = new WikiPage( $page->getTitle() ); 00448 $this->assertTrue( $page->exists() ); 00449 00450 # ----------------- 00451 $page->doDeleteArticle( "done testing" ); 00452 $this->assertFalse( $page->exists() ); 00453 00454 $page = new WikiPage( $page->getTitle() ); 00455 $this->assertFalse( $page->exists() ); 00456 } 00457 00458 public static function provideHasViewableContent() { 00459 return array( 00460 array( 'WikiPageTest_testHasViewableContent', false, true ), 00461 array( 'Special:WikiPageTest_testHasViewableContent', false ), 00462 array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ), 00463 array( 'Special:Userlogin', true ), 00464 array( 'MediaWiki:help', true ), 00465 ); 00466 } 00467 00472 public function testHasViewableContent( $title, $viewable, $create = false ) { 00473 $page = $this->newPage( $title ); 00474 $this->assertEquals( $viewable, $page->hasViewableContent() ); 00475 00476 if ( $create ) { 00477 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT ); 00478 $this->assertTrue( $page->hasViewableContent() ); 00479 00480 $page = new WikiPage( $page->getTitle() ); 00481 $this->assertTrue( $page->hasViewableContent() ); 00482 } 00483 } 00484 00485 public static function provideGetRedirectTarget() { 00486 return array( 00487 array( 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT, "hello world", null ), 00488 array( 00489 'WikiPageTest_testGetRedirectTarget_2', 00490 CONTENT_MODEL_WIKITEXT, 00491 "#REDIRECT [[hello world]]", 00492 "Hello world" 00493 ), 00494 ); 00495 } 00496 00501 public function testGetRedirectTarget( $title, $model, $text, $target ) { 00502 $this->setMwGlobals( array( 00503 'wgCapitalLinks' => true, 00504 ) ); 00505 00506 $page = $this->createPage( $title, $text, $model ); 00507 00508 # sanity check, because this test seems to fail for no reason for some people. 00509 $c = $page->getContent(); 00510 $this->assertEquals( 'WikitextContent', get_class( $c ) ); 00511 00512 # now, test the actual redirect 00513 $t = $page->getRedirectTarget(); 00514 $this->assertEquals( $target, is_null( $t ) ? null : $t->getPrefixedText() ); 00515 } 00516 00521 public function testIsRedirect( $title, $model, $text, $target ) { 00522 $page = $this->createPage( $title, $text, $model ); 00523 $this->assertEquals( !is_null( $target ), $page->isRedirect() ); 00524 } 00525 00526 public static function provideIsCountable() { 00527 return array( 00528 00529 // any 00530 array( 'WikiPageTest_testIsCountable', 00531 CONTENT_MODEL_WIKITEXT, 00532 '', 00533 'any', 00534 true 00535 ), 00536 array( 'WikiPageTest_testIsCountable', 00537 CONTENT_MODEL_WIKITEXT, 00538 'Foo', 00539 'any', 00540 true 00541 ), 00542 00543 // comma 00544 array( 'WikiPageTest_testIsCountable', 00545 CONTENT_MODEL_WIKITEXT, 00546 'Foo', 00547 'comma', 00548 false 00549 ), 00550 array( 'WikiPageTest_testIsCountable', 00551 CONTENT_MODEL_WIKITEXT, 00552 'Foo, bar', 00553 'comma', 00554 true 00555 ), 00556 00557 // link 00558 array( 'WikiPageTest_testIsCountable', 00559 CONTENT_MODEL_WIKITEXT, 00560 'Foo', 00561 'link', 00562 false 00563 ), 00564 array( 'WikiPageTest_testIsCountable', 00565 CONTENT_MODEL_WIKITEXT, 00566 'Foo [[bar]]', 00567 'link', 00568 true 00569 ), 00570 00571 // redirects 00572 array( 'WikiPageTest_testIsCountable', 00573 CONTENT_MODEL_WIKITEXT, 00574 '#REDIRECT [[bar]]', 00575 'any', 00576 false 00577 ), 00578 array( 'WikiPageTest_testIsCountable', 00579 CONTENT_MODEL_WIKITEXT, 00580 '#REDIRECT [[bar]]', 00581 'comma', 00582 false 00583 ), 00584 array( 'WikiPageTest_testIsCountable', 00585 CONTENT_MODEL_WIKITEXT, 00586 '#REDIRECT [[bar]]', 00587 'link', 00588 false 00589 ), 00590 00591 // not a content namespace 00592 array( 'Talk:WikiPageTest_testIsCountable', 00593 CONTENT_MODEL_WIKITEXT, 00594 'Foo', 00595 'any', 00596 false 00597 ), 00598 array( 'Talk:WikiPageTest_testIsCountable', 00599 CONTENT_MODEL_WIKITEXT, 00600 'Foo, bar', 00601 'comma', 00602 false 00603 ), 00604 array( 'Talk:WikiPageTest_testIsCountable', 00605 CONTENT_MODEL_WIKITEXT, 00606 'Foo [[bar]]', 00607 'link', 00608 false 00609 ), 00610 00611 // not a content namespace, different model 00612 array( 'MediaWiki:WikiPageTest_testIsCountable.js', 00613 null, 00614 'Foo', 00615 'any', 00616 false 00617 ), 00618 array( 'MediaWiki:WikiPageTest_testIsCountable.js', 00619 null, 00620 'Foo, bar', 00621 'comma', 00622 false 00623 ), 00624 array( 'MediaWiki:WikiPageTest_testIsCountable.js', 00625 null, 00626 'Foo [[bar]]', 00627 'link', 00628 false 00629 ), 00630 ); 00631 } 00632 00637 public function testIsCountable( $title, $model, $text, $mode, $expected ) { 00638 global $wgContentHandlerUseDB; 00639 00640 $this->setMwGlobals( 'wgArticleCountMethod', $mode ); 00641 00642 $title = Title::newFromText( $title ); 00643 00644 if ( !$wgContentHandlerUseDB 00645 && $model 00646 && ContentHandler::getDefaultModelFor( $title ) != $model 00647 ) { 00648 $this->markTestSkipped( "Can not use non-default content model $model for " 00649 . $title->getPrefixedDBkey() . " with \$wgContentHandlerUseDB disabled." ); 00650 } 00651 00652 $page = $this->createPage( $title, $text, $model ); 00653 00654 $editInfo = $page->prepareContentForEdit( $page->getContent() ); 00655 00656 $v = $page->isCountable(); 00657 $w = $page->isCountable( $editInfo ); 00658 00659 $this->assertEquals( 00660 $expected, 00661 $v, 00662 "isCountable( null ) returned unexpected value " . var_export( $v, true ) 00663 . " instead of " . var_export( $expected, true ) 00664 . " in mode `$mode` for text \"$text\"" 00665 ); 00666 00667 $this->assertEquals( 00668 $expected, 00669 $w, 00670 "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true ) 00671 . " instead of " . var_export( $expected, true ) 00672 . " in mode `$mode` for text \"$text\"" 00673 ); 00674 } 00675 00676 public static function provideGetParserOutput() { 00677 return array( 00678 array( CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "<p>hello <i>world</i></p>" ), 00679 // @todo more...? 00680 ); 00681 } 00682 00687 public function testGetParserOutput( $model, $text, $expectedHtml ) { 00688 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model ); 00689 00690 $opt = $page->makeParserOptions( 'canonical' ); 00691 $po = $page->getParserOutput( $opt ); 00692 $text = $po->getText(); 00693 00694 $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments 00695 $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us 00696 00697 $this->assertEquals( $expectedHtml, $text ); 00698 00699 return $po; 00700 } 00701 00705 public function testGetParserOutput_nonexisting() { 00706 static $count = 0; 00707 $count++; 00708 00709 $page = new WikiPage( new Title( "WikiPageTest_testGetParserOutput_nonexisting_$count" ) ); 00710 00711 $opt = new ParserOptions(); 00712 $po = $page->getParserOutput( $opt ); 00713 00714 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." ); 00715 } 00716 00720 public function testGetParserOutput_badrev() { 00721 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT ); 00722 00723 $opt = new ParserOptions(); 00724 $po = $page->getParserOutput( $opt, $page->getLatest() + 1234 ); 00725 00726 // @todo would be neat to also test deleted revision 00727 00728 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." ); 00729 } 00730 00731 public static $sections = 00732 00733 "Intro 00734 00735 == stuff == 00736 hello world 00737 00738 == test == 00739 just a test 00740 00741 == foo == 00742 more stuff 00743 "; 00744 00745 public function dataReplaceSection() { 00746 //NOTE: assume the Help namespace to contain wikitext 00747 return array( 00748 array( 'Help:WikiPageTest_testReplaceSection', 00749 CONTENT_MODEL_WIKITEXT, 00750 WikiPageTest::$sections, 00751 "0", 00752 "No more", 00753 null, 00754 trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest::$sections ) ) 00755 ), 00756 array( 'Help:WikiPageTest_testReplaceSection', 00757 CONTENT_MODEL_WIKITEXT, 00758 WikiPageTest::$sections, 00759 "", 00760 "No more", 00761 null, 00762 "No more" 00763 ), 00764 array( 'Help:WikiPageTest_testReplaceSection', 00765 CONTENT_MODEL_WIKITEXT, 00766 WikiPageTest::$sections, 00767 "2", 00768 "== TEST ==\nmore fun", 00769 null, 00770 trim( preg_replace( '/^== test ==.*== foo ==/sm', 00771 "== TEST ==\nmore fun\n\n== foo ==", 00772 WikiPageTest::$sections ) ) 00773 ), 00774 array( 'Help:WikiPageTest_testReplaceSection', 00775 CONTENT_MODEL_WIKITEXT, 00776 WikiPageTest::$sections, 00777 "8", 00778 "No more", 00779 null, 00780 trim( WikiPageTest::$sections ) 00781 ), 00782 array( 'Help:WikiPageTest_testReplaceSection', 00783 CONTENT_MODEL_WIKITEXT, 00784 WikiPageTest::$sections, 00785 "new", 00786 "No more", 00787 "New", 00788 trim( WikiPageTest::$sections ) . "\n\n== New ==\n\nNo more" 00789 ), 00790 ); 00791 } 00792 00797 public function testReplaceSection( $title, $model, $text, $section, $with, 00798 $sectionTitle, $expected 00799 ) { 00800 $this->hideDeprecated( "WikiPage::replaceSection" ); 00801 00802 $page = $this->createPage( $title, $text, $model ); 00803 $text = $page->replaceSection( $section, $with, $sectionTitle ); 00804 $text = trim( $text ); 00805 00806 $this->assertEquals( $expected, $text ); 00807 } 00808 00813 public function testReplaceSectionContent( $title, $model, $text, $section, 00814 $with, $sectionTitle, $expected 00815 ) { 00816 $page = $this->createPage( $title, $text, $model ); 00817 00818 $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() ); 00819 $c = $page->replaceSectionContent( $section, $content, $sectionTitle ); 00820 00821 $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) ); 00822 } 00823 00828 public function testReplaceSectionAtRev( $title, $model, $text, $section, 00829 $with, $sectionTitle, $expected 00830 ) { 00831 $page = $this->createPage( $title, $text, $model ); 00832 $baseRevId = $page->getLatest(); 00833 00834 $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() ); 00835 $c = $page->replaceSectionAtRev( $section, $content, $sectionTitle, $baseRevId ); 00836 00837 $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) ); 00838 } 00839 00840 /* @todo FIXME: fix this! 00841 public function testGetUndoText() { 00842 $this->checkHasDiff3(); 00843 00844 $text = "one"; 00845 $page = $this->createPage( "WikiPageTest_testGetUndoText", $text ); 00846 $rev1 = $page->getRevision(); 00847 00848 $text .= "\n\ntwo"; 00849 $page->doEditContent( 00850 ContentHandler::makeContent( $text, $page->getTitle() ), 00851 "adding section two" 00852 ); 00853 $rev2 = $page->getRevision(); 00854 00855 $text .= "\n\nthree"; 00856 $page->doEditContent( 00857 ContentHandler::makeContent( $text, $page->getTitle() ), 00858 "adding section three" 00859 ); 00860 $rev3 = $page->getRevision(); 00861 00862 $text .= "\n\nfour"; 00863 $page->doEditContent( 00864 ContentHandler::makeContent( $text, $page->getTitle() ), 00865 "adding section four" 00866 ); 00867 $rev4 = $page->getRevision(); 00868 00869 $text .= "\n\nfive"; 00870 $page->doEditContent( 00871 ContentHandler::makeContent( $text, $page->getTitle() ), 00872 "adding section five" 00873 ); 00874 $rev5 = $page->getRevision(); 00875 00876 $text .= "\n\nsix"; 00877 $page->doEditContent( 00878 ContentHandler::makeContent( $text, $page->getTitle() ), 00879 "adding section six" 00880 ); 00881 $rev6 = $page->getRevision(); 00882 00883 $undo6 = $page->getUndoText( $rev6 ); 00884 if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" ); 00885 $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 ); 00886 00887 $undo3 = $page->getUndoText( $rev4, $rev2 ); 00888 if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" ); 00889 $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 ); 00890 00891 $undo2 = $page->getUndoText( $rev2 ); 00892 if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" ); 00893 $this->assertEquals( "one\n\nfive", $undo2 ); 00894 } 00895 */ 00896 00901 public function broken_testDoRollback() { 00902 $admin = new User(); 00903 $admin->setName( "Admin" ); 00904 00905 $text = "one"; 00906 $page = $this->newPage( "WikiPageTest_testDoRollback" ); 00907 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), 00908 "section one", EDIT_NEW, false, $admin ); 00909 00910 $user1 = new User(); 00911 $user1->setName( "127.0.1.11" ); 00912 $text .= "\n\ntwo"; 00913 $page = new WikiPage( $page->getTitle() ); 00914 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), 00915 "adding section two", 0, false, $user1 ); 00916 00917 $user2 = new User(); 00918 $user2->setName( "127.0.2.13" ); 00919 $text .= "\n\nthree"; 00920 $page = new WikiPage( $page->getTitle() ); 00921 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), 00922 "adding section three", 0, false, $user2 ); 00923 00924 # we are having issues with doRollback spuriously failing. Apparently 00925 # the last revision somehow goes missing or not committed under some 00926 # circumstances. So, make sure the last revision has the right user name. 00927 $dbr = wfGetDB( DB_SLAVE ); 00928 $this->assertEquals( 3, Revision::countByPageId( $dbr, $page->getId() ) ); 00929 00930 $page = new WikiPage( $page->getTitle() ); 00931 $rev3 = $page->getRevision(); 00932 $this->assertEquals( '127.0.2.13', $rev3->getUserText() ); 00933 00934 $rev2 = $rev3->getPrevious(); 00935 $this->assertEquals( '127.0.1.11', $rev2->getUserText() ); 00936 00937 $rev1 = $rev2->getPrevious(); 00938 $this->assertEquals( 'Admin', $rev1->getUserText() ); 00939 00940 # now, try the actual rollback 00941 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop... 00942 $token = $admin->getEditToken( 00943 array( $page->getTitle()->getPrefixedText(), $user2->getName() ), 00944 null 00945 ); 00946 $errors = $page->doRollback( 00947 $user2->getName(), 00948 "testing revert", 00949 $token, 00950 false, 00951 $details, 00952 $admin 00953 ); 00954 00955 if ( $errors ) { 00956 $this->fail( "Rollback failed:\n" . print_r( $errors, true ) 00957 . ";\n" . print_r( $details, true ) ); 00958 } 00959 00960 $page = new WikiPage( $page->getTitle() ); 00961 $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(), 00962 "rollback did not revert to the correct revision" ); 00963 $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() ); 00964 } 00965 00970 public function testDoRollback() { 00971 $admin = new User(); 00972 $admin->setName( "Admin" ); 00973 00974 $text = "one"; 00975 $page = $this->newPage( "WikiPageTest_testDoRollback" ); 00976 $page->doEditContent( 00977 ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 00978 "section one", 00979 EDIT_NEW, 00980 false, 00981 $admin 00982 ); 00983 $rev1 = $page->getRevision(); 00984 00985 $user1 = new User(); 00986 $user1->setName( "127.0.1.11" ); 00987 $text .= "\n\ntwo"; 00988 $page = new WikiPage( $page->getTitle() ); 00989 $page->doEditContent( 00990 ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 00991 "adding section two", 00992 0, 00993 false, 00994 $user1 00995 ); 00996 00997 # now, try the rollback 00998 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop... 00999 $token = $admin->getEditToken( 01000 array( $page->getTitle()->getPrefixedText(), $user1->getName() ), 01001 null 01002 ); 01003 $errors = $page->doRollback( 01004 $user1->getName(), 01005 "testing revert", 01006 $token, 01007 false, 01008 $details, 01009 $admin 01010 ); 01011 01012 if ( $errors ) { 01013 $this->fail( "Rollback failed:\n" . print_r( $errors, true ) 01014 . ";\n" . print_r( $details, true ) ); 01015 } 01016 01017 $page = new WikiPage( $page->getTitle() ); 01018 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(), 01019 "rollback did not revert to the correct revision" ); 01020 $this->assertEquals( "one", $page->getContent()->getNativeData() ); 01021 } 01022 01026 public function testDoRollbackFailureSameContent() { 01027 $admin = new User(); 01028 $admin->setName( "Admin" ); 01029 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop... 01030 01031 $text = "one"; 01032 $page = $this->newPage( "WikiPageTest_testDoRollback" ); 01033 $page->doEditContent( 01034 ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 01035 "section one", 01036 EDIT_NEW, 01037 false, 01038 $admin 01039 ); 01040 $rev1 = $page->getRevision(); 01041 01042 $user1 = new User(); 01043 $user1->setName( "127.0.1.11" ); 01044 $user1->addGroup( "sysop" ); #XXX: make the test user a sysop... 01045 $text .= "\n\ntwo"; 01046 $page = new WikiPage( $page->getTitle() ); 01047 $page->doEditContent( 01048 ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 01049 "adding section two", 01050 0, 01051 false, 01052 $user1 01053 ); 01054 01055 # now, do a the rollback from the same user was doing the edit before 01056 $resultDetails = array(); 01057 $token = $user1->getEditToken( 01058 array( $page->getTitle()->getPrefixedText(), $user1->getName() ), 01059 null 01060 ); 01061 $errors = $page->doRollback( 01062 $user1->getName(), 01063 "testing revert same user", 01064 $token, 01065 false, 01066 $resultDetails, 01067 $admin 01068 ); 01069 01070 $this->assertEquals( array(), $errors, "Rollback failed same user" ); 01071 01072 # now, try the rollback 01073 $resultDetails = array(); 01074 $token = $admin->getEditToken( 01075 array( $page->getTitle()->getPrefixedText(), $user1->getName() ), 01076 null 01077 ); 01078 $errors = $page->doRollback( 01079 $user1->getName(), 01080 "testing revert", 01081 $token, 01082 false, 01083 $resultDetails, 01084 $admin 01085 ); 01086 01087 $this->assertEquals( array( array( 'alreadyrolled', 'WikiPageTest testDoRollback', 01088 '127.0.1.11', 'Admin' ) ), $errors, "Rollback not failed" ); 01089 01090 $page = new WikiPage( $page->getTitle() ); 01091 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(), 01092 "rollback did not revert to the correct revision" ); 01093 $this->assertEquals( "one", $page->getContent()->getNativeData() ); 01094 } 01095 01096 public static function provideGetAutosummary() { 01097 return array( 01098 array( 01099 'Hello there, world!', 01100 '#REDIRECT [[Foo]]', 01101 0, 01102 '/^Redirected page .*Foo/' 01103 ), 01104 01105 array( 01106 null, 01107 'Hello world!', 01108 EDIT_NEW, 01109 '/^Created page .*Hello/' 01110 ), 01111 01112 array( 01113 'Hello there, world!', 01114 '', 01115 0, 01116 '/^Blanked/' 01117 ), 01118 01119 array( 01120 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy 01121 eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam 01122 voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet 01123 clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.', 01124 'Hello world!', 01125 0, 01126 '/^Replaced .*Hello/' 01127 ), 01128 01129 array( 01130 'foo', 01131 'bar', 01132 0, 01133 '/^$/' 01134 ), 01135 ); 01136 } 01137 01142 public function testGetAutosummary( $old, $new, $flags, $expected ) { 01143 $this->hideDeprecated( "WikiPage::getAutosummary" ); 01144 01145 $page = $this->newPage( "WikiPageTest_testGetAutosummary" ); 01146 01147 $summary = $page->getAutosummary( $old, $new, $flags ); 01148 01149 $this->assertTrue( (bool)preg_match( $expected, $summary ), 01150 "Autosummary didn't match expected pattern $expected: $summary" ); 01151 } 01152 01153 public static function provideGetAutoDeleteReason() { 01154 return array( 01155 array( 01156 array(), 01157 false, 01158 false 01159 ), 01160 01161 array( 01162 array( 01163 array( "first edit", null ), 01164 ), 01165 "/first edit.*only contributor/", 01166 false 01167 ), 01168 01169 array( 01170 array( 01171 array( "first edit", null ), 01172 array( "second edit", null ), 01173 ), 01174 "/second edit.*only contributor/", 01175 true 01176 ), 01177 01178 array( 01179 array( 01180 array( "first edit", "127.0.2.22" ), 01181 array( "second edit", "127.0.3.33" ), 01182 ), 01183 "/second edit/", 01184 true 01185 ), 01186 01187 array( 01188 array( 01189 array( 01190 "first edit: " 01191 . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam " 01192 . " nonumy eirmod tempor invidunt ut labore et dolore magna " 01193 . "aliquyam erat, sed diam voluptua. At vero eos et accusam " 01194 . "et justo duo dolores et ea rebum. Stet clita kasd gubergren, " 01195 . "no sea takimata sanctus est Lorem ipsum dolor sit amet.'", 01196 null 01197 ), 01198 ), 01199 '/first edit:.*\.\.\."/', 01200 false 01201 ), 01202 01203 array( 01204 array( 01205 array( "first edit", "127.0.2.22" ), 01206 array( "", "127.0.3.33" ), 01207 ), 01208 "/before blanking.*first edit/", 01209 true 01210 ), 01211 01212 ); 01213 } 01214 01219 public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) { 01220 global $wgUser; 01221 01222 //NOTE: assume Help namespace to contain wikitext 01223 $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" ); 01224 01225 $c = 1; 01226 01227 foreach ( $edits as $edit ) { 01228 $user = new User(); 01229 01230 if ( !empty( $edit[1] ) ) { 01231 $user->setName( $edit[1] ); 01232 } else { 01233 $user = $wgUser; 01234 } 01235 01236 $content = ContentHandler::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() ); 01237 01238 $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user ); 01239 01240 $c += 1; 01241 } 01242 01243 $reason = $page->getAutoDeleteReason( $hasHistory ); 01244 01245 if ( is_bool( $expectedResult ) || is_null( $expectedResult ) ) { 01246 $this->assertEquals( $expectedResult, $reason ); 01247 } else { 01248 $this->assertTrue( (bool)preg_match( $expectedResult, $reason ), 01249 "Autosummary didn't match expected pattern $expectedResult: $reason" ); 01250 } 01251 01252 $this->assertEquals( $expectedHistory, $hasHistory, 01253 "expected \$hasHistory to be " . var_export( $expectedHistory, true ) ); 01254 01255 $page->doDeleteArticle( "done" ); 01256 } 01257 01258 public static function providePreSaveTransform() { 01259 return array( 01260 array( 'hello this is ~~~', 01261 "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]", 01262 ), 01263 array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>', 01264 'hello \'\'this\'\' is <nowiki>~~~</nowiki>', 01265 ), 01266 ); 01267 } 01268 01273 public function testPreSaveTransform( $text, $expected ) { 01274 $this->hideDeprecated( 'WikiPage::preSaveTransform' ); 01275 $user = new User(); 01276 $user->setName( "127.0.0.1" ); 01277 01278 //NOTE: assume Help namespace to contain wikitext 01279 $page = $this->newPage( "Help:WikiPageTest_testPreloadTransform" ); 01280 $text = $page->preSaveTransform( $text, $user ); 01281 01282 $this->assertEquals( $expected, $text ); 01283 } 01284 01288 public function testWikiPageFactory() { 01289 $title = Title::makeTitle( NS_FILE, 'Someimage.png' ); 01290 $page = WikiPage::factory( $title ); 01291 $this->assertEquals( 'WikiFilePage', get_class( $page ) ); 01292 01293 $title = Title::makeTitle( NS_CATEGORY, 'SomeCategory' ); 01294 $page = WikiPage::factory( $title ); 01295 $this->assertEquals( 'WikiCategoryPage', get_class( $page ) ); 01296 01297 $title = Title::makeTitle( NS_MAIN, 'SomePage' ); 01298 $page = WikiPage::factory( $title ); 01299 $this->assertEquals( 'WikiPage', get_class( $page ) ); 01300 } 01301 }