4 * @group ContentHandler
6 * ^--- important, causes temporary tables to be used instead of the real database
9 class WikiPageTest
extends MediaWikiLangTestCase
{
11 protected $pages_to_delete;
13 function __construct( $name = null, array $data = array(), $dataName = '' ) {
14 parent
::__construct( $name, $data, $dataName );
16 $this->tablesUsed
= array_merge(
35 protected function setUp() {
37 $this->pages_to_delete
= array();
39 LinkCache
::singleton()->clear(); # avoid cached redirect status, etc
42 protected function tearDown() {
43 foreach ( $this->pages_to_delete
as $p ) {
44 /* @var $p WikiPage */
48 $p->doDeleteArticle( "testing done." );
50 } catch ( MWException
$ex ) {
58 * @param Title|string $title
59 * @param string|null $model
62 protected function newPage( $title, $model = null ) {
63 if ( is_string( $title ) ) {
64 $ns = $this->getDefaultWikitextNS();
65 $title = Title
::newFromText( $title, $ns );
68 $p = new WikiPage( $title );
70 $this->pages_to_delete
[] = $p;
76 * @param string|Title|WikiPage $page
82 protected function createPage( $page, $text, $model = null ) {
83 if ( is_string( $page ) ||
$page instanceof Title
) {
84 $page = $this->newPage( $page, $model );
87 $content = ContentHandler
::makeContent( $text, $page->getTitle(), $model );
88 $page->doEditContent( $content, "testing", EDIT_NEW
);
94 * @covers WikiPage::doEditContent
96 public function testDoEditContent() {
97 $page = $this->newPage( "WikiPageTest_testDoEditContent" );
98 $title = $page->getTitle();
100 $content = ContentHandler
::makeContent(
101 "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
102 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.",
104 CONTENT_MODEL_WIKITEXT
107 $page->doEditContent( $content, "[[testing]] 1" );
109 $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
110 $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
111 $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
112 $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
114 $id = $page->getId();
116 # ------------------------
117 $dbr = wfGetDB( DB_SLAVE
);
118 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
119 $n = $res->numRows();
122 $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
124 # ------------------------
125 $page = new WikiPage( $title );
127 $retrieved = $page->getContent();
128 $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
130 # ------------------------
131 $content = ContentHandler
::makeContent(
132 "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
133 . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.",
135 CONTENT_MODEL_WIKITEXT
138 $page->doEditContent( $content, "testing 2" );
140 # ------------------------
141 $page = new WikiPage( $title );
143 $retrieved = $page->getContent();
144 $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
146 # ------------------------
147 $dbr = wfGetDB( DB_SLAVE
);
148 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
149 $n = $res->numRows();
152 $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
156 * @covers WikiPage::doEdit
158 public function testDoEdit() {
159 $this->hideDeprecated( "WikiPage::doEdit" );
160 $this->hideDeprecated( "WikiPage::getText" );
161 $this->hideDeprecated( "Revision::getText" );
163 // NOTE: assume help namespace will default to wikitext
164 $title = Title
::newFromText( "Help:WikiPageTest_testDoEdit" );
166 $page = $this->newPage( $title );
168 $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
169 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
171 $page->doEdit( $text, "[[testing]] 1" );
173 $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
174 $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
175 $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
176 $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
178 $id = $page->getId();
180 # ------------------------
181 $dbr = wfGetDB( DB_SLAVE
);
182 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
183 $n = $res->numRows();
186 $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
188 # ------------------------
189 $page = new WikiPage( $title );
191 $retrieved = $page->getText();
192 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
194 # ------------------------
195 $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
196 . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
198 $page->doEdit( $text, "testing 2" );
200 # ------------------------
201 $page = new WikiPage( $title );
203 $retrieved = $page->getText();
204 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
206 # ------------------------
207 $dbr = wfGetDB( DB_SLAVE
);
208 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
209 $n = $res->numRows();
212 $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
216 * @covers WikiPage::doQuickEdit
218 public function testDoQuickEdit() {
221 $this->hideDeprecated( "WikiPage::doQuickEdit" );
223 // NOTE: assume help namespace will default to wikitext
224 $page = $this->createPage( "Help:WikiPageTest_testDoQuickEdit", "original text" );
226 $text = "quick text";
227 $page->doQuickEdit( $text, $wgUser, "testing q" );
229 # ---------------------
230 $page = new WikiPage( $page->getTitle() );
231 $this->assertEquals( $text, $page->getText() );
235 * @covers WikiPage::doQuickEditContent
237 public function testDoQuickEditContent() {
240 $page = $this->createPage(
241 "WikiPageTest_testDoQuickEditContent",
243 CONTENT_MODEL_WIKITEXT
246 $content = ContentHandler
::makeContent(
249 CONTENT_MODEL_WIKITEXT
251 $page->doQuickEditContent( $content, $wgUser, "testing q" );
253 # ---------------------
254 $page = new WikiPage( $page->getTitle() );
255 $this->assertTrue( $content->equals( $page->getContent() ) );
259 * @covers WikiPage::doDeleteArticle
261 public function testDoDeleteArticle() {
262 $page = $this->createPage(
263 "WikiPageTest_testDoDeleteArticle",
264 "[[original text]] foo",
265 CONTENT_MODEL_WIKITEXT
267 $id = $page->getId();
269 $page->doDeleteArticle( "testing deletion" );
272 $page->getTitle()->getArticleID() > 0,
273 "Title object should now have page id 0"
275 $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" );
278 "WikiPage::exists should return false after page was deleted"
282 "WikiPage::getContent should return null after page was deleted"
286 "WikiPage::getText should return false after page was deleted"
289 $t = Title
::newFromText( $page->getTitle()->getPrefixedText() );
292 "Title::exists should return false after page was deleted"
296 JobQueueGroup
::destroySingletons();
298 $jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
301 # ------------------------
302 $dbr = wfGetDB( DB_SLAVE
);
303 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
304 $n = $res->numRows();
307 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
311 * @covers WikiPage::doDeleteUpdates
313 public function testDoDeleteUpdates() {
314 $page = $this->createPage(
315 "WikiPageTest_testDoDeleteArticle",
316 "[[original text]] foo",
317 CONTENT_MODEL_WIKITEXT
319 $id = $page->getId();
321 // Similar to MovePage logic
322 wfGetDB( DB_MASTER
)->delete( 'page', array( 'page_id' => $id ), __METHOD__
);
323 $page->doDeleteUpdates( $id );
326 JobQueueGroup
::destroySingletons();
328 $jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
331 # ------------------------
332 $dbr = wfGetDB( DB_SLAVE
);
333 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
334 $n = $res->numRows();
337 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
341 * @covers WikiPage::getRevision
343 public function testGetRevision() {
344 $page = $this->newPage( "WikiPageTest_testGetRevision" );
346 $rev = $page->getRevision();
347 $this->assertNull( $rev );
350 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
352 $rev = $page->getRevision();
354 $this->assertEquals( $page->getLatest(), $rev->getId() );
355 $this->assertEquals( "some text", $rev->getContent()->getNativeData() );
359 * @covers WikiPage::getContent
361 public function testGetContent() {
362 $page = $this->newPage( "WikiPageTest_testGetContent" );
364 $content = $page->getContent();
365 $this->assertNull( $content );
368 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
370 $content = $page->getContent();
371 $this->assertEquals( "some text", $content->getNativeData() );
375 * @covers WikiPage::getText
377 public function testGetText() {
378 $this->hideDeprecated( "WikiPage::getText" );
380 $page = $this->newPage( "WikiPageTest_testGetText" );
382 $text = $page->getText();
383 $this->assertFalse( $text );
386 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
388 $text = $page->getText();
389 $this->assertEquals( "some text", $text );
393 * @covers WikiPage::getRawText
395 public function testGetRawText() {
396 $this->hideDeprecated( "WikiPage::getRawText" );
398 $page = $this->newPage( "WikiPageTest_testGetRawText" );
400 $text = $page->getRawText();
401 $this->assertFalse( $text );
404 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
406 $text = $page->getRawText();
407 $this->assertEquals( "some text", $text );
411 * @covers WikiPage::getContentModel
413 public function testGetContentModel() {
414 global $wgContentHandlerUseDB;
416 if ( !$wgContentHandlerUseDB ) {
417 $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
420 $page = $this->createPage(
421 "WikiPageTest_testGetContentModel",
423 CONTENT_MODEL_JAVASCRIPT
426 $page = new WikiPage( $page->getTitle() );
427 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT
, $page->getContentModel() );
431 * @covers WikiPage::getContentHandler
433 public function testGetContentHandler() {
434 global $wgContentHandlerUseDB;
436 if ( !$wgContentHandlerUseDB ) {
437 $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
440 $page = $this->createPage(
441 "WikiPageTest_testGetContentHandler",
443 CONTENT_MODEL_JAVASCRIPT
446 $page = new WikiPage( $page->getTitle() );
447 $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
451 * @covers WikiPage::exists
453 public function testExists() {
454 $page = $this->newPage( "WikiPageTest_testExists" );
455 $this->assertFalse( $page->exists() );
458 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
459 $this->assertTrue( $page->exists() );
461 $page = new WikiPage( $page->getTitle() );
462 $this->assertTrue( $page->exists() );
465 $page->doDeleteArticle( "done testing" );
466 $this->assertFalse( $page->exists() );
468 $page = new WikiPage( $page->getTitle() );
469 $this->assertFalse( $page->exists() );
472 public static function provideHasViewableContent() {
474 array( 'WikiPageTest_testHasViewableContent', false, true ),
475 array( 'Special:WikiPageTest_testHasViewableContent', false ),
476 array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ),
477 array( 'Special:Userlogin', true ),
478 array( 'MediaWiki:help', true ),
483 * @dataProvider provideHasViewableContent
484 * @covers WikiPage::hasViewableContent
486 public function testHasViewableContent( $title, $viewable, $create = false ) {
487 $page = $this->newPage( $title );
488 $this->assertEquals( $viewable, $page->hasViewableContent() );
491 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
492 $this->assertTrue( $page->hasViewableContent() );
494 $page = new WikiPage( $page->getTitle() );
495 $this->assertTrue( $page->hasViewableContent() );
499 public static function provideGetRedirectTarget() {
501 array( 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT
, "hello world", null ),
503 'WikiPageTest_testGetRedirectTarget_2',
504 CONTENT_MODEL_WIKITEXT
,
505 "#REDIRECT [[hello world]]",
512 * @dataProvider provideGetRedirectTarget
513 * @covers WikiPage::getRedirectTarget
515 public function testGetRedirectTarget( $title, $model, $text, $target ) {
516 $this->setMwGlobals( array(
517 'wgCapitalLinks' => true,
520 $page = $this->createPage( $title, $text, $model );
522 # sanity check, because this test seems to fail for no reason for some people.
523 $c = $page->getContent();
524 $this->assertEquals( 'WikitextContent', get_class( $c ) );
526 # now, test the actual redirect
527 $t = $page->getRedirectTarget();
528 $this->assertEquals( $target, is_null( $t ) ?
null : $t->getPrefixedText() );
532 * @dataProvider provideGetRedirectTarget
533 * @covers WikiPage::isRedirect
535 public function testIsRedirect( $title, $model, $text, $target ) {
536 $page = $this->createPage( $title, $text, $model );
537 $this->assertEquals( !is_null( $target ), $page->isRedirect() );
540 public static function provideIsCountable() {
544 array( 'WikiPageTest_testIsCountable',
545 CONTENT_MODEL_WIKITEXT
,
550 array( 'WikiPageTest_testIsCountable',
551 CONTENT_MODEL_WIKITEXT
,
558 array( 'WikiPageTest_testIsCountable',
559 CONTENT_MODEL_WIKITEXT
,
564 array( 'WikiPageTest_testIsCountable',
565 CONTENT_MODEL_WIKITEXT
,
572 array( 'WikiPageTest_testIsCountable',
573 CONTENT_MODEL_WIKITEXT
,
578 array( 'WikiPageTest_testIsCountable',
579 CONTENT_MODEL_WIKITEXT
,
586 array( 'WikiPageTest_testIsCountable',
587 CONTENT_MODEL_WIKITEXT
,
592 array( 'WikiPageTest_testIsCountable',
593 CONTENT_MODEL_WIKITEXT
,
598 array( 'WikiPageTest_testIsCountable',
599 CONTENT_MODEL_WIKITEXT
,
605 // not a content namespace
606 array( 'Talk:WikiPageTest_testIsCountable',
607 CONTENT_MODEL_WIKITEXT
,
612 array( 'Talk:WikiPageTest_testIsCountable',
613 CONTENT_MODEL_WIKITEXT
,
618 array( 'Talk:WikiPageTest_testIsCountable',
619 CONTENT_MODEL_WIKITEXT
,
625 // not a content namespace, different model
626 array( 'MediaWiki:WikiPageTest_testIsCountable.js',
632 array( 'MediaWiki:WikiPageTest_testIsCountable.js',
638 array( 'MediaWiki:WikiPageTest_testIsCountable.js',
648 * @dataProvider provideIsCountable
649 * @covers WikiPage::isCountable
651 public function testIsCountable( $title, $model, $text, $mode, $expected ) {
652 global $wgContentHandlerUseDB;
654 $this->setMwGlobals( 'wgArticleCountMethod', $mode );
656 $title = Title
::newFromText( $title );
658 if ( !$wgContentHandlerUseDB
660 && ContentHandler
::getDefaultModelFor( $title ) != $model
662 $this->markTestSkipped( "Can not use non-default content model $model for "
663 . $title->getPrefixedDBkey() . " with \$wgContentHandlerUseDB disabled." );
666 $page = $this->createPage( $title, $text, $model );
668 $editInfo = $page->prepareContentForEdit( $page->getContent() );
670 $v = $page->isCountable();
671 $w = $page->isCountable( $editInfo );
676 "isCountable( null ) returned unexpected value " . var_export( $v, true )
677 . " instead of " . var_export( $expected, true )
678 . " in mode `$mode` for text \"$text\""
684 "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
685 . " instead of " . var_export( $expected, true )
686 . " in mode `$mode` for text \"$text\""
690 public static function provideGetParserOutput() {
692 array( CONTENT_MODEL_WIKITEXT
, "hello ''world''\n", "<p>hello <i>world</i></p>" ),
698 * @dataProvider provideGetParserOutput
699 * @covers WikiPage::getParserOutput
701 public function testGetParserOutput( $model, $text, $expectedHtml ) {
702 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model );
704 $opt = $page->makeParserOptions( 'canonical' );
705 $po = $page->getParserOutput( $opt );
706 $text = $po->getText();
708 $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
709 $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
711 $this->assertEquals( $expectedHtml, $text );
717 * @covers WikiPage::getParserOutput
719 public function testGetParserOutput_nonexisting() {
723 $page = new WikiPage( new Title( "WikiPageTest_testGetParserOutput_nonexisting_$count" ) );
725 $opt = new ParserOptions();
726 $po = $page->getParserOutput( $opt );
728 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." );
732 * @covers WikiPage::getParserOutput
734 public function testGetParserOutput_badrev() {
735 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT
);
737 $opt = new ParserOptions();
738 $po = $page->getParserOutput( $opt, $page->getLatest() +
1234 );
740 // @todo would be neat to also test deleted revision
742 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
745 public static $sections =
759 public function dataReplaceSection() {
760 // NOTE: assume the Help namespace to contain wikitext
762 array( 'Help:WikiPageTest_testReplaceSection',
763 CONTENT_MODEL_WIKITEXT
,
764 WikiPageTest
::$sections,
768 trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest
::$sections ) )
770 array( 'Help:WikiPageTest_testReplaceSection',
771 CONTENT_MODEL_WIKITEXT
,
772 WikiPageTest
::$sections,
778 array( 'Help:WikiPageTest_testReplaceSection',
779 CONTENT_MODEL_WIKITEXT
,
780 WikiPageTest
::$sections,
782 "== TEST ==\nmore fun",
784 trim( preg_replace( '/^== test ==.*== foo ==/sm',
785 "== TEST ==\nmore fun\n\n== foo ==",
786 WikiPageTest
::$sections ) )
788 array( 'Help:WikiPageTest_testReplaceSection',
789 CONTENT_MODEL_WIKITEXT
,
790 WikiPageTest
::$sections,
794 trim( WikiPageTest
::$sections )
796 array( 'Help:WikiPageTest_testReplaceSection',
797 CONTENT_MODEL_WIKITEXT
,
798 WikiPageTest
::$sections,
802 trim( WikiPageTest
::$sections ) . "\n\n== New ==\n\nNo more"
808 * @dataProvider dataReplaceSection
809 * @covers WikiPage::replaceSection
811 public function testReplaceSection( $title, $model, $text, $section, $with,
812 $sectionTitle, $expected
814 $this->hideDeprecated( "WikiPage::replaceSection" );
816 $page = $this->createPage( $title, $text, $model );
817 $text = $page->replaceSection( $section, $with, $sectionTitle );
818 $text = trim( $text );
820 $this->assertEquals( $expected, $text );
824 * @dataProvider dataReplaceSection
825 * @covers WikiPage::replaceSectionContent
827 public function testReplaceSectionContent( $title, $model, $text, $section,
828 $with, $sectionTitle, $expected
830 $page = $this->createPage( $title, $text, $model );
832 $content = ContentHandler
::makeContent( $with, $page->getTitle(), $page->getContentModel() );
833 $c = $page->replaceSectionContent( $section, $content, $sectionTitle );
835 $this->assertEquals( $expected, is_null( $c ) ?
null : trim( $c->getNativeData() ) );
839 * @dataProvider dataReplaceSection
840 * @covers WikiPage::replaceSectionAtRev
842 public function testReplaceSectionAtRev( $title, $model, $text, $section,
843 $with, $sectionTitle, $expected
845 $page = $this->createPage( $title, $text, $model );
846 $baseRevId = $page->getLatest();
848 $content = ContentHandler
::makeContent( $with, $page->getTitle(), $page->getContentModel() );
849 $c = $page->replaceSectionAtRev( $section, $content, $sectionTitle, $baseRevId );
851 $this->assertEquals( $expected, is_null( $c ) ?
null : trim( $c->getNativeData() ) );
854 /* @todo FIXME: fix this!
855 public function testGetUndoText() {
856 $this->checkHasDiff3();
859 $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
860 $rev1 = $page->getRevision();
863 $page->doEditContent(
864 ContentHandler::makeContent( $text, $page->getTitle() ),
867 $rev2 = $page->getRevision();
869 $text .= "\n\nthree";
870 $page->doEditContent(
871 ContentHandler::makeContent( $text, $page->getTitle() ),
872 "adding section three"
874 $rev3 = $page->getRevision();
877 $page->doEditContent(
878 ContentHandler::makeContent( $text, $page->getTitle() ),
879 "adding section four"
881 $rev4 = $page->getRevision();
884 $page->doEditContent(
885 ContentHandler::makeContent( $text, $page->getTitle() ),
886 "adding section five"
888 $rev5 = $page->getRevision();
891 $page->doEditContent(
892 ContentHandler::makeContent( $text, $page->getTitle() ),
895 $rev6 = $page->getRevision();
897 $undo6 = $page->getUndoText( $rev6 );
898 if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" );
899 $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 );
901 $undo3 = $page->getUndoText( $rev4, $rev2 );
902 if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" );
903 $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 );
905 $undo2 = $page->getUndoText( $rev2 );
906 if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" );
907 $this->assertEquals( "one\n\nfive", $undo2 );
912 * @todo FIXME: this is a better rollback test than the one below, but it
913 * keeps failing in jenkins for some reason.
915 public function broken_testDoRollback() {
917 $admin->setName( "Admin" );
920 $page = $this->newPage( "WikiPageTest_testDoRollback" );
921 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
922 "section one", EDIT_NEW
, false, $admin );
925 $user1->setName( "127.0.1.11" );
927 $page = new WikiPage( $page->getTitle() );
928 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
929 "adding section two", 0, false, $user1 );
932 $user2->setName( "127.0.2.13" );
933 $text .= "\n\nthree";
934 $page = new WikiPage( $page->getTitle() );
935 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
936 "adding section three", 0, false, $user2 );
938 # we are having issues with doRollback spuriously failing. Apparently
939 # the last revision somehow goes missing or not committed under some
940 # circumstances. So, make sure the last revision has the right user name.
941 $dbr = wfGetDB( DB_SLAVE
);
942 $this->assertEquals( 3, Revision
::countByPageId( $dbr, $page->getId() ) );
944 $page = new WikiPage( $page->getTitle() );
945 $rev3 = $page->getRevision();
946 $this->assertEquals( '127.0.2.13', $rev3->getUserText() );
948 $rev2 = $rev3->getPrevious();
949 $this->assertEquals( '127.0.1.11', $rev2->getUserText() );
951 $rev1 = $rev2->getPrevious();
952 $this->assertEquals( 'Admin', $rev1->getUserText() );
954 # now, try the actual rollback
955 $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
956 $token = $admin->getEditToken(
957 array( $page->getTitle()->getPrefixedText(), $user2->getName() ),
960 $errors = $page->doRollback(
970 $this->fail( "Rollback failed:\n" . print_r( $errors, true )
971 . ";\n" . print_r( $details, true ) );
974 $page = new WikiPage( $page->getTitle() );
975 $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(),
976 "rollback did not revert to the correct revision" );
977 $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() );
981 * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
982 * @covers WikiPage::doRollback
984 public function testDoRollback() {
986 $admin->setName( "Admin" );
989 $page = $this->newPage( "WikiPageTest_testDoRollback" );
990 $page->doEditContent(
991 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
997 $rev1 = $page->getRevision();
1000 $user1->setName( "127.0.1.11" );
1002 $page = new WikiPage( $page->getTitle() );
1003 $page->doEditContent(
1004 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
1005 "adding section two",
1011 # now, try the rollback
1012 $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
1013 $token = $admin->getEditToken(
1014 array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
1017 $errors = $page->doRollback(
1027 $this->fail( "Rollback failed:\n" . print_r( $errors, true )
1028 . ";\n" . print_r( $details, true ) );
1031 $page = new WikiPage( $page->getTitle() );
1032 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
1033 "rollback did not revert to the correct revision" );
1034 $this->assertEquals( "one", $page->getContent()->getNativeData() );
1038 * @covers WikiPage::doRollback
1040 public function testDoRollbackFailureSameContent() {
1041 $admin = new User();
1042 $admin->setName( "Admin" );
1043 $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
1046 $page = $this->newPage( "WikiPageTest_testDoRollback" );
1047 $page->doEditContent(
1048 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
1054 $rev1 = $page->getRevision();
1056 $user1 = new User();
1057 $user1->setName( "127.0.1.11" );
1058 $user1->addGroup( "sysop" ); # XXX: make the test user a sysop...
1060 $page = new WikiPage( $page->getTitle() );
1061 $page->doEditContent(
1062 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
1063 "adding section two",
1069 # now, do a the rollback from the same user was doing the edit before
1070 $resultDetails = array();
1071 $token = $user1->getEditToken(
1072 array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
1075 $errors = $page->doRollback(
1077 "testing revert same user",
1084 $this->assertEquals( array(), $errors, "Rollback failed same user" );
1086 # now, try the rollback
1087 $resultDetails = array();
1088 $token = $admin->getEditToken(
1089 array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
1092 $errors = $page->doRollback(
1101 $this->assertEquals( array( array( 'alreadyrolled', 'WikiPageTest testDoRollback',
1102 '127.0.1.11', 'Admin' ) ), $errors, "Rollback not failed" );
1104 $page = new WikiPage( $page->getTitle() );
1105 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
1106 "rollback did not revert to the correct revision" );
1107 $this->assertEquals( "one", $page->getContent()->getNativeData() );
1110 public static function provideGetAutosummary() {
1113 'Hello there, world!',
1114 '#REDIRECT [[Foo]]',
1116 '/^Redirected page .*Foo/'
1123 '/^Created page .*Hello/'
1127 'Hello there, world!',
1134 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
1135 eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
1136 voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
1137 clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
1140 '/^Replaced .*Hello/'
1153 * @dataProvider provideGetAutoSummary
1154 * @covers WikiPage::getAutosummary
1156 public function testGetAutosummary( $old, $new, $flags, $expected ) {
1157 $this->hideDeprecated( "WikiPage::getAutosummary" );
1159 $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
1161 $summary = $page->getAutosummary( $old, $new, $flags );
1163 $this->assertTrue( (bool)preg_match( $expected, $summary ),
1164 "Autosummary didn't match expected pattern $expected: $summary" );
1167 public static function provideGetAutoDeleteReason() {
1177 array( "first edit", null ),
1179 "/first edit.*only contributor/",
1185 array( "first edit", null ),
1186 array( "second edit", null ),
1188 "/second edit.*only contributor/",
1194 array( "first edit", "127.0.2.22" ),
1195 array( "second edit", "127.0.3.33" ),
1205 . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
1206 . " nonumy eirmod tempor invidunt ut labore et dolore magna "
1207 . "aliquyam erat, sed diam voluptua. At vero eos et accusam "
1208 . "et justo duo dolores et ea rebum. Stet clita kasd gubergren, "
1209 . "no sea takimata sanctus est Lorem ipsum dolor sit amet.'",
1213 '/first edit:.*\.\.\."/',
1219 array( "first edit", "127.0.2.22" ),
1220 array( "", "127.0.3.33" ),
1222 "/before blanking.*first edit/",
1230 * @dataProvider provideGetAutoDeleteReason
1231 * @covers WikiPage::getAutoDeleteReason
1233 public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
1236 // NOTE: assume Help namespace to contain wikitext
1237 $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" );
1241 foreach ( $edits as $edit ) {
1244 if ( !empty( $edit[1] ) ) {
1245 $user->setName( $edit[1] );
1250 $content = ContentHandler
::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() );
1252 $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW
: 0, false, $user );
1257 $reason = $page->getAutoDeleteReason( $hasHistory );
1259 if ( is_bool( $expectedResult ) ||
is_null( $expectedResult ) ) {
1260 $this->assertEquals( $expectedResult, $reason );
1262 $this->assertTrue( (bool)preg_match( $expectedResult, $reason ),
1263 "Autosummary didn't match expected pattern $expectedResult: $reason" );
1266 $this->assertEquals( $expectedHistory, $hasHistory,
1267 "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
1269 $page->doDeleteArticle( "done" );
1272 public static function providePreSaveTransform() {
1274 array( 'hello this is ~~~',
1275 "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
1277 array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
1278 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
1284 * @dataProvider providePreSaveTransform
1285 * @covers WikiPage::preSaveTransform
1287 public function testPreSaveTransform( $text, $expected ) {
1288 $this->hideDeprecated( 'WikiPage::preSaveTransform' );
1290 $user->setName( "127.0.0.1" );
1292 // NOTE: assume Help namespace to contain wikitext
1293 $page = $this->newPage( "Help:WikiPageTest_testPreloadTransform" );
1294 $text = $page->preSaveTransform( $text, $user );
1296 $this->assertEquals( $expected, $text );
1300 * @covers WikiPage::factory
1302 public function testWikiPageFactory() {
1303 $title = Title
::makeTitle( NS_FILE
, 'Someimage.png' );
1304 $page = WikiPage
::factory( $title );
1305 $this->assertEquals( 'WikiFilePage', get_class( $page ) );
1307 $title = Title
::makeTitle( NS_CATEGORY
, 'SomeCategory' );
1308 $page = WikiPage
::factory( $title );
1309 $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
1311 $title = Title
::makeTitle( NS_MAIN
, 'SomePage' );
1312 $page = WikiPage
::factory( $title );
1313 $this->assertEquals( 'WikiPage', get_class( $page ) );