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