MediaWiki
REL1_22
|
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 00579 00584 public function testIsCountable( $title, $model, $text, $mode, $expected ) { 00585 global $wgContentHandlerUseDB; 00586 00587 $this->setMwGlobals( 'wgArticleCountMethod', $mode ); 00588 00589 $title = Title::newFromText( $title ); 00590 00591 if ( !$wgContentHandlerUseDB && $model && ContentHandler::getDefaultModelFor( $title ) != $model ) { 00592 $this->markTestSkipped( "Can not use non-default content model $model for " 00593 . $title->getPrefixedDBkey() . " with \$wgContentHandlerUseDB disabled." ); 00594 } 00595 00596 $page = $this->createPage( $title, $text, $model ); 00597 $hasLinks = wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1, 00598 array( 'pl_from' => $page->getId() ), __METHOD__ ); 00599 00600 $editInfo = $page->prepareContentForEdit( $page->getContent() ); 00601 00602 $v = $page->isCountable(); 00603 $w = $page->isCountable( $editInfo ); 00604 00605 $this->assertEquals( $expected, $v, "isCountable( null ) returned unexpected value " . var_export( $v, true ) 00606 . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" ); 00607 00608 $this->assertEquals( $expected, $w, "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true ) 00609 . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" ); 00610 } 00611 00612 public static function provideGetParserOutput() { 00613 return array( 00614 array( CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "<p>hello <i>world</i></p>" ), 00615 // @todo more...? 00616 ); 00617 } 00618 00623 public function testGetParserOutput( $model, $text, $expectedHtml ) { 00624 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model ); 00625 00626 $opt = $page->makeParserOptions( 'canonical' ); 00627 $po = $page->getParserOutput( $opt ); 00628 $text = $po->getText(); 00629 00630 $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments 00631 $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us 00632 00633 $this->assertEquals( $expectedHtml, $text ); 00634 00635 return $po; 00636 } 00637 00641 public function testGetParserOutput_nonexisting() { 00642 static $count = 0; 00643 $count++; 00644 00645 $page = new WikiPage( new Title( "WikiPageTest_testGetParserOutput_nonexisting_$count" ) ); 00646 00647 $opt = new ParserOptions(); 00648 $po = $page->getParserOutput( $opt ); 00649 00650 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." ); 00651 } 00652 00656 public function testGetParserOutput_badrev() { 00657 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT ); 00658 00659 $opt = new ParserOptions(); 00660 $po = $page->getParserOutput( $opt, $page->getLatest() + 1234 ); 00661 00662 // @todo would be neat to also test deleted revision 00663 00664 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." ); 00665 } 00666 00667 static $sections = 00668 00669 "Intro 00670 00671 == stuff == 00672 hello world 00673 00674 == test == 00675 just a test 00676 00677 == foo == 00678 more stuff 00679 "; 00680 00681 00682 public function dataReplaceSection() { 00683 //NOTE: assume the Help namespace to contain wikitext 00684 return array( 00685 array( 'Help:WikiPageTest_testReplaceSection', 00686 CONTENT_MODEL_WIKITEXT, 00687 WikiPageTest::$sections, 00688 "0", 00689 "No more", 00690 null, 00691 trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest::$sections ) ) 00692 ), 00693 array( 'Help:WikiPageTest_testReplaceSection', 00694 CONTENT_MODEL_WIKITEXT, 00695 WikiPageTest::$sections, 00696 "", 00697 "No more", 00698 null, 00699 "No more" 00700 ), 00701 array( 'Help:WikiPageTest_testReplaceSection', 00702 CONTENT_MODEL_WIKITEXT, 00703 WikiPageTest::$sections, 00704 "2", 00705 "== TEST ==\nmore fun", 00706 null, 00707 trim( preg_replace( '/^== test ==.*== foo ==/sm', 00708 "== TEST ==\nmore fun\n\n== foo ==", 00709 WikiPageTest::$sections ) ) 00710 ), 00711 array( 'Help:WikiPageTest_testReplaceSection', 00712 CONTENT_MODEL_WIKITEXT, 00713 WikiPageTest::$sections, 00714 "8", 00715 "No more", 00716 null, 00717 trim( WikiPageTest::$sections ) 00718 ), 00719 array( 'Help:WikiPageTest_testReplaceSection', 00720 CONTENT_MODEL_WIKITEXT, 00721 WikiPageTest::$sections, 00722 "new", 00723 "No more", 00724 "New", 00725 trim( WikiPageTest::$sections ) . "\n\n== New ==\n\nNo more" 00726 ), 00727 ); 00728 } 00729 00734 public function testReplaceSection( $title, $model, $text, $section, $with, $sectionTitle, $expected ) { 00735 $this->hideDeprecated( "WikiPage::replaceSection" ); 00736 00737 $page = $this->createPage( $title, $text, $model ); 00738 $text = $page->replaceSection( $section, $with, $sectionTitle ); 00739 $text = trim( $text ); 00740 00741 $this->assertEquals( $expected, $text ); 00742 } 00743 00748 public function testReplaceSectionContent( $title, $model, $text, $section, $with, $sectionTitle, $expected ) { 00749 $page = $this->createPage( $title, $text, $model ); 00750 00751 $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() ); 00752 $c = $page->replaceSectionContent( $section, $content, $sectionTitle ); 00753 00754 $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) ); 00755 } 00756 00757 /* @todo FIXME: fix this! 00758 public function testGetUndoText() { 00759 $this->checkHasDiff3(); 00760 00761 $text = "one"; 00762 $page = $this->createPage( "WikiPageTest_testGetUndoText", $text ); 00763 $rev1 = $page->getRevision(); 00764 00765 $text .= "\n\ntwo"; 00766 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section two"); 00767 $rev2 = $page->getRevision(); 00768 00769 $text .= "\n\nthree"; 00770 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section three"); 00771 $rev3 = $page->getRevision(); 00772 00773 $text .= "\n\nfour"; 00774 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section four"); 00775 $rev4 = $page->getRevision(); 00776 00777 $text .= "\n\nfive"; 00778 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section five"); 00779 $rev5 = $page->getRevision(); 00780 00781 $text .= "\n\nsix"; 00782 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section six"); 00783 $rev6 = $page->getRevision(); 00784 00785 $undo6 = $page->getUndoText( $rev6 ); 00786 if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" ); 00787 $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 ); 00788 00789 $undo3 = $page->getUndoText( $rev4, $rev2 ); 00790 if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" ); 00791 $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 ); 00792 00793 $undo2 = $page->getUndoText( $rev2 ); 00794 if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" ); 00795 $this->assertEquals( "one\n\nfive", $undo2 ); 00796 } 00797 */ 00798 00802 public function broken_testDoRollback() { 00803 $admin = new User(); 00804 $admin->setName( "Admin" ); 00805 00806 $text = "one"; 00807 $page = $this->newPage( "WikiPageTest_testDoRollback" ); 00808 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), 00809 "section one", EDIT_NEW, false, $admin ); 00810 00811 $user1 = new User(); 00812 $user1->setName( "127.0.1.11" ); 00813 $text .= "\n\ntwo"; 00814 $page = new WikiPage( $page->getTitle() ); 00815 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), 00816 "adding section two", 0, false, $user1 ); 00817 00818 $user2 = new User(); 00819 $user2->setName( "127.0.2.13" ); 00820 $text .= "\n\nthree"; 00821 $page = new WikiPage( $page->getTitle() ); 00822 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), 00823 "adding section three", 0, false, $user2 ); 00824 00825 # we are having issues with doRollback spuriously failing. apparently the last revision somehow goes missing 00826 # or not committed under some circumstances. so, make sure the last revision has the right user name. 00827 $dbr = wfGetDB( DB_SLAVE ); 00828 $this->assertEquals( 3, Revision::countByPageId( $dbr, $page->getId() ) ); 00829 00830 $page = new WikiPage( $page->getTitle() ); 00831 $rev3 = $page->getRevision(); 00832 $this->assertEquals( '127.0.2.13', $rev3->getUserText() ); 00833 00834 $rev2 = $rev3->getPrevious(); 00835 $this->assertEquals( '127.0.1.11', $rev2->getUserText() ); 00836 00837 $rev1 = $rev2->getPrevious(); 00838 $this->assertEquals( 'Admin', $rev1->getUserText() ); 00839 00840 # now, try the actual rollback 00841 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop... 00842 $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user2->getName() ), null ); 00843 $errors = $page->doRollback( $user2->getName(), "testing revert", $token, false, $details, $admin ); 00844 00845 if ( $errors ) { 00846 $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) ); 00847 } 00848 00849 $page = new WikiPage( $page->getTitle() ); 00850 $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(), 00851 "rollback did not revert to the correct revision" ); 00852 $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() ); 00853 } 00854 00859 public function testDoRollback() { 00860 $admin = new User(); 00861 $admin->setName( "Admin" ); 00862 00863 $text = "one"; 00864 $page = $this->newPage( "WikiPageTest_testDoRollback" ); 00865 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 00866 "section one", EDIT_NEW, false, $admin ); 00867 $rev1 = $page->getRevision(); 00868 00869 $user1 = new User(); 00870 $user1->setName( "127.0.1.11" ); 00871 $text .= "\n\ntwo"; 00872 $page = new WikiPage( $page->getTitle() ); 00873 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 00874 "adding section two", 0, false, $user1 ); 00875 00876 # now, try the rollback 00877 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop... 00878 $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null ); 00879 $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $details, $admin ); 00880 00881 if ( $errors ) { 00882 $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) ); 00883 } 00884 00885 $page = new WikiPage( $page->getTitle() ); 00886 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(), 00887 "rollback did not revert to the correct revision" ); 00888 $this->assertEquals( "one", $page->getContent()->getNativeData() ); 00889 } 00890 00891 public static function provideGetAutosummary() { 00892 return array( 00893 array( 00894 'Hello there, world!', 00895 '#REDIRECT [[Foo]]', 00896 0, 00897 '/^Redirected page .*Foo/' 00898 ), 00899 00900 array( 00901 null, 00902 'Hello world!', 00903 EDIT_NEW, 00904 '/^Created page .*Hello/' 00905 ), 00906 00907 array( 00908 'Hello there, world!', 00909 '', 00910 0, 00911 '/^Blanked/' 00912 ), 00913 00914 array( 00915 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut 00916 labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et 00917 ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.', 00918 'Hello world!', 00919 0, 00920 '/^Replaced .*Hello/' 00921 ), 00922 00923 array( 00924 'foo', 00925 'bar', 00926 0, 00927 '/^$/' 00928 ), 00929 ); 00930 } 00931 00936 public function testGetAutosummary( $old, $new, $flags, $expected ) { 00937 $this->hideDeprecated( "WikiPage::getAutosummary" ); 00938 00939 $page = $this->newPage( "WikiPageTest_testGetAutosummary" ); 00940 00941 $summary = $page->getAutosummary( $old, $new, $flags ); 00942 00943 $this->assertTrue( (bool)preg_match( $expected, $summary ), 00944 "Autosummary didn't match expected pattern $expected: $summary" ); 00945 } 00946 00947 public static function provideGetAutoDeleteReason() { 00948 return array( 00949 array( 00950 array(), 00951 false, 00952 false 00953 ), 00954 00955 array( 00956 array( 00957 array( "first edit", null ), 00958 ), 00959 "/first edit.*only contributor/", 00960 false 00961 ), 00962 00963 array( 00964 array( 00965 array( "first edit", null ), 00966 array( "second edit", null ), 00967 ), 00968 "/second edit.*only contributor/", 00969 true 00970 ), 00971 00972 array( 00973 array( 00974 array( "first edit", "127.0.2.22" ), 00975 array( "second edit", "127.0.3.33" ), 00976 ), 00977 "/second edit/", 00978 true 00979 ), 00980 00981 array( 00982 array( 00983 array( "first edit: " 00984 . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam " 00985 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. " 00986 . "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea " 00987 . "takimata sanctus est Lorem ipsum dolor sit amet.'", null ), 00988 ), 00989 '/first edit:.*\.\.\."/', 00990 false 00991 ), 00992 00993 array( 00994 array( 00995 array( "first edit", "127.0.2.22" ), 00996 array( "", "127.0.3.33" ), 00997 ), 00998 "/before blanking.*first edit/", 00999 true 01000 ), 01001 01002 ); 01003 } 01004 01009 public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) { 01010 global $wgUser; 01011 01012 //NOTE: assume Help namespace to contain wikitext 01013 $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" ); 01014 01015 $c = 1; 01016 01017 foreach ( $edits as $edit ) { 01018 $user = new User(); 01019 01020 if ( !empty( $edit[1] ) ) { 01021 $user->setName( $edit[1] ); 01022 } else { 01023 $user = $wgUser; 01024 } 01025 01026 $content = ContentHandler::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() ); 01027 01028 $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user ); 01029 01030 $c += 1; 01031 } 01032 01033 $reason = $page->getAutoDeleteReason( $hasHistory ); 01034 01035 if ( is_bool( $expectedResult ) || is_null( $expectedResult ) ) { 01036 $this->assertEquals( $expectedResult, $reason ); 01037 } else { 01038 $this->assertTrue( (bool)preg_match( $expectedResult, $reason ), 01039 "Autosummary didn't match expected pattern $expectedResult: $reason" ); 01040 } 01041 01042 $this->assertEquals( $expectedHistory, $hasHistory, 01043 "expected \$hasHistory to be " . var_export( $expectedHistory, true ) ); 01044 01045 $page->doDeleteArticle( "done" ); 01046 } 01047 01048 public static function providePreSaveTransform() { 01049 return array( 01050 array( 'hello this is ~~~', 01051 "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]", 01052 ), 01053 array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>', 01054 'hello \'\'this\'\' is <nowiki>~~~</nowiki>', 01055 ), 01056 ); 01057 } 01058 01063 public function testPreSaveTransform( $text, $expected ) { 01064 $this->hideDeprecated( 'WikiPage::preSaveTransform' ); 01065 $user = new User(); 01066 $user->setName( "127.0.0.1" ); 01067 01068 //NOTE: assume Help namespace to contain wikitext 01069 $page = $this->newPage( "Help:WikiPageTest_testPreloadTransform" ); 01070 $text = $page->preSaveTransform( $text, $user ); 01071 01072 $this->assertEquals( $expected, $text ); 01073 } 01074 }