3 * @group ContentHandler
5 * ^--- important, causes temporary tables to be used instead of the real database
8 class WikiPageTest
extends MediaWikiLangTestCase
{
12 function __construct( $name = null, array $data = array(), $dataName = '' ) {
13 parent
::__construct( $name, $data, $dataName );
15 $this->tablesUsed
= array_merge (
34 protected function setUp() {
36 $this->pages_to_delete
= array();
38 LinkCache
::singleton()->clear(); # avoid cached redirect status, etc
41 protected function tearDown() {
42 foreach ( $this->pages_to_delete
as $p ) {
43 /* @var $p WikiPage */
47 $p->doDeleteArticle( "testing done." );
49 } catch ( MWException
$ex ) {
58 * @param String $model
61 protected function newPage( $title, $model = null ) {
62 if ( is_string( $title ) ) {
63 $title = Title
::newFromText( $title );
66 $p = new WikiPage( $title );
68 $this->pages_to_delete
[] = $p;
75 * @param String|Title|WikiPage $page
81 protected function createPage( $page, $text, $model = null ) {
82 if ( is_string( $page ) ) {
83 $page = Title
::newFromText( $page );
86 if ( $page instanceof Title
) {
87 $page = $this->newPage( $page, $model );
90 $content = ContentHandler
::makeContent( $text, $page->getTitle(), $model );
91 $page->doEditContent( $content, "testing", EDIT_NEW
);
96 public function testDoEditContent() {
97 $title = Title
::newFromText( "WikiPageTest_testDoEditContent" );
99 $page = $this->newPage( $title );
101 $content = ContentHandler
::makeContent( "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
102 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.",
103 $title, CONTENT_MODEL_WIKITEXT
);
105 $page->doEditContent( $content, "[[testing]] 1" );
107 $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
108 $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
109 $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
110 $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
112 $id = $page->getId();
114 # ------------------------
115 $dbr = wfGetDB( DB_SLAVE
);
116 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
117 $n = $res->numRows();
120 $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
122 # ------------------------
123 $page = new WikiPage( $title );
125 $retrieved = $page->getContent();
126 $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
128 # ------------------------
129 $content = ContentHandler
::makeContent( "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
130 . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.",
131 $title, CONTENT_MODEL_WIKITEXT
);
133 $page->doEditContent( $content, "testing 2" );
135 # ------------------------
136 $page = new WikiPage( $title );
138 $retrieved = $page->getContent();
139 $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
141 # ------------------------
142 $dbr = wfGetDB( DB_SLAVE
);
143 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
144 $n = $res->numRows();
147 $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
150 public function testDoEdit() {
151 $this->hideDeprecated( "WikiPage::doEdit" );
152 $this->hideDeprecated( "WikiPage::getText" );
153 $this->hideDeprecated( "Revision::getText" );
155 //NOTE: assume help namespace will default to wikitext
156 $title = Title
::newFromText( "Help:WikiPageTest_testDoEdit" );
158 $page = $this->newPage( $title );
160 $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
161 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
163 $page->doEdit( $text, "[[testing]] 1" );
165 $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
166 $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
167 $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
168 $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
170 $id = $page->getId();
172 # ------------------------
173 $dbr = wfGetDB( DB_SLAVE
);
174 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
175 $n = $res->numRows();
178 $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
180 # ------------------------
181 $page = new WikiPage( $title );
183 $retrieved = $page->getText();
184 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
186 # ------------------------
187 $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
188 . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
190 $page->doEdit( $text, "testing 2" );
192 # ------------------------
193 $page = new WikiPage( $title );
195 $retrieved = $page->getText();
196 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
198 # ------------------------
199 $dbr = wfGetDB( DB_SLAVE
);
200 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
201 $n = $res->numRows();
204 $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
207 public function testDoQuickEdit() {
210 $this->hideDeprecated( "WikiPage::doQuickEdit" );
212 //NOTE: assume help namespace will default to wikitext
213 $page = $this->createPage( "Help:WikiPageTest_testDoQuickEdit", "original text" );
215 $text = "quick text";
216 $page->doQuickEdit( $text, $wgUser, "testing q" );
218 # ---------------------
219 $page = new WikiPage( $page->getTitle() );
220 $this->assertEquals( $text, $page->getText() );
223 public function testDoQuickEditContent() {
226 $page = $this->createPage( "WikiPageTest_testDoQuickEditContent", "original text", CONTENT_MODEL_WIKITEXT
);
228 $content = ContentHandler
::makeContent( "quick text", $page->getTitle(), CONTENT_MODEL_WIKITEXT
);
229 $page->doQuickEditContent( $content, $wgUser, "testing q" );
231 # ---------------------
232 $page = new WikiPage( $page->getTitle() );
233 $this->assertTrue( $content->equals( $page->getContent() ) );
236 public function testDoDeleteArticle() {
237 $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT
);
238 $id = $page->getId();
240 $page->doDeleteArticle( "testing deletion" );
242 $this->assertFalse( $page->getTitle()->getArticleID() > 0, "Title object should now have page id 0" );
243 $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" );
244 $this->assertFalse( $page->exists(), "WikiPage::exists should return false after page was deleted" );
245 $this->assertNull( $page->getContent(), "WikiPage::getContent should return null after page was deleted" );
246 $this->assertFalse( $page->getText(), "WikiPage::getText should return false after page was deleted" );
248 $t = Title
::newFromText( $page->getTitle()->getPrefixedText() );
249 $this->assertFalse( $t->exists(), "Title::exists should return false after page was deleted" );
251 # ------------------------
252 $dbr = wfGetDB( DB_SLAVE
);
253 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
254 $n = $res->numRows();
257 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
260 public function testDoDeleteUpdates() {
261 $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT
);
262 $id = $page->getId();
264 $page->doDeleteUpdates( $id );
266 # ------------------------
267 $dbr = wfGetDB( DB_SLAVE
);
268 $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
269 $n = $res->numRows();
272 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
275 public function testGetRevision() {
276 $page = $this->newPage( "WikiPageTest_testGetRevision" );
278 $rev = $page->getRevision();
279 $this->assertNull( $rev );
282 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
284 $rev = $page->getRevision();
286 $this->assertEquals( $page->getLatest(), $rev->getId() );
287 $this->assertEquals( "some text", $rev->getContent()->getNativeData() );
290 public function testGetContent() {
291 $page = $this->newPage( "WikiPageTest_testGetContent" );
293 $content = $page->getContent();
294 $this->assertNull( $content );
297 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
299 $content = $page->getContent();
300 $this->assertEquals( "some text", $content->getNativeData() );
303 public function testGetText() {
304 $this->hideDeprecated( "WikiPage::getText" );
306 $page = $this->newPage( "WikiPageTest_testGetText" );
308 $text = $page->getText();
309 $this->assertFalse( $text );
312 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
314 $text = $page->getText();
315 $this->assertEquals( "some text", $text );
318 public function testGetRawText() {
319 $this->hideDeprecated( "WikiPage::getRawText" );
321 $page = $this->newPage( "WikiPageTest_testGetRawText" );
323 $text = $page->getRawText();
324 $this->assertFalse( $text );
327 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
329 $text = $page->getRawText();
330 $this->assertEquals( "some text", $text );
333 public function testGetContentModel() {
334 global $wgContentHandlerUseDB;
336 if ( !$wgContentHandlerUseDB ) {
337 $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
340 $page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT
);
342 $page = new WikiPage( $page->getTitle() );
343 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT
, $page->getContentModel() );
346 public function testGetContentHandler() {
347 global $wgContentHandlerUseDB;
349 if ( !$wgContentHandlerUseDB ) {
350 $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
353 $page = $this->createPage( "WikiPageTest_testGetContentHandler", "some text", CONTENT_MODEL_JAVASCRIPT
);
355 $page = new WikiPage( $page->getTitle() );
356 $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
359 public function testExists() {
360 $page = $this->newPage( "WikiPageTest_testExists" );
361 $this->assertFalse( $page->exists() );
364 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
365 $this->assertTrue( $page->exists() );
367 $page = new WikiPage( $page->getTitle() );
368 $this->assertTrue( $page->exists() );
371 $page->doDeleteArticle( "done testing" );
372 $this->assertFalse( $page->exists() );
374 $page = new WikiPage( $page->getTitle() );
375 $this->assertFalse( $page->exists() );
378 public static function provideHasViewableContent() {
380 array( 'WikiPageTest_testHasViewableContent', false, true ),
381 array( 'Special:WikiPageTest_testHasViewableContent', false ),
382 array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ),
383 array( 'Special:Userlogin', true ),
384 array( 'MediaWiki:help', true ),
389 * @dataProvider provideHasViewableContent
391 public function testHasViewableContent( $title, $viewable, $create = false ) {
392 $page = $this->newPage( $title );
393 $this->assertEquals( $viewable, $page->hasViewableContent() );
396 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
397 $this->assertTrue( $page->hasViewableContent() );
399 $page = new WikiPage( $page->getTitle() );
400 $this->assertTrue( $page->hasViewableContent() );
404 public static function provideGetRedirectTarget() {
406 array( 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT
, "hello world", null ),
407 array( 'WikiPageTest_testGetRedirectTarget_2', CONTENT_MODEL_WIKITEXT
, "#REDIRECT [[hello world]]", "Hello world" ),
412 * @dataProvider provideGetRedirectTarget
414 public function testGetRedirectTarget( $title, $model, $text, $target ) {
415 $page = $this->createPage( $title, $text, $model );
417 # sanity check, because this test seems to fail for no reason for some people.
418 $c = $page->getContent();
419 $this->assertEquals( 'WikitextContent', get_class( $c ) );
421 # now, test the actual redirect
422 $t = $page->getRedirectTarget();
423 $this->assertEquals( $target, is_null( $t ) ?
null : $t->getPrefixedText() );
427 * @dataProvider provideGetRedirectTarget
429 public function testIsRedirect( $title, $model, $text, $target ) {
430 $page = $this->createPage( $title, $text, $model );
431 $this->assertEquals( !is_null( $target ), $page->isRedirect() );
434 public static function provideIsCountable() {
438 array( 'WikiPageTest_testIsCountable',
439 CONTENT_MODEL_WIKITEXT
,
444 array( 'WikiPageTest_testIsCountable',
445 CONTENT_MODEL_WIKITEXT
,
452 array( 'WikiPageTest_testIsCountable',
453 CONTENT_MODEL_WIKITEXT
,
458 array( 'WikiPageTest_testIsCountable',
459 CONTENT_MODEL_WIKITEXT
,
466 array( 'WikiPageTest_testIsCountable',
467 CONTENT_MODEL_WIKITEXT
,
472 array( 'WikiPageTest_testIsCountable',
473 CONTENT_MODEL_WIKITEXT
,
480 array( 'WikiPageTest_testIsCountable',
481 CONTENT_MODEL_WIKITEXT
,
486 array( 'WikiPageTest_testIsCountable',
487 CONTENT_MODEL_WIKITEXT
,
492 array( 'WikiPageTest_testIsCountable',
493 CONTENT_MODEL_WIKITEXT
,
499 // not a content namespace
500 array( 'Talk:WikiPageTest_testIsCountable',
501 CONTENT_MODEL_WIKITEXT
,
506 array( 'Talk:WikiPageTest_testIsCountable',
507 CONTENT_MODEL_WIKITEXT
,
512 array( 'Talk:WikiPageTest_testIsCountable',
513 CONTENT_MODEL_WIKITEXT
,
519 // not a content namespace, different model
520 array( 'MediaWiki:WikiPageTest_testIsCountable.js',
526 array( 'MediaWiki:WikiPageTest_testIsCountable.js',
532 array( 'MediaWiki:WikiPageTest_testIsCountable.js',
543 * @dataProvider provideIsCountable
545 public function testIsCountable( $title, $model, $text, $mode, $expected ) {
546 global $wgArticleCountMethod;
548 $oldArticleCountMethod = $wgArticleCountMethod;
549 $wgArticleCountMethod = $mode;
551 $page = $this->createPage( $title, $text, $model );
552 $hasLinks = wfGetDB( DB_SLAVE
)->selectField( 'pagelinks', 1,
553 array( 'pl_from' => $page->getId() ), __METHOD__
);
555 $editInfo = $page->prepareContentForEdit( $page->getContent() );
557 $v = $page->isCountable();
558 $w = $page->isCountable( $editInfo );
560 $wgArticleCountMethod = $oldArticleCountMethod;
562 $this->assertEquals( $expected, $v, "isCountable( null ) returned unexpected value " . var_export( $v, true )
563 . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
565 $this->assertEquals( $expected, $w, "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
566 . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
569 public static function provideGetParserOutput() {
571 array( CONTENT_MODEL_WIKITEXT
, "hello ''world''\n", "<p>hello <i>world</i></p>"),
577 * @dataProvider provideGetParserOutput
579 public function testGetParserOutput( $model, $text, $expectedHtml ) {
580 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model );
582 $opt = new ParserOptions();
583 $po = $page->getParserOutput( $opt );
584 $text = $po->getText();
586 $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
587 $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
589 $this->assertEquals( $expectedHtml, $text );
608 public function dataReplaceSection() {
609 //NOTE: assume the Help namespace to contain wikitext
611 array( 'Help:WikiPageTest_testReplaceSection',
612 CONTENT_MODEL_WIKITEXT
,
613 WikiPageTest
::$sections,
617 trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest
::$sections ) )
619 array( 'Help:WikiPageTest_testReplaceSection',
620 CONTENT_MODEL_WIKITEXT
,
621 WikiPageTest
::$sections,
627 array( 'Help:WikiPageTest_testReplaceSection',
628 CONTENT_MODEL_WIKITEXT
,
629 WikiPageTest
::$sections,
631 "== TEST ==\nmore fun",
633 trim( preg_replace( '/^== test ==.*== foo ==/sm',
634 "== TEST ==\nmore fun\n\n== foo ==",
635 WikiPageTest
::$sections ) )
637 array( 'Help:WikiPageTest_testReplaceSection',
638 CONTENT_MODEL_WIKITEXT
,
639 WikiPageTest
::$sections,
643 trim( WikiPageTest
::$sections )
645 array( 'Help:WikiPageTest_testReplaceSection',
646 CONTENT_MODEL_WIKITEXT
,
647 WikiPageTest
::$sections,
651 trim( WikiPageTest
::$sections ) . "\n\n== New ==\n\nNo more"
657 * @dataProvider dataReplaceSection
659 public function testReplaceSection( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
660 $this->hideDeprecated( "WikiPage::replaceSection" );
662 $page = $this->createPage( $title, $text, $model );
663 $text = $page->replaceSection( $section, $with, $sectionTitle );
664 $text = trim( $text );
666 $this->assertEquals( $expected, $text );
670 * @dataProvider dataReplaceSection
672 public function testReplaceSectionContent( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
673 $page = $this->createPage( $title, $text, $model );
675 $content = ContentHandler
::makeContent( $with, $page->getTitle(), $page->getContentModel() );
676 $c = $page->replaceSectionContent( $section, $content, $sectionTitle );
678 $this->assertEquals( $expected, is_null( $c ) ?
null : trim( $c->getNativeData() ) );
681 /* @todo FIXME: fix this!
682 public function testGetUndoText() {
685 wfSuppressWarnings();
686 $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
690 $this->markTestSkipped( "diff3 not installed or not found" );
695 $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
696 $rev1 = $page->getRevision();
699 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section two");
700 $rev2 = $page->getRevision();
702 $text .= "\n\nthree";
703 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section three");
704 $rev3 = $page->getRevision();
707 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section four");
708 $rev4 = $page->getRevision();
711 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section five");
712 $rev5 = $page->getRevision();
715 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section six");
716 $rev6 = $page->getRevision();
718 $undo6 = $page->getUndoText( $rev6 );
719 if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" );
720 $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 );
722 $undo3 = $page->getUndoText( $rev4, $rev2 );
723 if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" );
724 $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 );
726 $undo2 = $page->getUndoText( $rev2 );
727 if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" );
728 $this->assertEquals( "one\n\nfive", $undo2 );
733 * @todo FIXME: this is a better rollback test than the one below, but it keeps failing in jenkins for some reason.
735 public function broken_testDoRollback() {
737 $admin->setName("Admin");
740 $page = $this->newPage( "WikiPageTest_testDoRollback" );
741 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
742 "section one", EDIT_NEW
, false, $admin );
745 $user1->setName( "127.0.1.11" );
747 $page = new WikiPage( $page->getTitle() );
748 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
749 "adding section two", 0, false, $user1 );
752 $user2->setName( "127.0.2.13" );
753 $text .= "\n\nthree";
754 $page = new WikiPage( $page->getTitle() );
755 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
756 "adding section three", 0, false, $user2 );
758 # we are having issues with doRollback spuriously failing. apparently the last revision somehow goes missing
759 # or not committed under some circumstances. so, make sure the last revision has the right user name.
760 $dbr = wfGetDB( DB_SLAVE
);
761 $this->assertEquals( 3, Revision
::countByPageId( $dbr, $page->getId() ) );
763 $page = new WikiPage( $page->getTitle() );
764 $rev3 = $page->getRevision();
765 $this->assertEquals( '127.0.2.13', $rev3->getUserText() );
767 $rev2 = $rev3->getPrevious();
768 $this->assertEquals( '127.0.1.11', $rev2->getUserText() );
770 $rev1 = $rev2->getPrevious();
771 $this->assertEquals( 'Admin', $rev1->getUserText() );
773 # now, try the actual rollback
774 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
775 $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user2->getName() ), null );
776 $errors = $page->doRollback( $user2->getName(), "testing revert", $token, false, $details, $admin );
779 $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
782 $page = new WikiPage( $page->getTitle() );
783 $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(),
784 "rollback did not revert to the correct revision" );
785 $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() );
789 * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
791 public function testDoRollback() {
793 $admin->setName("Admin");
796 $page = $this->newPage( "WikiPageTest_testDoRollback" );
797 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
798 "section one", EDIT_NEW
, false, $admin );
799 $rev1 = $page->getRevision();
802 $user1->setName( "127.0.1.11" );
804 $page = new WikiPage( $page->getTitle() );
805 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
806 "adding section two", 0, false, $user1 );
808 # now, try the rollback
809 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
810 $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
811 $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $details, $admin );
814 $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
817 $page = new WikiPage( $page->getTitle() );
818 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
819 "rollback did not revert to the correct revision" );
820 $this->assertEquals( "one", $page->getContent()->getNativeData() );
823 public static function provideGetAutosummary( ) {
826 'Hello there, world!',
829 '/^Redirected page .*Foo/'
836 '/^Created page .*Hello/'
840 'Hello there, world!',
847 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
848 labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et
849 ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
852 '/^Replaced .*Hello/'
865 * @dataProvider provideGetAutoSummary
867 public function testGetAutosummary( $old, $new, $flags, $expected ) {
868 $this->hideDeprecated( "WikiPage::getAutosummary" );
870 $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
872 $summary = $page->getAutosummary( $old, $new, $flags );
874 $this->assertTrue( (bool)preg_match( $expected, $summary ),
875 "Autosummary didn't match expected pattern $expected: $summary" );
878 public static function provideGetAutoDeleteReason( ) {
888 array( "first edit", null ),
890 "/first edit.*only contributor/",
896 array( "first edit", null ),
897 array( "second edit", null ),
899 "/second edit.*only contributor/",
905 array( "first edit", "127.0.2.22" ),
906 array( "second edit", "127.0.3.33" ),
914 array( "first edit: "
915 . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
916 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. "
917 . "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea "
918 . "takimata sanctus est Lorem ipsum dolor sit amet.'", null ),
920 '/first edit:.*\.\.\."/',
926 array( "first edit", "127.0.2.22" ),
927 array( "", "127.0.3.33" ),
929 "/before blanking.*first edit/",
937 * @dataProvider provideGetAutoDeleteReason
939 public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
942 //NOTE: assume Help namespace to contain wikitext
943 $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" );
947 foreach ( $edits as $edit ) {
950 if ( !empty( $edit[1] ) ) $user->setName( $edit[1] );
951 else $user = $wgUser;
953 $content = ContentHandler
::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() );
955 $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW
: 0, false, $user );
960 $reason = $page->getAutoDeleteReason( $hasHistory );
962 if ( is_bool( $expectedResult ) ||
is_null( $expectedResult ) ) $this->assertEquals( $expectedResult, $reason );
963 else $this->assertTrue( (bool)preg_match( $expectedResult, $reason ),
964 "Autosummary didn't match expected pattern $expectedResult: $reason" );
966 $this->assertEquals( $expectedHistory, $hasHistory,
967 "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
969 $page->doDeleteArticle( "done" );
972 public static function providePreSaveTransform() {
974 array( 'hello this is ~~~',
975 "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
977 array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
978 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
984 * @dataProvider providePreSaveTransform
986 public function testPreSaveTransform( $text, $expected ) {
987 $this->hideDeprecated( 'WikiPage::preSaveTransform' );
989 $user->setName("127.0.0.1");
991 //NOTE: assume Help namespace to contain wikitext
992 $page = $this->newPage( "Help:WikiPageTest_testPreloadTransform" );
993 $text = $page->preSaveTransform( $text, $user );
995 $this->assertEquals( $expected, $text );