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 = [], $dataName = '' ) {
14 parent
::__construct( $name, $data, $dataName );
16 $this->tablesUsed
= array_merge(
35 protected function setUp() {
37 $this->pages_to_delete
= [];
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', '*', [ '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', '*', [ 'pl_from' => $id ] );
149 $n = $res->numRows();
152 $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
156 * @covers WikiPage::doEdit
157 * @deprecated since 1.21. Should be removed when WikiPage::doEdit() gets removed
159 public function testDoEdit() {
160 $this->hideDeprecated( "WikiPage::doEdit" );
161 $this->hideDeprecated( "WikiPage::getText" );
162 $this->hideDeprecated( "Revision::getText" );
164 // NOTE: assume help namespace will default to wikitext
165 $title = Title
::newFromText( "Help:WikiPageTest_testDoEdit" );
167 $page = $this->newPage( $title );
169 $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
170 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
172 $page->doEdit( $text, "[[testing]] 1" );
174 $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
175 $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
176 $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
177 $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
179 $id = $page->getId();
181 # ------------------------
182 $dbr = wfGetDB( DB_SLAVE
);
183 $res = $dbr->select( 'pagelinks', '*', [ 'pl_from' => $id ] );
184 $n = $res->numRows();
187 $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
189 # ------------------------
190 $page = new WikiPage( $title );
192 $retrieved = $page->getText();
193 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
195 # ------------------------
196 $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
197 . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
199 $page->doEdit( $text, "testing 2" );
201 # ------------------------
202 $page = new WikiPage( $title );
204 $retrieved = $page->getText();
205 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
207 # ------------------------
208 $dbr = wfGetDB( DB_SLAVE
);
209 $res = $dbr->select( 'pagelinks', '*', [ 'pl_from' => $id ] );
210 $n = $res->numRows();
213 $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
217 * @covers WikiPage::doQuickEditContent
219 public function testDoQuickEditContent() {
222 $page = $this->createPage(
223 "WikiPageTest_testDoQuickEditContent",
225 CONTENT_MODEL_WIKITEXT
228 $content = ContentHandler
::makeContent(
231 CONTENT_MODEL_WIKITEXT
233 $page->doQuickEditContent( $content, $wgUser, "testing q" );
235 # ---------------------
236 $page = new WikiPage( $page->getTitle() );
237 $this->assertTrue( $content->equals( $page->getContent() ) );
241 * @covers WikiPage::doDeleteArticle
243 public function testDoDeleteArticle() {
244 $page = $this->createPage(
245 "WikiPageTest_testDoDeleteArticle",
246 "[[original text]] foo",
247 CONTENT_MODEL_WIKITEXT
249 $id = $page->getId();
251 $page->doDeleteArticle( "testing deletion" );
254 $page->getTitle()->getArticleID() > 0,
255 "Title object should now have page id 0"
257 $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" );
260 "WikiPage::exists should return false after page was deleted"
264 "WikiPage::getContent should return null after page was deleted"
268 "WikiPage::getText should return false after page was deleted"
271 $t = Title
::newFromText( $page->getTitle()->getPrefixedText() );
274 "Title::exists should return false after page was deleted"
278 JobQueueGroup
::destroySingletons();
280 $jobs->loadParamsAndArgs( null, [ 'quiet' => true ], null );
283 # ------------------------
284 $dbr = wfGetDB( DB_SLAVE
);
285 $res = $dbr->select( 'pagelinks', '*', [ 'pl_from' => $id ] );
286 $n = $res->numRows();
289 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
293 * @covers WikiPage::doDeleteUpdates
295 public function testDoDeleteUpdates() {
296 $page = $this->createPage(
297 "WikiPageTest_testDoDeleteArticle",
298 "[[original text]] foo",
299 CONTENT_MODEL_WIKITEXT
301 $id = $page->getId();
303 // Similar to MovePage logic
304 wfGetDB( DB_MASTER
)->delete( 'page', [ 'page_id' => $id ], __METHOD__
);
305 $page->doDeleteUpdates( $id );
308 JobQueueGroup
::destroySingletons();
310 $jobs->loadParamsAndArgs( null, [ 'quiet' => true ], null );
313 # ------------------------
314 $dbr = wfGetDB( DB_SLAVE
);
315 $res = $dbr->select( 'pagelinks', '*', [ 'pl_from' => $id ] );
316 $n = $res->numRows();
319 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
323 * @covers WikiPage::getRevision
325 public function testGetRevision() {
326 $page = $this->newPage( "WikiPageTest_testGetRevision" );
328 $rev = $page->getRevision();
329 $this->assertNull( $rev );
332 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
334 $rev = $page->getRevision();
336 $this->assertEquals( $page->getLatest(), $rev->getId() );
337 $this->assertEquals( "some text", $rev->getContent()->getNativeData() );
341 * @covers WikiPage::getContent
343 public function testGetContent() {
344 $page = $this->newPage( "WikiPageTest_testGetContent" );
346 $content = $page->getContent();
347 $this->assertNull( $content );
350 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
352 $content = $page->getContent();
353 $this->assertEquals( "some text", $content->getNativeData() );
357 * @covers WikiPage::getText
359 public function testGetText() {
360 $this->hideDeprecated( "WikiPage::getText" );
362 $page = $this->newPage( "WikiPageTest_testGetText" );
364 $text = $page->getText();
365 $this->assertFalse( $text );
368 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
370 $text = $page->getText();
371 $this->assertEquals( "some text", $text );
375 * @covers WikiPage::getContentModel
377 public function testGetContentModel() {
378 global $wgContentHandlerUseDB;
380 if ( !$wgContentHandlerUseDB ) {
381 $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
384 $page = $this->createPage(
385 "WikiPageTest_testGetContentModel",
387 CONTENT_MODEL_JAVASCRIPT
390 $page = new WikiPage( $page->getTitle() );
391 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT
, $page->getContentModel() );
395 * @covers WikiPage::getContentHandler
397 public function testGetContentHandler() {
398 global $wgContentHandlerUseDB;
400 if ( !$wgContentHandlerUseDB ) {
401 $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
404 $page = $this->createPage(
405 "WikiPageTest_testGetContentHandler",
407 CONTENT_MODEL_JAVASCRIPT
410 $page = new WikiPage( $page->getTitle() );
411 $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
415 * @covers WikiPage::exists
417 public function testExists() {
418 $page = $this->newPage( "WikiPageTest_testExists" );
419 $this->assertFalse( $page->exists() );
422 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
423 $this->assertTrue( $page->exists() );
425 $page = new WikiPage( $page->getTitle() );
426 $this->assertTrue( $page->exists() );
429 $page->doDeleteArticle( "done testing" );
430 $this->assertFalse( $page->exists() );
432 $page = new WikiPage( $page->getTitle() );
433 $this->assertFalse( $page->exists() );
436 public static function provideHasViewableContent() {
438 [ 'WikiPageTest_testHasViewableContent', false, true ],
439 [ 'Special:WikiPageTest_testHasViewableContent', false ],
440 [ 'MediaWiki:WikiPageTest_testHasViewableContent', false ],
441 [ 'Special:Userlogin', true ],
442 [ 'MediaWiki:help', true ],
447 * @dataProvider provideHasViewableContent
448 * @covers WikiPage::hasViewableContent
450 public function testHasViewableContent( $title, $viewable, $create = false ) {
451 $page = $this->newPage( $title );
452 $this->assertEquals( $viewable, $page->hasViewableContent() );
455 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
456 $this->assertTrue( $page->hasViewableContent() );
458 $page = new WikiPage( $page->getTitle() );
459 $this->assertTrue( $page->hasViewableContent() );
463 public static function provideGetRedirectTarget() {
465 [ 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT
, "hello world", null ],
467 'WikiPageTest_testGetRedirectTarget_2',
468 CONTENT_MODEL_WIKITEXT
,
469 "#REDIRECT [[hello world]]",
476 * @dataProvider provideGetRedirectTarget
477 * @covers WikiPage::getRedirectTarget
479 public function testGetRedirectTarget( $title, $model, $text, $target ) {
480 $this->setMwGlobals( [
481 'wgCapitalLinks' => true,
484 $page = $this->createPage( $title, $text, $model );
486 # sanity check, because this test seems to fail for no reason for some people.
487 $c = $page->getContent();
488 $this->assertEquals( 'WikitextContent', get_class( $c ) );
490 # now, test the actual redirect
491 $t = $page->getRedirectTarget();
492 $this->assertEquals( $target, is_null( $t ) ?
null : $t->getPrefixedText() );
496 * @dataProvider provideGetRedirectTarget
497 * @covers WikiPage::isRedirect
499 public function testIsRedirect( $title, $model, $text, $target ) {
500 $page = $this->createPage( $title, $text, $model );
501 $this->assertEquals( !is_null( $target ), $page->isRedirect() );
504 public static function provideIsCountable() {
508 [ 'WikiPageTest_testIsCountable',
509 CONTENT_MODEL_WIKITEXT
,
514 [ 'WikiPageTest_testIsCountable',
515 CONTENT_MODEL_WIKITEXT
,
522 [ 'WikiPageTest_testIsCountable',
523 CONTENT_MODEL_WIKITEXT
,
528 [ 'WikiPageTest_testIsCountable',
529 CONTENT_MODEL_WIKITEXT
,
536 [ 'WikiPageTest_testIsCountable',
537 CONTENT_MODEL_WIKITEXT
,
542 [ 'WikiPageTest_testIsCountable',
543 CONTENT_MODEL_WIKITEXT
,
550 [ 'WikiPageTest_testIsCountable',
551 CONTENT_MODEL_WIKITEXT
,
556 [ 'WikiPageTest_testIsCountable',
557 CONTENT_MODEL_WIKITEXT
,
562 [ 'WikiPageTest_testIsCountable',
563 CONTENT_MODEL_WIKITEXT
,
569 // not a content namespace
570 [ 'Talk:WikiPageTest_testIsCountable',
571 CONTENT_MODEL_WIKITEXT
,
576 [ 'Talk:WikiPageTest_testIsCountable',
577 CONTENT_MODEL_WIKITEXT
,
582 [ 'Talk:WikiPageTest_testIsCountable',
583 CONTENT_MODEL_WIKITEXT
,
589 // not a content namespace, different model
590 [ 'MediaWiki:WikiPageTest_testIsCountable.js',
596 [ 'MediaWiki:WikiPageTest_testIsCountable.js',
602 [ 'MediaWiki:WikiPageTest_testIsCountable.js',
612 * @dataProvider provideIsCountable
613 * @covers WikiPage::isCountable
615 public function testIsCountable( $title, $model, $text, $mode, $expected ) {
616 global $wgContentHandlerUseDB;
618 $this->setMwGlobals( 'wgArticleCountMethod', $mode );
620 $title = Title
::newFromText( $title );
622 if ( !$wgContentHandlerUseDB
624 && ContentHandler
::getDefaultModelFor( $title ) != $model
626 $this->markTestSkipped( "Can not use non-default content model $model for "
627 . $title->getPrefixedDBkey() . " with \$wgContentHandlerUseDB disabled." );
630 $page = $this->createPage( $title, $text, $model );
632 $editInfo = $page->prepareContentForEdit( $page->getContent() );
634 $v = $page->isCountable();
635 $w = $page->isCountable( $editInfo );
640 "isCountable( null ) returned unexpected value " . var_export( $v, true )
641 . " instead of " . var_export( $expected, true )
642 . " in mode `$mode` for text \"$text\""
648 "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
649 . " instead of " . var_export( $expected, true )
650 . " in mode `$mode` for text \"$text\""
654 public static function provideGetParserOutput() {
656 [ CONTENT_MODEL_WIKITEXT
, "hello ''world''\n", "<p>hello <i>world</i></p>" ],
662 * @dataProvider provideGetParserOutput
663 * @covers WikiPage::getParserOutput
665 public function testGetParserOutput( $model, $text, $expectedHtml ) {
666 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model );
668 $opt = $page->makeParserOptions( 'canonical' );
669 $po = $page->getParserOutput( $opt );
670 $text = $po->getText();
672 $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
673 $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
675 $this->assertEquals( $expectedHtml, $text );
681 * @covers WikiPage::getParserOutput
683 public function testGetParserOutput_nonexisting() {
687 $page = new WikiPage( new Title( "WikiPageTest_testGetParserOutput_nonexisting_$count" ) );
689 $opt = new ParserOptions();
690 $po = $page->getParserOutput( $opt );
692 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." );
696 * @covers WikiPage::getParserOutput
698 public function testGetParserOutput_badrev() {
699 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT
);
701 $opt = new ParserOptions();
702 $po = $page->getParserOutput( $opt, $page->getLatest() +
1234 );
704 // @todo would be neat to also test deleted revision
706 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
709 public static $sections =
723 public function dataReplaceSection() {
724 // NOTE: assume the Help namespace to contain wikitext
726 [ 'Help:WikiPageTest_testReplaceSection',
727 CONTENT_MODEL_WIKITEXT
,
728 WikiPageTest
::$sections,
732 trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest
::$sections ) )
734 [ 'Help:WikiPageTest_testReplaceSection',
735 CONTENT_MODEL_WIKITEXT
,
736 WikiPageTest
::$sections,
742 [ 'Help:WikiPageTest_testReplaceSection',
743 CONTENT_MODEL_WIKITEXT
,
744 WikiPageTest
::$sections,
746 "== TEST ==\nmore fun",
748 trim( preg_replace( '/^== test ==.*== foo ==/sm',
749 "== TEST ==\nmore fun\n\n== foo ==",
750 WikiPageTest
::$sections ) )
752 [ 'Help:WikiPageTest_testReplaceSection',
753 CONTENT_MODEL_WIKITEXT
,
754 WikiPageTest
::$sections,
758 trim( WikiPageTest
::$sections )
760 [ 'Help:WikiPageTest_testReplaceSection',
761 CONTENT_MODEL_WIKITEXT
,
762 WikiPageTest
::$sections,
766 trim( WikiPageTest
::$sections ) . "\n\n== New ==\n\nNo more"
772 * @dataProvider dataReplaceSection
773 * @covers WikiPage::replaceSectionContent
775 public function testReplaceSectionContent( $title, $model, $text, $section,
776 $with, $sectionTitle, $expected
778 $page = $this->createPage( $title, $text, $model );
780 $content = ContentHandler
::makeContent( $with, $page->getTitle(), $page->getContentModel() );
781 $c = $page->replaceSectionContent( $section, $content, $sectionTitle );
783 $this->assertEquals( $expected, is_null( $c ) ?
null : trim( $c->getNativeData() ) );
787 * @dataProvider dataReplaceSection
788 * @covers WikiPage::replaceSectionAtRev
790 public function testReplaceSectionAtRev( $title, $model, $text, $section,
791 $with, $sectionTitle, $expected
793 $page = $this->createPage( $title, $text, $model );
794 $baseRevId = $page->getLatest();
796 $content = ContentHandler
::makeContent( $with, $page->getTitle(), $page->getContentModel() );
797 $c = $page->replaceSectionAtRev( $section, $content, $sectionTitle, $baseRevId );
799 $this->assertEquals( $expected, is_null( $c ) ?
null : trim( $c->getNativeData() ) );
802 /* @todo FIXME: fix this!
803 public function testGetUndoText() {
804 $this->markTestSkippedIfNoDiff3();
807 $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
808 $rev1 = $page->getRevision();
811 $page->doEditContent(
812 ContentHandler::makeContent( $text, $page->getTitle() ),
815 $rev2 = $page->getRevision();
817 $text .= "\n\nthree";
818 $page->doEditContent(
819 ContentHandler::makeContent( $text, $page->getTitle() ),
820 "adding section three"
822 $rev3 = $page->getRevision();
825 $page->doEditContent(
826 ContentHandler::makeContent( $text, $page->getTitle() ),
827 "adding section four"
829 $rev4 = $page->getRevision();
832 $page->doEditContent(
833 ContentHandler::makeContent( $text, $page->getTitle() ),
834 "adding section five"
836 $rev5 = $page->getRevision();
839 $page->doEditContent(
840 ContentHandler::makeContent( $text, $page->getTitle() ),
843 $rev6 = $page->getRevision();
845 $undo6 = $page->getUndoText( $rev6 );
846 if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" );
847 $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 );
849 $undo3 = $page->getUndoText( $rev4, $rev2 );
850 if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" );
851 $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 );
853 $undo2 = $page->getUndoText( $rev2 );
854 if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" );
855 $this->assertEquals( "one\n\nfive", $undo2 );
860 * @todo FIXME: this is a better rollback test than the one below, but it
861 * keeps failing in jenkins for some reason.
863 public function broken_testDoRollback() {
865 $admin->setName( "Admin" );
868 $page = $this->newPage( "WikiPageTest_testDoRollback" );
869 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
870 "section one", EDIT_NEW
, false, $admin );
873 $user1->setName( "127.0.1.11" );
875 $page = new WikiPage( $page->getTitle() );
876 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
877 "adding section two", 0, false, $user1 );
880 $user2->setName( "127.0.2.13" );
881 $text .= "\n\nthree";
882 $page = new WikiPage( $page->getTitle() );
883 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
884 "adding section three", 0, false, $user2 );
886 # we are having issues with doRollback spuriously failing. Apparently
887 # the last revision somehow goes missing or not committed under some
888 # circumstances. So, make sure the last revision has the right user name.
889 $dbr = wfGetDB( DB_SLAVE
);
890 $this->assertEquals( 3, Revision
::countByPageId( $dbr, $page->getId() ) );
892 $page = new WikiPage( $page->getTitle() );
893 $rev3 = $page->getRevision();
894 $this->assertEquals( '127.0.2.13', $rev3->getUserText() );
896 $rev2 = $rev3->getPrevious();
897 $this->assertEquals( '127.0.1.11', $rev2->getUserText() );
899 $rev1 = $rev2->getPrevious();
900 $this->assertEquals( 'Admin', $rev1->getUserText() );
902 # now, try the actual rollback
903 $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
904 $token = $admin->getEditToken(
905 [ $page->getTitle()->getPrefixedText(), $user2->getName() ],
908 $errors = $page->doRollback(
918 $this->fail( "Rollback failed:\n" . print_r( $errors, true )
919 . ";\n" . print_r( $details, true ) );
922 $page = new WikiPage( $page->getTitle() );
923 $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(),
924 "rollback did not revert to the correct revision" );
925 $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() );
929 * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
930 * @covers WikiPage::doRollback
932 public function testDoRollback() {
934 $admin->setName( "Admin" );
937 $page = $this->newPage( "WikiPageTest_testDoRollback" );
938 $page->doEditContent(
939 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
945 $rev1 = $page->getRevision();
948 $user1->setName( "127.0.1.11" );
950 $page = new WikiPage( $page->getTitle() );
951 $page->doEditContent(
952 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
953 "adding section two",
959 # now, try the rollback
960 $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
961 $token = $admin->getEditToken(
962 [ $page->getTitle()->getPrefixedText(), $user1->getName() ],
965 $errors = $page->doRollback(
975 $this->fail( "Rollback failed:\n" . print_r( $errors, true )
976 . ";\n" . print_r( $details, true ) );
979 $page = new WikiPage( $page->getTitle() );
980 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
981 "rollback did not revert to the correct revision" );
982 $this->assertEquals( "one", $page->getContent()->getNativeData() );
986 * @covers WikiPage::doRollback
988 public function testDoRollbackFailureSameContent() {
990 $admin->setName( "Admin" );
991 $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
994 $page = $this->newPage( "WikiPageTest_testDoRollback" );
995 $page->doEditContent(
996 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
1002 $rev1 = $page->getRevision();
1004 $user1 = new User();
1005 $user1->setName( "127.0.1.11" );
1006 $user1->addGroup( "sysop" ); # XXX: make the test user a sysop...
1008 $page = new WikiPage( $page->getTitle() );
1009 $page->doEditContent(
1010 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
1011 "adding section two",
1017 # now, do a the rollback from the same user was doing the edit before
1018 $resultDetails = [];
1019 $token = $user1->getEditToken(
1020 [ $page->getTitle()->getPrefixedText(), $user1->getName() ],
1023 $errors = $page->doRollback(
1025 "testing revert same user",
1032 $this->assertEquals( [], $errors, "Rollback failed same user" );
1034 # now, try the rollback
1035 $resultDetails = [];
1036 $token = $admin->getEditToken(
1037 [ $page->getTitle()->getPrefixedText(), $user1->getName() ],
1040 $errors = $page->doRollback(
1049 $this->assertEquals( [ [ 'alreadyrolled', 'WikiPageTest testDoRollback',
1050 '127.0.1.11', 'Admin' ] ], $errors, "Rollback not failed" );
1052 $page = new WikiPage( $page->getTitle() );
1053 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
1054 "rollback did not revert to the correct revision" );
1055 $this->assertEquals( "one", $page->getContent()->getNativeData() );
1058 public static function provideGetAutosummary() {
1061 'Hello there, world!',
1062 '#REDIRECT [[Foo]]',
1064 '/^Redirected page .*Foo/'
1071 '/^Created page .*Hello/'
1075 'Hello there, world!',
1082 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
1083 eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
1084 voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
1085 clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
1088 '/^Replaced .*Hello/'
1101 * @dataProvider provideGetAutoSummary
1102 * @covers WikiPage::getAutosummary
1104 public function testGetAutosummary( $old, $new, $flags, $expected ) {
1105 $this->hideDeprecated( "WikiPage::getAutosummary" );
1107 $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
1109 $summary = $page->getAutosummary( $old, $new, $flags );
1111 $this->assertTrue( (bool)preg_match( $expected, $summary ),
1112 "Autosummary didn't match expected pattern $expected: $summary" );
1115 public static function provideGetAutoDeleteReason() {
1125 [ "first edit", null ],
1127 "/first edit.*only contributor/",
1133 [ "first edit", null ],
1134 [ "second edit", null ],
1136 "/second edit.*only contributor/",
1142 [ "first edit", "127.0.2.22" ],
1143 [ "second edit", "127.0.3.33" ],
1153 . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
1154 . " nonumy eirmod tempor invidunt ut labore et dolore magna "
1155 . "aliquyam erat, sed diam voluptua. At vero eos et accusam "
1156 . "et justo duo dolores et ea rebum. Stet clita kasd gubergren, "
1157 . "no sea takimata sanctus est Lorem ipsum dolor sit amet.'",
1161 '/first edit:.*\.\.\."/',
1167 [ "first edit", "127.0.2.22" ],
1168 [ "", "127.0.3.33" ],
1170 "/before blanking.*first edit/",
1178 * @dataProvider provideGetAutoDeleteReason
1179 * @covers WikiPage::getAutoDeleteReason
1181 public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
1184 // NOTE: assume Help namespace to contain wikitext
1185 $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" );
1189 foreach ( $edits as $edit ) {
1192 if ( !empty( $edit[1] ) ) {
1193 $user->setName( $edit[1] );
1198 $content = ContentHandler
::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() );
1200 $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW
: 0, false, $user );
1205 $reason = $page->getAutoDeleteReason( $hasHistory );
1207 if ( is_bool( $expectedResult ) ||
is_null( $expectedResult ) ) {
1208 $this->assertEquals( $expectedResult, $reason );
1210 $this->assertTrue( (bool)preg_match( $expectedResult, $reason ),
1211 "Autosummary didn't match expected pattern $expectedResult: $reason" );
1214 $this->assertEquals( $expectedHistory, $hasHistory,
1215 "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
1217 $page->doDeleteArticle( "done" );
1220 public static function providePreSaveTransform() {
1222 [ 'hello this is ~~~',
1223 "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
1225 [ 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
1226 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
1232 * @covers WikiPage::factory
1234 public function testWikiPageFactory() {
1235 $title = Title
::makeTitle( NS_FILE
, 'Someimage.png' );
1236 $page = WikiPage
::factory( $title );
1237 $this->assertEquals( 'WikiFilePage', get_class( $page ) );
1239 $title = Title
::makeTitle( NS_CATEGORY
, 'SomeCategory' );
1240 $page = WikiPage
::factory( $title );
1241 $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
1243 $title = Title
::makeTitle( NS_MAIN
, 'SomePage' );
1244 $page = WikiPage
::factory( $title );
1245 $this->assertEquals( 'WikiPage', get_class( $page ) );