MediaWiki
REL1_23
|
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( "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam " 00101 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.", 00102 $title, CONTENT_MODEL_WIKITEXT ); 00103 00104 $page->doEditContent( $content, "[[testing]] 1" ); 00105 00106 $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" ); 00107 $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" ); 00108 $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" ); 00109 $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" ); 00110 00111 $id = $page->getId(); 00112 00113 # ------------------------ 00114 $dbr = wfGetDB( DB_SLAVE ); 00115 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) ); 00116 $n = $res->numRows(); 00117 $res->free(); 00118 00119 $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' ); 00120 00121 # ------------------------ 00122 $page = new WikiPage( $title ); 00123 00124 $retrieved = $page->getContent(); 00125 $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' ); 00126 00127 # ------------------------ 00128 $content = ContentHandler::makeContent( "At vero eos et accusam et justo duo [[dolores]] et ea rebum. " 00129 . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.", 00130 $title, CONTENT_MODEL_WIKITEXT ); 00131 00132 $page->doEditContent( $content, "testing 2" ); 00133 00134 # ------------------------ 00135 $page = new WikiPage( $title ); 00136 00137 $retrieved = $page->getContent(); 00138 $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' ); 00139 00140 # ------------------------ 00141 $dbr = wfGetDB( DB_SLAVE ); 00142 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) ); 00143 $n = $res->numRows(); 00144 $res->free(); 00145 00146 $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' ); 00147 } 00148 00152 public function testDoEdit() { 00153 $this->hideDeprecated( "WikiPage::doEdit" ); 00154 $this->hideDeprecated( "WikiPage::getText" ); 00155 $this->hideDeprecated( "Revision::getText" ); 00156 00157 //NOTE: assume help namespace will default to wikitext 00158 $title = Title::newFromText( "Help:WikiPageTest_testDoEdit" ); 00159 00160 $page = $this->newPage( $title ); 00161 00162 $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam " 00163 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat."; 00164 00165 $page->doEdit( $text, "[[testing]] 1" ); 00166 00167 $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" ); 00168 $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" ); 00169 $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" ); 00170 $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" ); 00171 00172 $id = $page->getId(); 00173 00174 # ------------------------ 00175 $dbr = wfGetDB( DB_SLAVE ); 00176 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) ); 00177 $n = $res->numRows(); 00178 $res->free(); 00179 00180 $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' ); 00181 00182 # ------------------------ 00183 $page = new WikiPage( $title ); 00184 00185 $retrieved = $page->getText(); 00186 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' ); 00187 00188 # ------------------------ 00189 $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. " 00190 . "Stet clita kasd [[gubergren]], no sea takimata sanctus est."; 00191 00192 $page->doEdit( $text, "testing 2" ); 00193 00194 # ------------------------ 00195 $page = new WikiPage( $title ); 00196 00197 $retrieved = $page->getText(); 00198 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' ); 00199 00200 # ------------------------ 00201 $dbr = wfGetDB( DB_SLAVE ); 00202 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) ); 00203 $n = $res->numRows(); 00204 $res->free(); 00205 00206 $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' ); 00207 } 00208 00212 public function testDoQuickEdit() { 00213 global $wgUser; 00214 00215 $this->hideDeprecated( "WikiPage::doQuickEdit" ); 00216 00217 //NOTE: assume help namespace will default to wikitext 00218 $page = $this->createPage( "Help:WikiPageTest_testDoQuickEdit", "original text" ); 00219 00220 $text = "quick text"; 00221 $page->doQuickEdit( $text, $wgUser, "testing q" ); 00222 00223 # --------------------- 00224 $page = new WikiPage( $page->getTitle() ); 00225 $this->assertEquals( $text, $page->getText() ); 00226 } 00227 00231 public function testDoQuickEditContent() { 00232 global $wgUser; 00233 00234 $page = $this->createPage( "WikiPageTest_testDoQuickEditContent", "original text", CONTENT_MODEL_WIKITEXT ); 00235 00236 $content = ContentHandler::makeContent( "quick text", $page->getTitle(), CONTENT_MODEL_WIKITEXT ); 00237 $page->doQuickEditContent( $content, $wgUser, "testing q" ); 00238 00239 # --------------------- 00240 $page = new WikiPage( $page->getTitle() ); 00241 $this->assertTrue( $content->equals( $page->getContent() ) ); 00242 } 00243 00247 public function testDoDeleteArticle() { 00248 $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT ); 00249 $id = $page->getId(); 00250 00251 $page->doDeleteArticle( "testing deletion" ); 00252 00253 $this->assertFalse( $page->getTitle()->getArticleID() > 0, "Title object should now have page id 0" ); 00254 $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" ); 00255 $this->assertFalse( $page->exists(), "WikiPage::exists should return false after page was deleted" ); 00256 $this->assertNull( $page->getContent(), "WikiPage::getContent should return null after page was deleted" ); 00257 $this->assertFalse( $page->getText(), "WikiPage::getText should return false after page was deleted" ); 00258 00259 $t = Title::newFromText( $page->getTitle()->getPrefixedText() ); 00260 $this->assertFalse( $t->exists(), "Title::exists should return false after page was deleted" ); 00261 00262 # ------------------------ 00263 $dbr = wfGetDB( DB_SLAVE ); 00264 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) ); 00265 $n = $res->numRows(); 00266 $res->free(); 00267 00268 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' ); 00269 } 00270 00274 public function testDoDeleteUpdates() { 00275 $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT ); 00276 $id = $page->getId(); 00277 00278 $page->doDeleteUpdates( $id ); 00279 00280 # ------------------------ 00281 $dbr = wfGetDB( DB_SLAVE ); 00282 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) ); 00283 $n = $res->numRows(); 00284 $res->free(); 00285 00286 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' ); 00287 } 00288 00292 public function testGetRevision() { 00293 $page = $this->newPage( "WikiPageTest_testGetRevision" ); 00294 00295 $rev = $page->getRevision(); 00296 $this->assertNull( $rev ); 00297 00298 # ----------------- 00299 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT ); 00300 00301 $rev = $page->getRevision(); 00302 00303 $this->assertEquals( $page->getLatest(), $rev->getId() ); 00304 $this->assertEquals( "some text", $rev->getContent()->getNativeData() ); 00305 } 00306 00310 public function testGetContent() { 00311 $page = $this->newPage( "WikiPageTest_testGetContent" ); 00312 00313 $content = $page->getContent(); 00314 $this->assertNull( $content ); 00315 00316 # ----------------- 00317 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT ); 00318 00319 $content = $page->getContent(); 00320 $this->assertEquals( "some text", $content->getNativeData() ); 00321 } 00322 00326 public function testGetText() { 00327 $this->hideDeprecated( "WikiPage::getText" ); 00328 00329 $page = $this->newPage( "WikiPageTest_testGetText" ); 00330 00331 $text = $page->getText(); 00332 $this->assertFalse( $text ); 00333 00334 # ----------------- 00335 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT ); 00336 00337 $text = $page->getText(); 00338 $this->assertEquals( "some text", $text ); 00339 } 00340 00344 public function testGetRawText() { 00345 $this->hideDeprecated( "WikiPage::getRawText" ); 00346 00347 $page = $this->newPage( "WikiPageTest_testGetRawText" ); 00348 00349 $text = $page->getRawText(); 00350 $this->assertFalse( $text ); 00351 00352 # ----------------- 00353 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT ); 00354 00355 $text = $page->getRawText(); 00356 $this->assertEquals( "some text", $text ); 00357 } 00358 00362 public function testGetContentModel() { 00363 global $wgContentHandlerUseDB; 00364 00365 if ( !$wgContentHandlerUseDB ) { 00366 $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' ); 00367 } 00368 00369 $page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT ); 00370 00371 $page = new WikiPage( $page->getTitle() ); 00372 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() ); 00373 } 00374 00378 public function testGetContentHandler() { 00379 global $wgContentHandlerUseDB; 00380 00381 if ( !$wgContentHandlerUseDB ) { 00382 $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' ); 00383 } 00384 00385 $page = $this->createPage( "WikiPageTest_testGetContentHandler", "some text", CONTENT_MODEL_JAVASCRIPT ); 00386 00387 $page = new WikiPage( $page->getTitle() ); 00388 $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) ); 00389 } 00390 00394 public function testExists() { 00395 $page = $this->newPage( "WikiPageTest_testExists" ); 00396 $this->assertFalse( $page->exists() ); 00397 00398 # ----------------- 00399 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT ); 00400 $this->assertTrue( $page->exists() ); 00401 00402 $page = new WikiPage( $page->getTitle() ); 00403 $this->assertTrue( $page->exists() ); 00404 00405 # ----------------- 00406 $page->doDeleteArticle( "done testing" ); 00407 $this->assertFalse( $page->exists() ); 00408 00409 $page = new WikiPage( $page->getTitle() ); 00410 $this->assertFalse( $page->exists() ); 00411 } 00412 00413 public static function provideHasViewableContent() { 00414 return array( 00415 array( 'WikiPageTest_testHasViewableContent', false, true ), 00416 array( 'Special:WikiPageTest_testHasViewableContent', false ), 00417 array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ), 00418 array( 'Special:Userlogin', true ), 00419 array( 'MediaWiki:help', true ), 00420 ); 00421 } 00422 00427 public function testHasViewableContent( $title, $viewable, $create = false ) { 00428 $page = $this->newPage( $title ); 00429 $this->assertEquals( $viewable, $page->hasViewableContent() ); 00430 00431 if ( $create ) { 00432 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT ); 00433 $this->assertTrue( $page->hasViewableContent() ); 00434 00435 $page = new WikiPage( $page->getTitle() ); 00436 $this->assertTrue( $page->hasViewableContent() ); 00437 } 00438 } 00439 00440 public static function provideGetRedirectTarget() { 00441 return array( 00442 array( 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT, "hello world", null ), 00443 array( 'WikiPageTest_testGetRedirectTarget_2', CONTENT_MODEL_WIKITEXT, "#REDIRECT [[hello world]]", "Hello world" ), 00444 ); 00445 } 00446 00451 public function testGetRedirectTarget( $title, $model, $text, $target ) { 00452 $page = $this->createPage( $title, $text, $model ); 00453 00454 # sanity check, because this test seems to fail for no reason for some people. 00455 $c = $page->getContent(); 00456 $this->assertEquals( 'WikitextContent', get_class( $c ) ); 00457 00458 # now, test the actual redirect 00459 $t = $page->getRedirectTarget(); 00460 $this->assertEquals( $target, is_null( $t ) ? null : $t->getPrefixedText() ); 00461 } 00462 00467 public function testIsRedirect( $title, $model, $text, $target ) { 00468 $page = $this->createPage( $title, $text, $model ); 00469 $this->assertEquals( !is_null( $target ), $page->isRedirect() ); 00470 } 00471 00472 public static function provideIsCountable() { 00473 return array( 00474 00475 // any 00476 array( 'WikiPageTest_testIsCountable', 00477 CONTENT_MODEL_WIKITEXT, 00478 '', 00479 'any', 00480 true 00481 ), 00482 array( 'WikiPageTest_testIsCountable', 00483 CONTENT_MODEL_WIKITEXT, 00484 'Foo', 00485 'any', 00486 true 00487 ), 00488 00489 // comma 00490 array( 'WikiPageTest_testIsCountable', 00491 CONTENT_MODEL_WIKITEXT, 00492 'Foo', 00493 'comma', 00494 false 00495 ), 00496 array( 'WikiPageTest_testIsCountable', 00497 CONTENT_MODEL_WIKITEXT, 00498 'Foo, bar', 00499 'comma', 00500 true 00501 ), 00502 00503 // link 00504 array( 'WikiPageTest_testIsCountable', 00505 CONTENT_MODEL_WIKITEXT, 00506 'Foo', 00507 'link', 00508 false 00509 ), 00510 array( 'WikiPageTest_testIsCountable', 00511 CONTENT_MODEL_WIKITEXT, 00512 'Foo [[bar]]', 00513 'link', 00514 true 00515 ), 00516 00517 // redirects 00518 array( 'WikiPageTest_testIsCountable', 00519 CONTENT_MODEL_WIKITEXT, 00520 '#REDIRECT [[bar]]', 00521 'any', 00522 false 00523 ), 00524 array( 'WikiPageTest_testIsCountable', 00525 CONTENT_MODEL_WIKITEXT, 00526 '#REDIRECT [[bar]]', 00527 'comma', 00528 false 00529 ), 00530 array( 'WikiPageTest_testIsCountable', 00531 CONTENT_MODEL_WIKITEXT, 00532 '#REDIRECT [[bar]]', 00533 'link', 00534 false 00535 ), 00536 00537 // not a content namespace 00538 array( 'Talk:WikiPageTest_testIsCountable', 00539 CONTENT_MODEL_WIKITEXT, 00540 'Foo', 00541 'any', 00542 false 00543 ), 00544 array( 'Talk:WikiPageTest_testIsCountable', 00545 CONTENT_MODEL_WIKITEXT, 00546 'Foo, bar', 00547 'comma', 00548 false 00549 ), 00550 array( 'Talk:WikiPageTest_testIsCountable', 00551 CONTENT_MODEL_WIKITEXT, 00552 'Foo [[bar]]', 00553 'link', 00554 false 00555 ), 00556 00557 // not a content namespace, different model 00558 array( 'MediaWiki:WikiPageTest_testIsCountable.js', 00559 null, 00560 'Foo', 00561 'any', 00562 false 00563 ), 00564 array( 'MediaWiki:WikiPageTest_testIsCountable.js', 00565 null, 00566 'Foo, bar', 00567 'comma', 00568 false 00569 ), 00570 array( 'MediaWiki:WikiPageTest_testIsCountable.js', 00571 null, 00572 'Foo [[bar]]', 00573 'link', 00574 false 00575 ), 00576 ); 00577 } 00578 00583 public function testIsCountable( $title, $model, $text, $mode, $expected ) { 00584 global $wgContentHandlerUseDB; 00585 00586 $this->setMwGlobals( 'wgArticleCountMethod', $mode ); 00587 00588 $title = Title::newFromText( $title ); 00589 00590 if ( !$wgContentHandlerUseDB && $model && ContentHandler::getDefaultModelFor( $title ) != $model ) { 00591 $this->markTestSkipped( "Can not use non-default content model $model for " 00592 . $title->getPrefixedDBkey() . " with \$wgContentHandlerUseDB disabled." ); 00593 } 00594 00595 $page = $this->createPage( $title, $text, $model ); 00596 00597 $editInfo = $page->prepareContentForEdit( $page->getContent() ); 00598 00599 $v = $page->isCountable(); 00600 $w = $page->isCountable( $editInfo ); 00601 00602 $this->assertEquals( $expected, $v, "isCountable( null ) returned unexpected value " . var_export( $v, true ) 00603 . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" ); 00604 00605 $this->assertEquals( $expected, $w, "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true ) 00606 . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" ); 00607 } 00608 00609 public static function provideGetParserOutput() { 00610 return array( 00611 array( CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "<p>hello <i>world</i></p>" ), 00612 // @todo more...? 00613 ); 00614 } 00615 00620 public function testGetParserOutput( $model, $text, $expectedHtml ) { 00621 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model ); 00622 00623 $opt = $page->makeParserOptions( 'canonical' ); 00624 $po = $page->getParserOutput( $opt ); 00625 $text = $po->getText(); 00626 00627 $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments 00628 $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us 00629 00630 $this->assertEquals( $expectedHtml, $text ); 00631 00632 return $po; 00633 } 00634 00638 public function testGetParserOutput_nonexisting() { 00639 static $count = 0; 00640 $count++; 00641 00642 $page = new WikiPage( new Title( "WikiPageTest_testGetParserOutput_nonexisting_$count" ) ); 00643 00644 $opt = new ParserOptions(); 00645 $po = $page->getParserOutput( $opt ); 00646 00647 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." ); 00648 } 00649 00653 public function testGetParserOutput_badrev() { 00654 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT ); 00655 00656 $opt = new ParserOptions(); 00657 $po = $page->getParserOutput( $opt, $page->getLatest() + 1234 ); 00658 00659 // @todo would be neat to also test deleted revision 00660 00661 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." ); 00662 } 00663 00664 static $sections = 00665 00666 "Intro 00667 00668 == stuff == 00669 hello world 00670 00671 == test == 00672 just a test 00673 00674 == foo == 00675 more stuff 00676 "; 00677 00678 public function dataReplaceSection() { 00679 //NOTE: assume the Help namespace to contain wikitext 00680 return array( 00681 array( 'Help:WikiPageTest_testReplaceSection', 00682 CONTENT_MODEL_WIKITEXT, 00683 WikiPageTest::$sections, 00684 "0", 00685 "No more", 00686 null, 00687 trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest::$sections ) ) 00688 ), 00689 array( 'Help:WikiPageTest_testReplaceSection', 00690 CONTENT_MODEL_WIKITEXT, 00691 WikiPageTest::$sections, 00692 "", 00693 "No more", 00694 null, 00695 "No more" 00696 ), 00697 array( 'Help:WikiPageTest_testReplaceSection', 00698 CONTENT_MODEL_WIKITEXT, 00699 WikiPageTest::$sections, 00700 "2", 00701 "== TEST ==\nmore fun", 00702 null, 00703 trim( preg_replace( '/^== test ==.*== foo ==/sm', 00704 "== TEST ==\nmore fun\n\n== foo ==", 00705 WikiPageTest::$sections ) ) 00706 ), 00707 array( 'Help:WikiPageTest_testReplaceSection', 00708 CONTENT_MODEL_WIKITEXT, 00709 WikiPageTest::$sections, 00710 "8", 00711 "No more", 00712 null, 00713 trim( WikiPageTest::$sections ) 00714 ), 00715 array( 'Help:WikiPageTest_testReplaceSection', 00716 CONTENT_MODEL_WIKITEXT, 00717 WikiPageTest::$sections, 00718 "new", 00719 "No more", 00720 "New", 00721 trim( WikiPageTest::$sections ) . "\n\n== New ==\n\nNo more" 00722 ), 00723 ); 00724 } 00725 00730 public function testReplaceSection( $title, $model, $text, $section, $with, $sectionTitle, $expected ) { 00731 $this->hideDeprecated( "WikiPage::replaceSection" ); 00732 00733 $page = $this->createPage( $title, $text, $model ); 00734 $text = $page->replaceSection( $section, $with, $sectionTitle ); 00735 $text = trim( $text ); 00736 00737 $this->assertEquals( $expected, $text ); 00738 } 00739 00744 public function testReplaceSectionContent( $title, $model, $text, $section, $with, $sectionTitle, $expected ) { 00745 $page = $this->createPage( $title, $text, $model ); 00746 00747 $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() ); 00748 $c = $page->replaceSectionContent( $section, $content, $sectionTitle ); 00749 00750 $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) ); 00751 } 00752 00753 /* @todo FIXME: fix this! 00754 public function testGetUndoText() { 00755 $this->checkHasDiff3(); 00756 00757 $text = "one"; 00758 $page = $this->createPage( "WikiPageTest_testGetUndoText", $text ); 00759 $rev1 = $page->getRevision(); 00760 00761 $text .= "\n\ntwo"; 00762 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section two"); 00763 $rev2 = $page->getRevision(); 00764 00765 $text .= "\n\nthree"; 00766 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section three"); 00767 $rev3 = $page->getRevision(); 00768 00769 $text .= "\n\nfour"; 00770 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section four"); 00771 $rev4 = $page->getRevision(); 00772 00773 $text .= "\n\nfive"; 00774 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section five"); 00775 $rev5 = $page->getRevision(); 00776 00777 $text .= "\n\nsix"; 00778 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section six"); 00779 $rev6 = $page->getRevision(); 00780 00781 $undo6 = $page->getUndoText( $rev6 ); 00782 if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" ); 00783 $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 ); 00784 00785 $undo3 = $page->getUndoText( $rev4, $rev2 ); 00786 if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" ); 00787 $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 ); 00788 00789 $undo2 = $page->getUndoText( $rev2 ); 00790 if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" ); 00791 $this->assertEquals( "one\n\nfive", $undo2 ); 00792 } 00793 */ 00794 00798 public function broken_testDoRollback() { 00799 $admin = new User(); 00800 $admin->setName( "Admin" ); 00801 00802 $text = "one"; 00803 $page = $this->newPage( "WikiPageTest_testDoRollback" ); 00804 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), 00805 "section one", EDIT_NEW, false, $admin ); 00806 00807 $user1 = new User(); 00808 $user1->setName( "127.0.1.11" ); 00809 $text .= "\n\ntwo"; 00810 $page = new WikiPage( $page->getTitle() ); 00811 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), 00812 "adding section two", 0, false, $user1 ); 00813 00814 $user2 = new User(); 00815 $user2->setName( "127.0.2.13" ); 00816 $text .= "\n\nthree"; 00817 $page = new WikiPage( $page->getTitle() ); 00818 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), 00819 "adding section three", 0, false, $user2 ); 00820 00821 # we are having issues with doRollback spuriously failing. apparently the last revision somehow goes missing 00822 # or not committed under some circumstances. so, make sure the last revision has the right user name. 00823 $dbr = wfGetDB( DB_SLAVE ); 00824 $this->assertEquals( 3, Revision::countByPageId( $dbr, $page->getId() ) ); 00825 00826 $page = new WikiPage( $page->getTitle() ); 00827 $rev3 = $page->getRevision(); 00828 $this->assertEquals( '127.0.2.13', $rev3->getUserText() ); 00829 00830 $rev2 = $rev3->getPrevious(); 00831 $this->assertEquals( '127.0.1.11', $rev2->getUserText() ); 00832 00833 $rev1 = $rev2->getPrevious(); 00834 $this->assertEquals( 'Admin', $rev1->getUserText() ); 00835 00836 # now, try the actual rollback 00837 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop... 00838 $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user2->getName() ), null ); 00839 $errors = $page->doRollback( $user2->getName(), "testing revert", $token, false, $details, $admin ); 00840 00841 if ( $errors ) { 00842 $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) ); 00843 } 00844 00845 $page = new WikiPage( $page->getTitle() ); 00846 $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(), 00847 "rollback did not revert to the correct revision" ); 00848 $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() ); 00849 } 00850 00855 public function testDoRollback() { 00856 $admin = new User(); 00857 $admin->setName( "Admin" ); 00858 00859 $text = "one"; 00860 $page = $this->newPage( "WikiPageTest_testDoRollback" ); 00861 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 00862 "section one", EDIT_NEW, false, $admin ); 00863 $rev1 = $page->getRevision(); 00864 00865 $user1 = new User(); 00866 $user1->setName( "127.0.1.11" ); 00867 $text .= "\n\ntwo"; 00868 $page = new WikiPage( $page->getTitle() ); 00869 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 00870 "adding section two", 0, false, $user1 ); 00871 00872 # now, try the rollback 00873 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop... 00874 $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null ); 00875 $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $details, $admin ); 00876 00877 if ( $errors ) { 00878 $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) ); 00879 } 00880 00881 $page = new WikiPage( $page->getTitle() ); 00882 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(), 00883 "rollback did not revert to the correct revision" ); 00884 $this->assertEquals( "one", $page->getContent()->getNativeData() ); 00885 } 00886 00890 public function testDoRollbackFailureSameContent() { 00891 $admin = new User(); 00892 $admin->setName( "Admin" ); 00893 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop... 00894 00895 $text = "one"; 00896 $page = $this->newPage( "WikiPageTest_testDoRollback" ); 00897 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 00898 "section one", EDIT_NEW, false, $admin ); 00899 $rev1 = $page->getRevision(); 00900 00901 $user1 = new User(); 00902 $user1->setName( "127.0.1.11" ); 00903 $user1->addGroup( "sysop" ); #XXX: make the test user a sysop... 00904 $text .= "\n\ntwo"; 00905 $page = new WikiPage( $page->getTitle() ); 00906 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 00907 "adding section two", 0, false, $user1 ); 00908 00909 # now, do a the rollback from the same user was doing the edit before 00910 $resultDetails = array(); 00911 $token = $user1->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null ); 00912 $errors = $page->doRollback( $user1->getName(), "testing revert same user", $token, false, $resultDetails, $admin ); 00913 00914 $this->assertEquals( array(), $errors, "Rollback failed same user" ); 00915 00916 # now, try the rollback 00917 $resultDetails = array(); 00918 $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null ); 00919 $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $resultDetails, $admin ); 00920 00921 $this->assertEquals( array( array( 'alreadyrolled', 'WikiPageTest testDoRollback', 00922 '127.0.1.11', 'Admin' ) ), $errors, "Rollback not failed" ); 00923 00924 $page = new WikiPage( $page->getTitle() ); 00925 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(), 00926 "rollback did not revert to the correct revision" ); 00927 $this->assertEquals( "one", $page->getContent()->getNativeData() ); 00928 } 00929 00930 public static function provideGetAutosummary() { 00931 return array( 00932 array( 00933 'Hello there, world!', 00934 '#REDIRECT [[Foo]]', 00935 0, 00936 '/^Redirected page .*Foo/' 00937 ), 00938 00939 array( 00940 null, 00941 'Hello world!', 00942 EDIT_NEW, 00943 '/^Created page .*Hello/' 00944 ), 00945 00946 array( 00947 'Hello there, world!', 00948 '', 00949 0, 00950 '/^Blanked/' 00951 ), 00952 00953 array( 00954 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut 00955 labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et 00956 ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.', 00957 'Hello world!', 00958 0, 00959 '/^Replaced .*Hello/' 00960 ), 00961 00962 array( 00963 'foo', 00964 'bar', 00965 0, 00966 '/^$/' 00967 ), 00968 ); 00969 } 00970 00975 public function testGetAutosummary( $old, $new, $flags, $expected ) { 00976 $this->hideDeprecated( "WikiPage::getAutosummary" ); 00977 00978 $page = $this->newPage( "WikiPageTest_testGetAutosummary" ); 00979 00980 $summary = $page->getAutosummary( $old, $new, $flags ); 00981 00982 $this->assertTrue( (bool)preg_match( $expected, $summary ), 00983 "Autosummary didn't match expected pattern $expected: $summary" ); 00984 } 00985 00986 public static function provideGetAutoDeleteReason() { 00987 return array( 00988 array( 00989 array(), 00990 false, 00991 false 00992 ), 00993 00994 array( 00995 array( 00996 array( "first edit", null ), 00997 ), 00998 "/first edit.*only contributor/", 00999 false 01000 ), 01001 01002 array( 01003 array( 01004 array( "first edit", null ), 01005 array( "second edit", null ), 01006 ), 01007 "/second edit.*only contributor/", 01008 true 01009 ), 01010 01011 array( 01012 array( 01013 array( "first edit", "127.0.2.22" ), 01014 array( "second edit", "127.0.3.33" ), 01015 ), 01016 "/second edit/", 01017 true 01018 ), 01019 01020 array( 01021 array( 01022 array( "first edit: " 01023 . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam " 01024 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. " 01025 . "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea " 01026 . "takimata sanctus est Lorem ipsum dolor sit amet.'", null ), 01027 ), 01028 '/first edit:.*\.\.\."/', 01029 false 01030 ), 01031 01032 array( 01033 array( 01034 array( "first edit", "127.0.2.22" ), 01035 array( "", "127.0.3.33" ), 01036 ), 01037 "/before blanking.*first edit/", 01038 true 01039 ), 01040 01041 ); 01042 } 01043 01048 public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) { 01049 global $wgUser; 01050 01051 //NOTE: assume Help namespace to contain wikitext 01052 $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" ); 01053 01054 $c = 1; 01055 01056 foreach ( $edits as $edit ) { 01057 $user = new User(); 01058 01059 if ( !empty( $edit[1] ) ) { 01060 $user->setName( $edit[1] ); 01061 } else { 01062 $user = $wgUser; 01063 } 01064 01065 $content = ContentHandler::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() ); 01066 01067 $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user ); 01068 01069 $c += 1; 01070 } 01071 01072 $reason = $page->getAutoDeleteReason( $hasHistory ); 01073 01074 if ( is_bool( $expectedResult ) || is_null( $expectedResult ) ) { 01075 $this->assertEquals( $expectedResult, $reason ); 01076 } else { 01077 $this->assertTrue( (bool)preg_match( $expectedResult, $reason ), 01078 "Autosummary didn't match expected pattern $expectedResult: $reason" ); 01079 } 01080 01081 $this->assertEquals( $expectedHistory, $hasHistory, 01082 "expected \$hasHistory to be " . var_export( $expectedHistory, true ) ); 01083 01084 $page->doDeleteArticle( "done" ); 01085 } 01086 01087 public static function providePreSaveTransform() { 01088 return array( 01089 array( 'hello this is ~~~', 01090 "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]", 01091 ), 01092 array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>', 01093 'hello \'\'this\'\' is <nowiki>~~~</nowiki>', 01094 ), 01095 ); 01096 } 01097 01102 public function testPreSaveTransform( $text, $expected ) { 01103 $this->hideDeprecated( 'WikiPage::preSaveTransform' ); 01104 $user = new User(); 01105 $user->setName( "127.0.0.1" ); 01106 01107 //NOTE: assume Help namespace to contain wikitext 01108 $page = $this->newPage( "Help:WikiPageTest_testPreloadTransform" ); 01109 $text = $page->preSaveTransform( $text, $user ); 01110 01111 $this->assertEquals( $expected, $text ); 01112 } 01113 01117 public function testWikiPageFactory() { 01118 $title = Title::makeTitle( NS_FILE, 'Someimage.png' ); 01119 $page = WikiPage::factory( $title ); 01120 $this->assertEquals( 'WikiFilePage', get_class( $page ) ); 01121 01122 $title = Title::makeTitle( NS_CATEGORY, 'SomeCategory' ); 01123 $page = WikiPage::factory( $title ); 01124 $this->assertEquals( 'WikiCategoryPage', get_class( $page ) ); 01125 01126 $title = Title::makeTitle( NS_MAIN, 'SomePage' ); 01127 $page = WikiPage::factory( $title ); 01128 $this->assertEquals( 'WikiPage', get_class( $page ) ); 01129 } 01130 }