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