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 ) {
59 * @param String $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( "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
101 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.",
102 $title, CONTENT_MODEL_WIKITEXT
);
104 $page->doEditContent( $content, "[[testing]] 1" );
106 $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
107 $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
108 $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
109 $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
111 $id = $page->getId();
113 # ------------------------
114 $dbr = wfGetDB( DB_SLAVE
);
115 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
116 $n = $res->numRows();
119 $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
121 # ------------------------
122 $page = new WikiPage( $title );
124 $retrieved = $page->getContent();
125 $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
127 # ------------------------
128 $content = ContentHandler
::makeContent( "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
129 . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.",
130 $title, CONTENT_MODEL_WIKITEXT
);
132 $page->doEditContent( $content, "testing 2" );
134 # ------------------------
135 $page = new WikiPage( $title );
137 $retrieved = $page->getContent();
138 $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
140 # ------------------------
141 $dbr = wfGetDB( DB_SLAVE
);
142 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
143 $n = $res->numRows();
146 $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
150 * @covers WikiPage::doEdit
152 public function testDoEdit() {
153 $this->hideDeprecated( "WikiPage::doEdit" );
154 $this->hideDeprecated( "WikiPage::getText" );
155 $this->hideDeprecated( "Revision::getText" );
157 //NOTE: assume help namespace will default to wikitext
158 $title = Title
::newFromText( "Help:WikiPageTest_testDoEdit" );
160 $page = $this->newPage( $title );
162 $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
163 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
165 $page->doEdit( $text, "[[testing]] 1" );
167 $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
168 $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
169 $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
170 $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
172 $id = $page->getId();
174 # ------------------------
175 $dbr = wfGetDB( DB_SLAVE
);
176 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
177 $n = $res->numRows();
180 $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
182 # ------------------------
183 $page = new WikiPage( $title );
185 $retrieved = $page->getText();
186 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
188 # ------------------------
189 $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
190 . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
192 $page->doEdit( $text, "testing 2" );
194 # ------------------------
195 $page = new WikiPage( $title );
197 $retrieved = $page->getText();
198 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
200 # ------------------------
201 $dbr = wfGetDB( DB_SLAVE
);
202 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
203 $n = $res->numRows();
206 $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
210 * @covers WikiPage::doQuickEdit
212 public function testDoQuickEdit() {
215 $this->hideDeprecated( "WikiPage::doQuickEdit" );
217 //NOTE: assume help namespace will default to wikitext
218 $page = $this->createPage( "Help:WikiPageTest_testDoQuickEdit", "original text" );
220 $text = "quick text";
221 $page->doQuickEdit( $text, $wgUser, "testing q" );
223 # ---------------------
224 $page = new WikiPage( $page->getTitle() );
225 $this->assertEquals( $text, $page->getText() );
229 * @covers WikiPage::doQuickEditContent
231 public function testDoQuickEditContent() {
234 $page = $this->createPage( "WikiPageTest_testDoQuickEditContent", "original text", CONTENT_MODEL_WIKITEXT
);
236 $content = ContentHandler
::makeContent( "quick text", $page->getTitle(), CONTENT_MODEL_WIKITEXT
);
237 $page->doQuickEditContent( $content, $wgUser, "testing q" );
239 # ---------------------
240 $page = new WikiPage( $page->getTitle() );
241 $this->assertTrue( $content->equals( $page->getContent() ) );
245 * @covers WikiPage::doDeleteArticle
247 public function testDoDeleteArticle() {
248 $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT
);
249 $id = $page->getId();
251 $page->doDeleteArticle( "testing deletion" );
253 $this->assertFalse( $page->getTitle()->getArticleID() > 0, "Title object should now have page id 0" );
254 $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" );
255 $this->assertFalse( $page->exists(), "WikiPage::exists should return false after page was deleted" );
256 $this->assertNull( $page->getContent(), "WikiPage::getContent should return null after page was deleted" );
257 $this->assertFalse( $page->getText(), "WikiPage::getText should return false after page was deleted" );
259 $t = Title
::newFromText( $page->getTitle()->getPrefixedText() );
260 $this->assertFalse( $t->exists(), "Title::exists should return false after page was deleted" );
262 # ------------------------
263 $dbr = wfGetDB( DB_SLAVE
);
264 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
265 $n = $res->numRows();
268 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
272 * @covers WikiPage::doDeleteUpdates
274 public function testDoDeleteUpdates() {
275 $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT
);
276 $id = $page->getId();
278 $page->doDeleteUpdates( $id );
280 # ------------------------
281 $dbr = wfGetDB( DB_SLAVE
);
282 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
283 $n = $res->numRows();
286 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
290 * @covers WikiPage::getRevision
292 public function testGetRevision() {
293 $page = $this->newPage( "WikiPageTest_testGetRevision" );
295 $rev = $page->getRevision();
296 $this->assertNull( $rev );
299 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
301 $rev = $page->getRevision();
303 $this->assertEquals( $page->getLatest(), $rev->getId() );
304 $this->assertEquals( "some text", $rev->getContent()->getNativeData() );
308 * @covers WikiPage::getContent
310 public function testGetContent() {
311 $page = $this->newPage( "WikiPageTest_testGetContent" );
313 $content = $page->getContent();
314 $this->assertNull( $content );
317 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
319 $content = $page->getContent();
320 $this->assertEquals( "some text", $content->getNativeData() );
324 * @covers WikiPage::getText
326 public function testGetText() {
327 $this->hideDeprecated( "WikiPage::getText" );
329 $page = $this->newPage( "WikiPageTest_testGetText" );
331 $text = $page->getText();
332 $this->assertFalse( $text );
335 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
337 $text = $page->getText();
338 $this->assertEquals( "some text", $text );
342 * @covers WikiPage::getRawText
344 public function testGetRawText() {
345 $this->hideDeprecated( "WikiPage::getRawText" );
347 $page = $this->newPage( "WikiPageTest_testGetRawText" );
349 $text = $page->getRawText();
350 $this->assertFalse( $text );
353 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
355 $text = $page->getRawText();
356 $this->assertEquals( "some text", $text );
360 * @covers WikiPage::getContentModel
362 public function testGetContentModel() {
363 global $wgContentHandlerUseDB;
365 if ( !$wgContentHandlerUseDB ) {
366 $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
369 $page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT
);
371 $page = new WikiPage( $page->getTitle() );
372 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT
, $page->getContentModel() );
376 * @covers WikiPage::getContentHandler
378 public function testGetContentHandler() {
379 global $wgContentHandlerUseDB;
381 if ( !$wgContentHandlerUseDB ) {
382 $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
385 $page = $this->createPage( "WikiPageTest_testGetContentHandler", "some text", CONTENT_MODEL_JAVASCRIPT
);
387 $page = new WikiPage( $page->getTitle() );
388 $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
392 * @covers WikiPage::exists
394 public function testExists() {
395 $page = $this->newPage( "WikiPageTest_testExists" );
396 $this->assertFalse( $page->exists() );
399 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
400 $this->assertTrue( $page->exists() );
402 $page = new WikiPage( $page->getTitle() );
403 $this->assertTrue( $page->exists() );
406 $page->doDeleteArticle( "done testing" );
407 $this->assertFalse( $page->exists() );
409 $page = new WikiPage( $page->getTitle() );
410 $this->assertFalse( $page->exists() );
413 public static function provideHasViewableContent() {
415 array( 'WikiPageTest_testHasViewableContent', false, true ),
416 array( 'Special:WikiPageTest_testHasViewableContent', false ),
417 array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ),
418 array( 'Special:Userlogin', true ),
419 array( 'MediaWiki:help', true ),
424 * @dataProvider provideHasViewableContent
425 * @covers WikiPage::hasViewableContent
427 public function testHasViewableContent( $title, $viewable, $create = false ) {
428 $page = $this->newPage( $title );
429 $this->assertEquals( $viewable, $page->hasViewableContent() );
432 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
433 $this->assertTrue( $page->hasViewableContent() );
435 $page = new WikiPage( $page->getTitle() );
436 $this->assertTrue( $page->hasViewableContent() );
440 public static function provideGetRedirectTarget() {
442 array( 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT
, "hello world", null ),
443 array( 'WikiPageTest_testGetRedirectTarget_2', CONTENT_MODEL_WIKITEXT
, "#REDIRECT [[hello world]]", "Hello world" ),
448 * @dataProvider provideGetRedirectTarget
449 * @covers WikiPage::getRedirectTarget
451 public function testGetRedirectTarget( $title, $model, $text, $target ) {
452 $page = $this->createPage( $title, $text, $model );
454 # sanity check, because this test seems to fail for no reason for some people.
455 $c = $page->getContent();
456 $this->assertEquals( 'WikitextContent', get_class( $c ) );
458 # now, test the actual redirect
459 $t = $page->getRedirectTarget();
460 $this->assertEquals( $target, is_null( $t ) ?
null : $t->getPrefixedText() );
464 * @dataProvider provideGetRedirectTarget
465 * @covers WikiPage::isRedirect
467 public function testIsRedirect( $title, $model, $text, $target ) {
468 $page = $this->createPage( $title, $text, $model );
469 $this->assertEquals( !is_null( $target ), $page->isRedirect() );
472 public static function provideIsCountable() {
476 array( 'WikiPageTest_testIsCountable',
477 CONTENT_MODEL_WIKITEXT
,
482 array( 'WikiPageTest_testIsCountable',
483 CONTENT_MODEL_WIKITEXT
,
490 array( 'WikiPageTest_testIsCountable',
491 CONTENT_MODEL_WIKITEXT
,
496 array( 'WikiPageTest_testIsCountable',
497 CONTENT_MODEL_WIKITEXT
,
504 array( 'WikiPageTest_testIsCountable',
505 CONTENT_MODEL_WIKITEXT
,
510 array( 'WikiPageTest_testIsCountable',
511 CONTENT_MODEL_WIKITEXT
,
518 array( 'WikiPageTest_testIsCountable',
519 CONTENT_MODEL_WIKITEXT
,
524 array( 'WikiPageTest_testIsCountable',
525 CONTENT_MODEL_WIKITEXT
,
530 array( 'WikiPageTest_testIsCountable',
531 CONTENT_MODEL_WIKITEXT
,
537 // not a content namespace
538 array( 'Talk:WikiPageTest_testIsCountable',
539 CONTENT_MODEL_WIKITEXT
,
544 array( 'Talk:WikiPageTest_testIsCountable',
545 CONTENT_MODEL_WIKITEXT
,
550 array( 'Talk:WikiPageTest_testIsCountable',
551 CONTENT_MODEL_WIKITEXT
,
557 // not a content namespace, different model
558 array( 'MediaWiki:WikiPageTest_testIsCountable.js',
564 array( 'MediaWiki:WikiPageTest_testIsCountable.js',
570 array( 'MediaWiki:WikiPageTest_testIsCountable.js',
580 * @dataProvider provideIsCountable
581 * @covers WikiPage::isCountable
583 public function testIsCountable( $title, $model, $text, $mode, $expected ) {
584 global $wgContentHandlerUseDB;
586 $this->setMwGlobals( 'wgArticleCountMethod', $mode );
588 $title = Title
::newFromText( $title );
590 if ( !$wgContentHandlerUseDB && $model && ContentHandler
::getDefaultModelFor( $title ) != $model ) {
591 $this->markTestSkipped( "Can not use non-default content model $model for "
592 . $title->getPrefixedDBkey() . " with \$wgContentHandlerUseDB disabled." );
595 $page = $this->createPage( $title, $text, $model );
596 $hasLinks = wfGetDB( DB_SLAVE
)->selectField( 'pagelinks', 1,
597 array( 'pl_from' => $page->getId() ), __METHOD__
);
599 $editInfo = $page->prepareContentForEdit( $page->getContent() );
601 $v = $page->isCountable();
602 $w = $page->isCountable( $editInfo );
604 $this->assertEquals( $expected, $v, "isCountable( null ) returned unexpected value " . var_export( $v, true )
605 . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
607 $this->assertEquals( $expected, $w, "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
608 . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
611 public static function provideGetParserOutput() {
613 array( CONTENT_MODEL_WIKITEXT
, "hello ''world''\n", "<p>hello <i>world</i></p>" ),
619 * @dataProvider provideGetParserOutput
620 * @covers WikiPage::getParserOutput
622 public function testGetParserOutput( $model, $text, $expectedHtml ) {
623 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model );
625 $opt = $page->makeParserOptions( 'canonical' );
626 $po = $page->getParserOutput( $opt );
627 $text = $po->getText();
629 $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
630 $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
632 $this->assertEquals( $expectedHtml, $text );
638 * @covers WikiPage::getParserOutput
640 public function testGetParserOutput_nonexisting() {
644 $page = new WikiPage( new Title( "WikiPageTest_testGetParserOutput_nonexisting_$count" ) );
646 $opt = new ParserOptions();
647 $po = $page->getParserOutput( $opt );
649 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." );
653 * @covers WikiPage::getParserOutput
655 public function testGetParserOutput_badrev() {
656 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT
);
658 $opt = new ParserOptions();
659 $po = $page->getParserOutput( $opt, $page->getLatest() +
1234 );
661 // @todo would be neat to also test deleted revision
663 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
680 public function dataReplaceSection() {
681 //NOTE: assume the Help namespace to contain wikitext
683 array( 'Help:WikiPageTest_testReplaceSection',
684 CONTENT_MODEL_WIKITEXT
,
685 WikiPageTest
::$sections,
689 trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest
::$sections ) )
691 array( 'Help:WikiPageTest_testReplaceSection',
692 CONTENT_MODEL_WIKITEXT
,
693 WikiPageTest
::$sections,
699 array( 'Help:WikiPageTest_testReplaceSection',
700 CONTENT_MODEL_WIKITEXT
,
701 WikiPageTest
::$sections,
703 "== TEST ==\nmore fun",
705 trim( preg_replace( '/^== test ==.*== foo ==/sm',
706 "== TEST ==\nmore fun\n\n== foo ==",
707 WikiPageTest
::$sections ) )
709 array( 'Help:WikiPageTest_testReplaceSection',
710 CONTENT_MODEL_WIKITEXT
,
711 WikiPageTest
::$sections,
715 trim( WikiPageTest
::$sections )
717 array( 'Help:WikiPageTest_testReplaceSection',
718 CONTENT_MODEL_WIKITEXT
,
719 WikiPageTest
::$sections,
723 trim( WikiPageTest
::$sections ) . "\n\n== New ==\n\nNo more"
729 * @dataProvider dataReplaceSection
730 * @covers WikiPage::replaceSection
732 public function testReplaceSection( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
733 $this->hideDeprecated( "WikiPage::replaceSection" );
735 $page = $this->createPage( $title, $text, $model );
736 $text = $page->replaceSection( $section, $with, $sectionTitle );
737 $text = trim( $text );
739 $this->assertEquals( $expected, $text );
743 * @dataProvider dataReplaceSection
744 * @covers WikiPage::replaceSectionContent
746 public function testReplaceSectionContent( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
747 $page = $this->createPage( $title, $text, $model );
749 $content = ContentHandler
::makeContent( $with, $page->getTitle(), $page->getContentModel() );
750 $c = $page->replaceSectionContent( $section, $content, $sectionTitle );
752 $this->assertEquals( $expected, is_null( $c ) ?
null : trim( $c->getNativeData() ) );
755 /* @todo FIXME: fix this!
756 public function testGetUndoText() {
757 $this->checkHasDiff3();
760 $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
761 $rev1 = $page->getRevision();
764 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section two");
765 $rev2 = $page->getRevision();
767 $text .= "\n\nthree";
768 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section three");
769 $rev3 = $page->getRevision();
772 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section four");
773 $rev4 = $page->getRevision();
776 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section five");
777 $rev5 = $page->getRevision();
780 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section six");
781 $rev6 = $page->getRevision();
783 $undo6 = $page->getUndoText( $rev6 );
784 if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" );
785 $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 );
787 $undo3 = $page->getUndoText( $rev4, $rev2 );
788 if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" );
789 $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 );
791 $undo2 = $page->getUndoText( $rev2 );
792 if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" );
793 $this->assertEquals( "one\n\nfive", $undo2 );
798 * @todo FIXME: this is a better rollback test than the one below, but it keeps failing in jenkins for some reason.
800 public function broken_testDoRollback() {
802 $admin->setName( "Admin" );
805 $page = $this->newPage( "WikiPageTest_testDoRollback" );
806 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
807 "section one", EDIT_NEW
, false, $admin );
810 $user1->setName( "127.0.1.11" );
812 $page = new WikiPage( $page->getTitle() );
813 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
814 "adding section two", 0, false, $user1 );
817 $user2->setName( "127.0.2.13" );
818 $text .= "\n\nthree";
819 $page = new WikiPage( $page->getTitle() );
820 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
821 "adding section three", 0, false, $user2 );
823 # we are having issues with doRollback spuriously failing. apparently the last revision somehow goes missing
824 # or not committed under some circumstances. so, make sure the last revision has the right user name.
825 $dbr = wfGetDB( DB_SLAVE
);
826 $this->assertEquals( 3, Revision
::countByPageId( $dbr, $page->getId() ) );
828 $page = new WikiPage( $page->getTitle() );
829 $rev3 = $page->getRevision();
830 $this->assertEquals( '127.0.2.13', $rev3->getUserText() );
832 $rev2 = $rev3->getPrevious();
833 $this->assertEquals( '127.0.1.11', $rev2->getUserText() );
835 $rev1 = $rev2->getPrevious();
836 $this->assertEquals( 'Admin', $rev1->getUserText() );
838 # now, try the actual rollback
839 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
840 $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user2->getName() ), null );
841 $errors = $page->doRollback( $user2->getName(), "testing revert", $token, false, $details, $admin );
844 $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
847 $page = new WikiPage( $page->getTitle() );
848 $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(),
849 "rollback did not revert to the correct revision" );
850 $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() );
854 * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
855 * @covers WikiPage::doRollback
857 public function testDoRollback() {
859 $admin->setName( "Admin" );
862 $page = $this->newPage( "WikiPageTest_testDoRollback" );
863 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
864 "section one", EDIT_NEW
, false, $admin );
865 $rev1 = $page->getRevision();
868 $user1->setName( "127.0.1.11" );
870 $page = new WikiPage( $page->getTitle() );
871 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
872 "adding section two", 0, false, $user1 );
874 # now, try the rollback
875 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
876 $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
877 $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $details, $admin );
880 $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
883 $page = new WikiPage( $page->getTitle() );
884 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
885 "rollback did not revert to the correct revision" );
886 $this->assertEquals( "one", $page->getContent()->getNativeData() );
890 * @covers WikiPage::doRollback
892 public function testDoRollbackFailureSameContent() {
894 $admin->setName( "Admin" );
895 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
898 $page = $this->newPage( "WikiPageTest_testDoRollback" );
899 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
900 "section one", EDIT_NEW
, false, $admin );
901 $rev1 = $page->getRevision();
904 $user1->setName( "127.0.1.11" );
905 $user1->addGroup( "sysop" ); #XXX: make the test user a sysop...
907 $page = new WikiPage( $page->getTitle() );
908 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
909 "adding section two", 0, false, $user1 );
911 # now, do a the rollback from the same user was doing the edit before
912 $resultDetails = array();
913 $token = $user1->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
914 $errors = $page->doRollback( $user1->getName(), "testing revert same user", $token, false, $resultDetails, $admin );
916 $this->assertEquals( array(), $errors, "Rollback failed same user" );
918 # now, try the rollback
919 $resultDetails = array();
920 $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
921 $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $resultDetails, $admin );
923 $this->assertEquals( array( array( 'alreadyrolled', 'WikiPageTest testDoRollback',
924 '127.0.1.11', 'Admin' ) ), $errors, "Rollback not failed" );
926 $page = new WikiPage( $page->getTitle() );
927 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
928 "rollback did not revert to the correct revision" );
929 $this->assertEquals( "one", $page->getContent()->getNativeData() );
932 public static function provideGetAutosummary() {
935 'Hello there, world!',
938 '/^Redirected page .*Foo/'
945 '/^Created page .*Hello/'
949 'Hello there, world!',
956 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
957 labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et
958 ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
961 '/^Replaced .*Hello/'
974 * @dataProvider provideGetAutoSummary
975 * @covers WikiPage::getAutosummary
977 public function testGetAutosummary( $old, $new, $flags, $expected ) {
978 $this->hideDeprecated( "WikiPage::getAutosummary" );
980 $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
982 $summary = $page->getAutosummary( $old, $new, $flags );
984 $this->assertTrue( (bool)preg_match( $expected, $summary ),
985 "Autosummary didn't match expected pattern $expected: $summary" );
988 public static function provideGetAutoDeleteReason() {
998 array( "first edit", null ),
1000 "/first edit.*only contributor/",
1006 array( "first edit", null ),
1007 array( "second edit", null ),
1009 "/second edit.*only contributor/",
1015 array( "first edit", "127.0.2.22" ),
1016 array( "second edit", "127.0.3.33" ),
1024 array( "first edit: "
1025 . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
1026 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. "
1027 . "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea "
1028 . "takimata sanctus est Lorem ipsum dolor sit amet.'", null ),
1030 '/first edit:.*\.\.\."/',
1036 array( "first edit", "127.0.2.22" ),
1037 array( "", "127.0.3.33" ),
1039 "/before blanking.*first edit/",
1047 * @dataProvider provideGetAutoDeleteReason
1048 * @covers WikiPage::getAutoDeleteReason
1050 public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
1053 //NOTE: assume Help namespace to contain wikitext
1054 $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" );
1058 foreach ( $edits as $edit ) {
1061 if ( !empty( $edit[1] ) ) {
1062 $user->setName( $edit[1] );
1067 $content = ContentHandler
::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() );
1069 $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW
: 0, false, $user );
1074 $reason = $page->getAutoDeleteReason( $hasHistory );
1076 if ( is_bool( $expectedResult ) ||
is_null( $expectedResult ) ) {
1077 $this->assertEquals( $expectedResult, $reason );
1079 $this->assertTrue( (bool)preg_match( $expectedResult, $reason ),
1080 "Autosummary didn't match expected pattern $expectedResult: $reason" );
1083 $this->assertEquals( $expectedHistory, $hasHistory,
1084 "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
1086 $page->doDeleteArticle( "done" );
1089 public static function providePreSaveTransform() {
1091 array( 'hello this is ~~~',
1092 "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
1094 array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
1095 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
1101 * @dataProvider providePreSaveTransform
1102 * @covers WikiPage::preSaveTransform
1104 public function testPreSaveTransform( $text, $expected ) {
1105 $this->hideDeprecated( 'WikiPage::preSaveTransform' );
1107 $user->setName( "127.0.0.1" );
1109 //NOTE: assume Help namespace to contain wikitext
1110 $page = $this->newPage( "Help:WikiPageTest_testPreloadTransform" );
1111 $text = $page->preSaveTransform( $text, $user );
1113 $this->assertEquals( $expected, $text );
1117 * @covers WikiPage::factory
1119 public function testWikiPageFactory() {
1120 $title = Title
::makeTitle( NS_FILE
, 'Someimage.png' );
1121 $page = WikiPage
::factory( $title );
1122 $this->assertEquals( 'WikiFilePage', get_class( $page ) );
1124 $title = Title
::makeTitle( NS_CATEGORY
, 'SomeCategory' );
1125 $page = WikiPage
::factory( $title );
1126 $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
1128 $title = Title
::makeTitle( NS_MAIN
, 'SomePage' );
1129 $page = WikiPage
::factory( $title );
1130 $this->assertEquals( 'WikiPage', get_class( $page ) );