4 * ^--- important, causes temporary tables to be used instead of the real database
7 class WikiPageTest
extends MediaWikiTestCase
{
11 public function setUp() {
12 $this->pages_to_delete
= array();
15 public function tearDown() {
16 foreach ( $this->pages_to_delete
as $p ) {
17 /* @var $p WikiPage */
21 $p->doDeleteArticle( "testing done." );
23 } catch ( MWException
$ex ) {
29 protected function newPage( $title ) {
30 if ( is_string( $title ) ) $title = Title
::newFromText( $title );
32 $p = new WikiPage( $title );
34 $this->pages_to_delete
[] = $p;
39 protected function createPage( $page, $text, $model = null ) {
40 if ( is_string( $page ) ) $page = Title
::newFromText( $page );
41 if ( $page instanceof Title
) $page = $this->newPage( $page );
43 $content = ContentHandler
::makeContent( $text, $page->getTitle(), $model );
44 $page->doEditContent( $content, "testing" );
49 public function testDoEditContent() {
50 $title = Title
::newFromText( "WikiPageTest_testDoEditContent" );
52 $page = $this->newPage( $title );
54 $content = ContentHandler
::makeContent( "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
55 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.",
58 $page->doEditContent( $content, "testing 1" );
60 $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
61 $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
63 # ------------------------
64 $page = new WikiPage( $title );
66 $retrieved = $page->getContent();
67 $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
69 # ------------------------
70 $content = ContentHandler
::makeContent( "At vero eos et accusam et justo duo dolores et ea rebum. "
71 . "Stet clita kasd gubergren, no sea takimata sanctus est.",
74 $page->doEditContent( $content, "testing 2" );
76 # ------------------------
77 $page = new WikiPage( $title );
79 $retrieved = $page->getContent();
80 $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
83 public function testDoEdit() {
84 $title = Title
::newFromText( "WikiPageTest_testDoEdit" );
86 $page = $this->newPage( $title );
88 $text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
89 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
91 $page->doEdit( $text, "testing 1" );
93 $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
94 $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
96 # ------------------------
97 $page = new WikiPage( $title );
99 $retrieved = $page->getText();
100 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
102 # ------------------------
103 $text = "At vero eos et accusam et justo duo dolores et ea rebum. "
104 . "Stet clita kasd gubergren, no sea takimata sanctus est.";
106 $page->doEdit( $text, "testing 2" );
108 # ------------------------
109 $page = new WikiPage( $title );
111 $retrieved = $page->getText();
112 $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
115 public function testDoQuickEdit() {
118 $page = $this->createPage( "WikiPageTest_testDoQuickEdit", "original text" );
120 $text = "quick text";
121 $page->doQuickEdit( $text, $wgUser, "testing q" );
123 # ---------------------
124 $page = new WikiPage( $page->getTitle() );
125 $this->assertEquals( $text, $page->getText() );
128 public function testDoQuickEditContent() {
131 $page = $this->createPage( "WikiPageTest_testDoQuickEditContent", "original text" );
133 $content = ContentHandler
::makeContent( "quick text", $page->getTitle() );
134 $page->doQuickEditContent( $content, $wgUser, "testing q" );
136 # ---------------------
137 $page = new WikiPage( $page->getTitle() );
138 $this->assertTrue( $content->equals( $page->getContent() ) );
141 public function testDoDeleteArticle() {
142 $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "original text" );
144 $page->doDeleteArticle( "testing deletion" );
146 $this->assertFalse( $page->exists() );
148 $this->assertNull( $page->getContent() );
149 $this->assertFalse( $page->getText() );
151 $t = Title
::newFromText( $page->getTitle()->getPrefixedText() );
152 $this->assertFalse( $t->exists() );
155 public function testGetRevision() {
156 $page = $this->newPage( "WikiPageTest_testGetRevision" );
158 $rev = $page->getRevision();
159 $this->assertNull( $rev );
162 $this->createPage( $page, "some text" );
164 $rev = $page->getRevision();
166 $this->assertEquals( $page->getLatest(), $rev->getId() );
167 $this->assertEquals( "some text", $rev->getContent()->getNativeData() );
170 public function testGetContent() {
171 $page = $this->newPage( "WikiPageTest_testGetContent" );
173 $content = $page->getContent();
174 $this->assertNull( $content );
177 $this->createPage( $page, "some text" );
179 $content = $page->getContent();
180 $this->assertEquals( "some text", $content->getNativeData() );
183 public function testGetText() {
184 $page = $this->newPage( "WikiPageTest_testGetText" );
186 $text = $page->getText();
187 $this->assertFalse( $text );
190 $this->createPage( $page, "some text" );
192 $text = $page->getText();
193 $this->assertEquals( "some text", $text );
196 public function testGetRawText() {
197 $page = $this->newPage( "WikiPageTest_testGetRawText" );
199 $text = $page->getRawText();
200 $this->assertFalse( $text );
203 $this->createPage( $page, "some text" );
205 $text = $page->getRawText();
206 $this->assertEquals( "some text", $text );
209 public function testGetContentModelName() {
210 $page = $this->createPage( "WikiPageTest_testGetContentModelName", "some text", CONTENT_MODEL_JAVASCRIPT
);
212 $page = new WikiPage( $page->getTitle() );
213 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT
, $page->getContentModelName() );
216 public function testGetContentHandler() {
217 $page = $this->createPage( "WikiPageTest_testGetContentHandler", "some text", CONTENT_MODEL_JAVASCRIPT
);
219 $page = new WikiPage( $page->getTitle() );
220 $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
223 public function testExists() {
224 $page = $this->newPage( "WikiPageTest_testExists" );
225 $this->assertFalse( $page->exists() );
228 $this->createPage( $page, "some text" );
229 $this->assertTrue( $page->exists() );
231 $page = new WikiPage( $page->getTitle() );
232 $this->assertTrue( $page->exists() );
235 $page->doDeleteArticle( "done testing" );
236 $this->assertFalse( $page->exists() );
238 $page = new WikiPage( $page->getTitle() );
239 $this->assertFalse( $page->exists() );
242 public function dataHasViewableContent() {
244 array( 'WikiPageTest_testHasViewableContent', false, true ),
245 array( 'Special:WikiPageTest_testHasViewableContent', false ),
246 array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ),
247 array( 'Special:Userlogin', true ),
248 array( 'MediaWiki:help', true ),
253 * @dataProvider dataHasViewableContent
255 public function testHasViewableContent( $title, $viewable, $create = false ) {
256 $page = $this->newPage( $title );
257 $this->assertEquals( $viewable, $page->hasViewableContent() );
260 $this->createPage( $page, "some text" );
261 $this->assertTrue( $page->hasViewableContent() );
263 $page = new WikiPage( $page->getTitle() );
264 $this->assertTrue( $page->hasViewableContent() );
268 public function dataGetRedirectTarget() {
270 array( 'WikiPageTest_testGetRedirectTarget_1', "hello world", null ),
271 array( 'WikiPageTest_testGetRedirectTarget_2', "#REDIRECT [[hello world]]", "Hello world" ),
276 * @dataProvider dataGetRedirectTarget
278 public function testGetRedirectTarget( $title, $text, $target ) {
279 $page = $this->createPage( $title, $text );
281 $t = $page->getRedirectTarget();
282 $this->assertEquals( $target, is_null( $t ) ?
null : $t->getPrefixedText() );
286 * @dataProvider dataGetRedirectTarget
288 public function testIsRedirect( $title, $text, $target ) {
289 $page = $this->createPage( $title, $text );
290 $this->assertEquals( !is_null( $target ), $page->isRedirect() );
293 public function dataIsCountable() {
297 array( 'WikiPageTest_testIsCountable',
302 array( 'WikiPageTest_testIsCountable',
309 array( 'WikiPageTest_testIsCountable',
314 array( 'WikiPageTest_testIsCountable',
321 array( 'WikiPageTest_testIsCountable',
326 array( 'WikiPageTest_testIsCountable',
333 array( 'WikiPageTest_testIsCountable',
338 array( 'WikiPageTest_testIsCountable',
343 array( 'WikiPageTest_testIsCountable',
349 // not a content namespace
350 array( 'Talk:WikiPageTest_testIsCountable',
355 array( 'Talk:WikiPageTest_testIsCountable',
360 array( 'Talk:WikiPageTest_testIsCountable',
366 // not a content namespace, different model
367 array( 'MediaWiki:WikiPageTest_testIsCountable.js',
372 array( 'MediaWiki:WikiPageTest_testIsCountable.js',
377 array( 'MediaWiki:WikiPageTest_testIsCountable.js',
387 * @dataProvider dataIsCountable
389 public function testIsCountable( $title, $text, $mode, $expected ) {
390 global $wgArticleCountMethod;
392 $old = $wgArticleCountMethod;
393 $wgArticleCountMethod = $mode;
395 $page = $this->createPage( $title, $text );
396 $editInfo = $page->prepareContentForEdit( $page->getContent() );
398 $v = $page->isCountable();
399 $w = $page->isCountable( $editInfo );
400 $wgArticleCountMethod = $old;
402 $this->assertEquals( $expected, $v, "isCountable( null ) returned unexpected value " . var_export( $v, true )
403 . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
405 $this->assertEquals( $expected, $w, "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
406 . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
409 public function dataGetParserOutput() {
411 array("hello ''world''\n", "<p>hello <i>world</i>\n</p>"),
417 * @dataProvider dataGetParserOutput
419 public function testGetParserOutput( $text, $expectedHtml ) {
420 $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text );
422 $opt = new ParserOptions();
423 $po = $page->getParserOutput( $opt );
424 $text = $po->getText();
426 $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
428 $this->assertEquals( $expectedHtml, $text );
447 public function dataReplaceSection() {
449 array( 'WikiPageTest_testReplaceSection',
450 WikiPageTest
::$sections,
454 trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest
::$sections ) )
456 array( 'WikiPageTest_testReplaceSection',
457 WikiPageTest
::$sections,
463 array( 'WikiPageTest_testReplaceSection',
464 WikiPageTest
::$sections,
466 "== TEST ==\nmore fun",
468 trim( preg_replace( '/^== test ==.*== foo ==/sm', "== TEST ==\nmore fun\n\n== foo ==", WikiPageTest
::$sections ) )
470 array( 'WikiPageTest_testReplaceSection',
471 WikiPageTest
::$sections,
475 trim( WikiPageTest
::$sections )
477 array( 'WikiPageTest_testReplaceSection',
478 WikiPageTest
::$sections,
482 trim( WikiPageTest
::$sections ) . "\n\n== New ==\n\nNo more"
488 * @dataProvider dataReplaceSection
490 public function testReplaceSection( $title, $text, $section, $with, $sectionTitle, $expected ) {
491 $page = $this->createPage( $title, $text );
492 $text = $page->replaceSection( $section, $with, $sectionTitle );
493 $text = trim( $text );
495 $this->assertEquals( $expected, $text );
499 * @dataProvider dataReplaceSection
501 public function testReplaceSectionContent( $title, $text, $section, $with, $sectionTitle, $expected ) {
502 $page = $this->createPage( $title, $text );
504 $content = ContentHandler
::makeContent( $with, $page->getTitle(), $page->getContentModelName() );
505 $c = $page->replaceSectionContent( $section, $content, $sectionTitle );
507 $this->assertEquals( $expected, is_null( $c ) ?
null : trim( $c->getNativeData() ) );
511 public function testGetUndoText() {
514 wfSuppressWarnings();
515 $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
519 $this->markTestSkipped( "diff3 not installed or not found" );
524 $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
525 $rev1 = $page->getRevision();
528 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section two");
529 $rev2 = $page->getRevision();
531 $text .= "\n\nthree";
532 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section three");
533 $rev3 = $page->getRevision();
536 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section four");
537 $rev4 = $page->getRevision();
540 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section five");
541 $rev5 = $page->getRevision();
544 $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section six");
545 $rev6 = $page->getRevision();
547 $undo6 = $page->getUndoText( $rev6 );
548 if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" );
549 $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 );
551 $undo3 = $page->getUndoText( $rev4, $rev2 );
552 if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" );
553 $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 );
555 $undo2 = $page->getUndoText( $rev2 );
556 if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" );
557 $this->assertEquals( "one\n\nfive", $undo2 );
561 public function testDoRollback() {
563 $admin->setName("Admin");
566 $page = $this->createPage( "WikiPageTest_testDoRollback", $text );
569 $user1->setName( "127.0.1.11" );
571 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ), "adding section two", 0, false, $user1 );
574 $user2->setName( "127.0.2.13" );
575 $text .= "\n\nthree";
576 $page->doEditContent( ContentHandler
::makeContent( $text, $page->getTitle() ), "adding section three", 0, false, $user2 );
578 $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
579 $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user2->getName() ), null );
580 $errors = $page->doRollback( $user2->getName(), "testing revert", $token, false, $details, $admin );
583 $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
586 $page = new WikiPage( $page->getTitle() );
587 $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() );
590 public function dataGetAutosummary( ) {
593 'Hello there, world!',
596 '/^Redirected page .*Foo/'
603 '/^Created page .*Hello/'
607 'Hello there, world!',
614 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
615 labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et
616 ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
619 '/^Replaced .*Hello/'
632 * @dataProvider dataGetAutoSummary
634 public function testGetAutosummary( $old, $new, $flags, $expected ) {
635 $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
637 $summary = $page->getAutosummary( $old, $new, $flags );
639 $this->assertTrue( (bool)preg_match( $expected, $summary ), "Autosummary didn't match expected pattern $expected: $summary" );
642 public function dataGetAutoDeleteReason( ) {
652 array( "first edit", null ),
654 "/first edit.*only contributor/",
660 array( "first edit", null ),
661 array( "second edit", null ),
663 "/second edit.*only contributor/",
669 array( "first edit", "127.0.2.22" ),
670 array( "second edit", "127.0.3.33" ),
678 array( "first edit: "
679 . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
680 . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. "
681 . "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea "
682 . "takimata sanctus est Lorem ipsum dolor sit amet.'", null ),
684 '/first edit:.*\.\.\."/',
690 array( "first edit", "127.0.2.22" ),
691 array( "", "127.0.3.33" ),
693 "/before blanking.*first edit/",
701 * @dataProvider dataGetAutoDeleteReason
703 public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
706 $page = $this->newPage( "WikiPageTest_testGetAutoDeleteReason" );
710 foreach ( $edits as $edit ) {
713 if ( !empty( $edit[1] ) ) $user->setName( $edit[1] );
714 else $user = $wgUser;
716 $content = ContentHandler
::makeContent( $edit[0], $page->getTitle(), $page->getContentModelName() );
718 $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW
: 0, false, $user );
723 $reason = $page->getAutoDeleteReason( $hasHistory );
725 if ( is_bool( $expectedResult ) ||
is_null( $expectedResult ) ) $this->assertEquals( $expectedResult, $reason );
726 else $this->assertTrue( (bool)preg_match( $expectedResult, $reason ), "Autosummary didn't match expected pattern $expectedResult: $reason" );
728 $this->assertEquals( $expectedHistory, $hasHistory, "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
731 public function dataPreSaveTransform() {
733 array( 'hello this is ~~~',
734 "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
736 array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
737 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
743 * @dataProvider dataPreSaveTransform
745 public function testPreSaveTransform( $text, $expected ) {
747 $user->setName("127.0.0.1");
749 $page = $this->newPage( "WikiPageTest_testPreloadTransform" );
750 $text = $page->preSaveTransform( $text, $user );
752 $this->assertEquals( $expected, $text );