9de2bc91a86041dda917f2aeb1e40508e2f80b9e
3 abstract class WikiPageDbTestBase
extends MediaWikiLangTestCase
{
5 private $pagesToDelete;
7 public function __construct( $name = null, array $data = [], $dataName = '' ) {
8 parent
::__construct( $name, $data, $dataName );
10 $this->tablesUsed
= array_merge(
31 protected function setUp() {
33 $this->setMwGlobals( 'wgContentHandlerUseDB', $this->getContentHandlerUseDB() );
34 $this->pagesToDelete
= [];
37 protected function tearDown() {
38 foreach ( $this->pagesToDelete
as $p ) {
39 /* @var $p WikiPage */
43 $p->doDeleteArticle( "testing done." );
45 } catch ( MWException
$ex ) {
52 abstract protected function getContentHandlerUseDB();
55 * @param Title|string $title
56 * @param string|null $model
59 private function newPage( $title, $model = null ) {
60 if ( is_string( $title ) ) {
61 $ns = $this->getDefaultWikitextNS();
62 $title = Title
::newFromText( $title, $ns );
65 $p = new WikiPage( $title );
67 $this->pagesToDelete
[] = $p;
73 * @param string|Title|WikiPage $page
79 protected function createPage( $page, $text, $model = null ) {
80 if ( is_string( $page ) ||
$page instanceof Title
) {
81 $page = $this->newPage( $page, $model );
84 $content = ContentHandler
::makeContent( $text, $page->getTitle(), $model );
85 $page->doEditContent( $content, "testing", EDIT_NEW
);
91 * @covers WikiPage::doEditContent
92 * @covers WikiPage::doModify
93 * @covers WikiPage::doCreate
94 * @covers WikiPage::doEditUpdates
96 public function testDoEditContent() {
97 $page = $this->newPage( __METHOD__
);
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_REPLICA
);
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_REPLICA
);
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::doDeleteArticle
158 public function testDoDeleteArticle() {
159 $page = $this->createPage(
161 "[[original text]] foo",
162 CONTENT_MODEL_WIKITEXT
164 $id = $page->getId();
166 $page->doDeleteArticle( "testing deletion" );
169 $page->getTitle()->getArticleID() > 0,
170 "Title object should now have page id 0"
172 $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" );
175 "WikiPage::exists should return false after page was deleted"
179 "WikiPage::getContent should return null after page was deleted"
182 $t = Title
::newFromText( $page->getTitle()->getPrefixedText() );
185 "Title::exists should return false after page was deleted"
189 JobQueueGroup
::destroySingletons();
191 $jobs->loadParamsAndArgs( null, [ 'quiet' => true ], null );
194 # ------------------------
195 $dbr = wfGetDB( DB_REPLICA
);
196 $res = $dbr->select( 'pagelinks', '*', [ 'pl_from' => $id ] );
197 $n = $res->numRows();
200 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
204 * @covers WikiPage::doDeleteUpdates
206 public function testDoDeleteUpdates() {
207 $page = $this->createPage(
209 "[[original text]] foo",
210 CONTENT_MODEL_WIKITEXT
212 $id = $page->getId();
214 // Similar to MovePage logic
215 wfGetDB( DB_MASTER
)->delete( 'page', [ 'page_id' => $id ], __METHOD__
);
216 $page->doDeleteUpdates( $id );
219 JobQueueGroup
::destroySingletons();
221 $jobs->loadParamsAndArgs( null, [ 'quiet' => true ], null );
224 # ------------------------
225 $dbr = wfGetDB( DB_REPLICA
);
226 $res = $dbr->select( 'pagelinks', '*', [ 'pl_from' => $id ] );
227 $n = $res->numRows();
230 $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
234 * @covers WikiPage::getRevision
236 public function testGetRevision() {
237 $page = $this->newPage( __METHOD__
);
239 $rev = $page->getRevision();
240 $this->assertNull( $rev );
243 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
245 $rev = $page->getRevision();
247 $this->assertEquals( $page->getLatest(), $rev->getId() );
248 $this->assertEquals( "some text", $rev->getContent()->getNativeData() );
252 * @covers WikiPage::getContent
254 public function testGetContent() {
255 $page = $this->newPage( __METHOD__
);
257 $content = $page->getContent();
258 $this->assertNull( $content );
261 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
263 $content = $page->getContent();
264 $this->assertEquals( "some text", $content->getNativeData() );
268 * @covers WikiPage::exists
270 public function testExists() {
271 $page = $this->newPage( __METHOD__
);
272 $this->assertFalse( $page->exists() );
275 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
276 $this->assertTrue( $page->exists() );
278 $page = new WikiPage( $page->getTitle() );
279 $this->assertTrue( $page->exists() );
282 $page->doDeleteArticle( "done testing" );
283 $this->assertFalse( $page->exists() );
285 $page = new WikiPage( $page->getTitle() );
286 $this->assertFalse( $page->exists() );
289 public function provideHasViewableContent() {
291 [ 'WikiPageTest_testHasViewableContent', false, true ],
292 [ 'Special:WikiPageTest_testHasViewableContent', false ],
293 [ 'MediaWiki:WikiPageTest_testHasViewableContent', false ],
294 [ 'Special:Userlogin', true ],
295 [ 'MediaWiki:help', true ],
300 * @dataProvider provideHasViewableContent
301 * @covers WikiPage::hasViewableContent
303 public function testHasViewableContent( $title, $viewable, $create = false ) {
304 $page = $this->newPage( $title );
305 $this->assertEquals( $viewable, $page->hasViewableContent() );
308 $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT
);
309 $this->assertTrue( $page->hasViewableContent() );
311 $page = new WikiPage( $page->getTitle() );
312 $this->assertTrue( $page->hasViewableContent() );
316 public function provideGetRedirectTarget() {
318 [ 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT
, "hello world", null ],
320 'WikiPageTest_testGetRedirectTarget_2',
321 CONTENT_MODEL_WIKITEXT
,
322 "#REDIRECT [[hello world]]",
329 * @dataProvider provideGetRedirectTarget
330 * @covers WikiPage::getRedirectTarget
332 public function testGetRedirectTarget( $title, $model, $text, $target ) {
333 $this->setMwGlobals( [
334 'wgCapitalLinks' => true,
337 $page = $this->createPage( $title, $text, $model );
339 # sanity check, because this test seems to fail for no reason for some people.
340 $c = $page->getContent();
341 $this->assertEquals( 'WikitextContent', get_class( $c ) );
343 # now, test the actual redirect
344 $t = $page->getRedirectTarget();
345 $this->assertEquals( $target, is_null( $t ) ?
null : $t->getPrefixedText() );
349 * @dataProvider provideGetRedirectTarget
350 * @covers WikiPage::isRedirect
352 public function testIsRedirect( $title, $model, $text, $target ) {
353 $page = $this->createPage( $title, $text, $model );
354 $this->assertEquals( !is_null( $target ), $page->isRedirect() );
357 public function provideIsCountable() {
361 [ 'WikiPageTest_testIsCountable',
362 CONTENT_MODEL_WIKITEXT
,
367 [ 'WikiPageTest_testIsCountable',
368 CONTENT_MODEL_WIKITEXT
,
375 [ 'WikiPageTest_testIsCountable',
376 CONTENT_MODEL_WIKITEXT
,
381 [ 'WikiPageTest_testIsCountable',
382 CONTENT_MODEL_WIKITEXT
,
389 [ 'WikiPageTest_testIsCountable',
390 CONTENT_MODEL_WIKITEXT
,
395 [ 'WikiPageTest_testIsCountable',
396 CONTENT_MODEL_WIKITEXT
,
403 [ 'WikiPageTest_testIsCountable',
404 CONTENT_MODEL_WIKITEXT
,
409 [ 'WikiPageTest_testIsCountable',
410 CONTENT_MODEL_WIKITEXT
,
415 [ 'WikiPageTest_testIsCountable',
416 CONTENT_MODEL_WIKITEXT
,
422 // not a content namespace
423 [ 'Talk:WikiPageTest_testIsCountable',
424 CONTENT_MODEL_WIKITEXT
,
429 [ 'Talk:WikiPageTest_testIsCountable',
430 CONTENT_MODEL_WIKITEXT
,
435 [ 'Talk:WikiPageTest_testIsCountable',
436 CONTENT_MODEL_WIKITEXT
,
442 // not a content namespace, different model
443 [ 'MediaWiki:WikiPageTest_testIsCountable.js',
449 [ 'MediaWiki:WikiPageTest_testIsCountable.js',
455 [ 'MediaWiki:WikiPageTest_testIsCountable.js',
465 * @dataProvider provideIsCountable
466 * @covers WikiPage::isCountable
468 public function testIsCountable( $title, $model, $text, $mode, $expected ) {
469 global $wgContentHandlerUseDB;
471 $this->setMwGlobals( 'wgArticleCountMethod', $mode );
473 $title = Title
::newFromText( $title );
475 if ( !$wgContentHandlerUseDB
477 && ContentHandler
::getDefaultModelFor( $title ) != $model
479 $this->markTestSkipped( "Can not use non-default content model $model for "
480 . $title->getPrefixedDBkey() . " with \$wgContentHandlerUseDB disabled." );
483 $page = $this->createPage( $title, $text, $model );
485 $editInfo = $page->prepareContentForEdit( $page->getContent() );
487 $v = $page->isCountable();
488 $w = $page->isCountable( $editInfo );
493 "isCountable( null ) returned unexpected value " . var_export( $v, true )
494 . " instead of " . var_export( $expected, true )
495 . " in mode `$mode` for text \"$text\""
501 "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
502 . " instead of " . var_export( $expected, true )
503 . " in mode `$mode` for text \"$text\""
507 public function provideGetParserOutput() {
510 CONTENT_MODEL_WIKITEXT
,
512 "<div class=\"mw-parser-output\"><p>hello <i>world</i></p></div>"
519 * @dataProvider provideGetParserOutput
520 * @covers WikiPage::getParserOutput
522 public function testGetParserOutput( $model, $text, $expectedHtml ) {
523 $page = $this->createPage( __METHOD__
, $text, $model );
525 $opt = $page->makeParserOptions( 'canonical' );
526 $po = $page->getParserOutput( $opt );
527 $text = $po->getText();
529 $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
530 $text = preg_replace( '!\s*(</p>|</div>)!sm', '\1', $text ); # don't let tidy confuse us
532 $this->assertEquals( $expectedHtml, $text );
538 * @covers WikiPage::getParserOutput
540 public function testGetParserOutput_nonexisting() {
541 $page = new WikiPage( Title
::newFromText( __METHOD__
) );
543 $opt = new ParserOptions();
544 $po = $page->getParserOutput( $opt );
546 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." );
550 * @covers WikiPage::getParserOutput
552 public function testGetParserOutput_badrev() {
553 $page = $this->createPage( __METHOD__
, 'dummy', CONTENT_MODEL_WIKITEXT
);
555 $opt = new ParserOptions();
556 $po = $page->getParserOutput( $opt, $page->getLatest() +
1234 );
558 // @todo would be neat to also test deleted revision
560 $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
563 public static $sections =
577 public function dataReplaceSection() {
578 // NOTE: assume the Help namespace to contain wikitext
580 [ 'Help:WikiPageTest_testReplaceSection',
581 CONTENT_MODEL_WIKITEXT
,
586 trim( preg_replace( '/^Intro/sm', 'No more', self
::$sections ) )
588 [ 'Help:WikiPageTest_testReplaceSection',
589 CONTENT_MODEL_WIKITEXT
,
596 [ 'Help:WikiPageTest_testReplaceSection',
597 CONTENT_MODEL_WIKITEXT
,
600 "== TEST ==\nmore fun",
602 trim( preg_replace( '/^== test ==.*== foo ==/sm',
603 "== TEST ==\nmore fun\n\n== foo ==",
606 [ 'Help:WikiPageTest_testReplaceSection',
607 CONTENT_MODEL_WIKITEXT
,
612 trim( self
::$sections )
614 [ 'Help:WikiPageTest_testReplaceSection',
615 CONTENT_MODEL_WIKITEXT
,
620 trim( self
::$sections ) . "\n\n== New ==\n\nNo more"
626 * @dataProvider dataReplaceSection
627 * @covers WikiPage::replaceSectionContent
629 public function testReplaceSectionContent( $title, $model, $text, $section,
630 $with, $sectionTitle, $expected
632 $page = $this->createPage( $title, $text, $model );
634 $content = ContentHandler
::makeContent( $with, $page->getTitle(), $page->getContentModel() );
635 $c = $page->replaceSectionContent( $section, $content, $sectionTitle );
637 $this->assertEquals( $expected, is_null( $c ) ?
null : trim( $c->getNativeData() ) );
641 * @dataProvider dataReplaceSection
642 * @covers WikiPage::replaceSectionAtRev
644 public function testReplaceSectionAtRev( $title, $model, $text, $section,
645 $with, $sectionTitle, $expected
647 $page = $this->createPage( $title, $text, $model );
648 $baseRevId = $page->getLatest();
650 $content = ContentHandler
::makeContent( $with, $page->getTitle(), $page->getContentModel() );
651 $c = $page->replaceSectionAtRev( $section, $content, $sectionTitle, $baseRevId );
653 $this->assertEquals( $expected, is_null( $c ) ?
null : trim( $c->getNativeData() ) );
657 * @covers WikiPage::getOldestRevision
659 public function testGetOldestRevision() {
660 $page = $this->newPage( __METHOD__
);
661 $page->doEditContent(
662 new WikitextContent( 'one' ),
666 $rev1 = $page->getRevision();
668 $page = new WikiPage( $page->getTitle() );
669 $page->doEditContent(
670 new WikitextContent( 'two' ),
675 $page = new WikiPage( $page->getTitle() );
676 $page->doEditContent(
677 new WikitextContent( 'three' ),
683 $this->assertNotEquals(
685 $page->getRevision()->getId(),
686 '$page->getRevision()->getId()'
692 $page->getOldestRevision()->getId(),
693 '$page->getOldestRevision()->getId()'
698 * @todo FIXME: this is a better rollback test than the one below, but it
699 * keeps failing in jenkins for some reason.
701 public function broken_testDoRollback() {
702 $admin = $this->getTestSysop()->getUser();
705 $page = $this->newPage( __METHOD__
);
706 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
707 "section one", EDIT_NEW
, false, $admin );
709 $user1 = $this->getTestUser()->getUser();
711 $page = new WikiPage( $page->getTitle() );
712 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
713 "adding section two", 0, false, $user1 );
715 $user2 = $this->getTestUser()->getUser();
716 $text .= "\n\nthree";
717 $page = new WikiPage( $page->getTitle() );
718 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ),
719 "adding section three", 0, false, $user2 );
721 # we are having issues with doRollback spuriously failing. Apparently
722 # the last revision somehow goes missing or not committed under some
723 # circumstances. So, make sure the last revision has the right user name.
724 $dbr = wfGetDB( DB_REPLICA
);
725 $this->assertEquals( 3, Revision
::countByPageId( $dbr, $page->getId() ) );
727 $page = new WikiPage( $page->getTitle() );
728 $rev3 = $page->getRevision();
729 $this->assertEquals( '127.0.2.13', $rev3->getUserText() );
731 $rev2 = $rev3->getPrevious();
732 $this->assertEquals( '127.0.1.11', $rev2->getUserText() );
734 $rev1 = $rev2->getPrevious();
735 $this->assertEquals( 'Admin', $rev1->getUserText() );
737 # now, try the actual rollback
738 $token = $admin->getEditToken(
739 [ $page->getTitle()->getPrefixedText(), $user2->getName() ],
742 $errors = $page->doRollback(
752 $this->fail( "Rollback failed:\n" . print_r( $errors, true )
753 . ";\n" . print_r( $details, true ) );
756 $page = new WikiPage( $page->getTitle() );
757 $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(),
758 "rollback did not revert to the correct revision" );
759 $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() );
763 * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
764 * @covers WikiPage::doRollback
766 public function testDoRollback() {
767 $admin = $this->getTestSysop()->getUser();
770 $page = $this->newPage( __METHOD__
);
771 $page->doEditContent(
772 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
778 $rev1 = $page->getRevision();
780 $user1 = $this->getTestUser()->getUser();
782 $page = new WikiPage( $page->getTitle() );
783 $page->doEditContent(
784 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
785 "adding section two",
791 # now, try the rollback
792 $token = $admin->getEditToken( 'rollback' );
793 $errors = $page->doRollback(
803 $this->fail( "Rollback failed:\n" . print_r( $errors, true )
804 . ";\n" . print_r( $details, true ) );
807 $page = new WikiPage( $page->getTitle() );
808 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
809 "rollback did not revert to the correct revision" );
810 $this->assertEquals( "one", $page->getContent()->getNativeData() );
814 * @covers WikiPage::doRollback
816 public function testDoRollbackFailureSameContent() {
817 $admin = $this->getTestSysop()->getUser();
820 $page = $this->newPage( __METHOD__
);
821 $page->doEditContent(
822 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
828 $rev1 = $page->getRevision();
830 $user1 = $this->getTestUser( [ 'sysop' ] )->getUser();
832 $page = new WikiPage( $page->getTitle() );
833 $page->doEditContent(
834 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
835 "adding section two",
841 # now, do a the rollback from the same user was doing the edit before
843 $token = $user1->getEditToken( 'rollback' );
844 $errors = $page->doRollback(
846 "testing revert same user",
853 $this->assertEquals( [], $errors, "Rollback failed same user" );
855 # now, try the rollback
857 $token = $admin->getEditToken( 'rollback' );
858 $errors = $page->doRollback(
877 "Rollback not failed"
880 $page = new WikiPage( $page->getTitle() );
881 $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
882 "rollback did not revert to the correct revision" );
883 $this->assertEquals( "one", $page->getContent()->getNativeData() );
887 * Tests tagging for edits that do rollback action
888 * @covers WikiPage::doRollback
890 public function testDoRollbackTagging() {
891 if ( !in_array( 'mw-rollback', ChangeTags
::getSoftwareTags() ) ) {
892 $this->markTestSkipped( 'Rollback tag deactivated, skipped the test.' );
896 $admin->setName( 'Administrator' );
897 $admin->addToDatabase();
899 $text = 'First line';
900 $page = $this->newPage( 'WikiPageTest_testDoRollbackTagging' );
901 $page->doEditContent(
902 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
909 $secondUser = new User();
910 $secondUser->setName( '92.65.217.32' );
911 $text .= '\n\nSecond line';
912 $page = new WikiPage( $page->getTitle() );
913 $page->doEditContent(
914 ContentHandler
::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT
),
915 'Adding second line',
921 // Now, try the rollback
922 $admin->addGroup( 'sysop' ); // Make the test user a sysop
923 $token = $admin->getEditToken( 'rollback' );
924 $errors = $page->doRollback(
925 $secondUser->getName(),
933 // If doRollback completed without errors
934 if ( $errors === [] ) {
935 $tags = $resultDetails[ 'tags' ];
936 $this->assertContains( 'mw-rollback', $tags );
940 public function provideGetAutoDeleteReason() {
950 [ "first edit", null ],
952 "/first edit.*only contributor/",
958 [ "first edit", null ],
959 [ "second edit", null ],
961 "/second edit.*only contributor/",
967 [ "first edit", "127.0.2.22" ],
968 [ "second edit", "127.0.3.33" ],
978 . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
979 . " nonumy eirmod tempor invidunt ut labore et dolore magna "
980 . "aliquyam erat, sed diam voluptua. At vero eos et accusam "
981 . "et justo duo dolores et ea rebum. Stet clita kasd gubergren, "
982 . "no sea takimata sanctus est Lorem ipsum dolor sit amet.'",
986 '/first edit:.*\.\.\."/',
992 [ "first edit", "127.0.2.22" ],
993 [ "", "127.0.3.33" ],
995 "/before blanking.*first edit/",
1003 * @dataProvider provideGetAutoDeleteReason
1004 * @covers WikiPage::getAutoDeleteReason
1006 public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
1009 // NOTE: assume Help namespace to contain wikitext
1010 $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" );
1014 foreach ( $edits as $edit ) {
1017 if ( !empty( $edit[1] ) ) {
1018 $user->setName( $edit[1] );
1023 $content = ContentHandler
::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() );
1025 $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW
: 0, false, $user );
1030 $reason = $page->getAutoDeleteReason( $hasHistory );
1032 if ( is_bool( $expectedResult ) ||
is_null( $expectedResult ) ) {
1033 $this->assertEquals( $expectedResult, $reason );
1035 $this->assertTrue( (bool)preg_match( $expectedResult, $reason ),
1036 "Autosummary didn't match expected pattern $expectedResult: $reason" );
1039 $this->assertEquals( $expectedHistory, $hasHistory,
1040 "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
1042 $page->doDeleteArticle( "done" );
1045 public function providePreSaveTransform() {
1047 [ 'hello this is ~~~',
1048 "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
1050 [ 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
1051 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
1057 * @covers WikiPage::factory
1059 public function testWikiPageFactory() {
1060 $title = Title
::makeTitle( NS_FILE
, 'Someimage.png' );
1061 $page = WikiPage
::factory( $title );
1062 $this->assertEquals( 'WikiFilePage', get_class( $page ) );
1064 $title = Title
::makeTitle( NS_CATEGORY
, 'SomeCategory' );
1065 $page = WikiPage
::factory( $title );
1066 $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
1068 $title = Title
::makeTitle( NS_MAIN
, 'SomePage' );
1069 $page = WikiPage
::factory( $title );
1070 $this->assertEquals( 'WikiPage', get_class( $page ) );
1074 * @dataProvider provideCommentMigrationOnDeletion
1076 * @param int $writeStage
1077 * @param int $readStage
1079 public function testCommentMigrationOnDeletion( $writeStage, $readStage ) {
1080 $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', $writeStage );
1081 $dbr = wfGetDB( DB_REPLICA
);
1083 $page = $this->createPage(
1086 CONTENT_MODEL_WIKITEXT
1088 $revid = $page->getLatest();
1089 if ( $writeStage > MIGRATION_OLD
) {
1090 $comment_id = $dbr->selectField(
1091 'revision_comment_temp',
1092 'revcomment_comment_id',
1093 [ 'revcomment_rev' => $revid ],
1098 $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', $readStage );
1100 $page->doDeleteArticle( "testing deletion" );
1102 if ( $readStage > MIGRATION_OLD
) {
1103 // Didn't leave behind any 'revision_comment_temp' rows
1104 $n = $dbr->selectField(
1105 'revision_comment_temp', 'COUNT(*)', [ 'revcomment_rev' => $revid ], __METHOD__
1107 $this->assertEquals( 0, $n, 'no entry in revision_comment_temp after deletion' );
1109 // Copied or upgraded the comment_id, as applicable
1110 $ar_comment_id = $dbr->selectField(
1113 [ 'ar_rev_id' => $revid ],
1116 if ( $writeStage > MIGRATION_OLD
) {
1117 $this->assertSame( $comment_id, $ar_comment_id );
1119 $this->assertNotEquals( 0, $ar_comment_id );
1123 // Copied rev_comment, if applicable
1124 if ( $readStage <= MIGRATION_WRITE_BOTH
&& $writeStage <= MIGRATION_WRITE_BOTH
) {
1125 $ar_comment = $dbr->selectField(
1128 [ 'ar_rev_id' => $revid ],
1131 $this->assertSame( 'testing', $ar_comment );
1135 public function provideCommentMigrationOnDeletion() {
1137 [ MIGRATION_OLD
, MIGRATION_OLD
],
1138 [ MIGRATION_OLD
, MIGRATION_WRITE_BOTH
],
1139 [ MIGRATION_OLD
, MIGRATION_WRITE_NEW
],
1140 [ MIGRATION_WRITE_BOTH
, MIGRATION_OLD
],
1141 [ MIGRATION_WRITE_BOTH
, MIGRATION_WRITE_BOTH
],
1142 [ MIGRATION_WRITE_BOTH
, MIGRATION_WRITE_NEW
],
1143 [ MIGRATION_WRITE_BOTH
, MIGRATION_NEW
],
1144 [ MIGRATION_WRITE_NEW
, MIGRATION_WRITE_BOTH
],
1145 [ MIGRATION_WRITE_NEW
, MIGRATION_WRITE_NEW
],
1146 [ MIGRATION_WRITE_NEW
, MIGRATION_NEW
],
1147 [ MIGRATION_NEW
, MIGRATION_WRITE_BOTH
],
1148 [ MIGRATION_NEW
, MIGRATION_WRITE_NEW
],
1149 [ MIGRATION_NEW
, MIGRATION_NEW
],