MediaWiki  REL1_21
WikiPageTest.php
Go to the documentation of this file.
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 }