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