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