Merge "Upgrade premature implicit transaction commits to exceptions"
[lhc/web/wiklou.git] / tests / phpunit / includes / content / ContentHandlerTest.php
index a72247b..bb9050f 100644 (file)
@@ -1,7 +1,9 @@
 <?php
+use MediaWiki\MediaWikiServices;
 
 /**
  * @group ContentHandler
+ * @group Database
  */
 class ContentHandlerTest extends MediaWikiTestCase {
 
@@ -9,17 +11,17 @@ class ContentHandlerTest extends MediaWikiTestCase {
                global $wgContLang;
                parent::setUp();
 
-               $this->setMwGlobals( array(
-                       'wgExtraNamespaces' => array(
+               $this->setMwGlobals( [
+                       'wgExtraNamespaces' => [
                                12312 => 'Dummy',
                                12313 => 'Dummy_talk',
-                       ),
+                       ],
                        // The below tests assume that namespaces not mentioned here (Help, User, MediaWiki, ..)
                        // default to CONTENT_MODEL_WIKITEXT.
-                       'wgNamespaceContentModels' => array(
+                       'wgNamespaceContentModels' => [
                                12312 => 'testing',
-                       ),
-                       'wgContentHandlers' => array(
+                       ],
+                       'wgContentHandlers' => [
                                CONTENT_MODEL_WIKITEXT => 'WikitextContentHandler',
                                CONTENT_MODEL_JAVASCRIPT => 'JavaScriptContentHandler',
                                CONTENT_MODEL_JSON => 'JsonContentHandler',
@@ -29,14 +31,14 @@ class ContentHandlerTest extends MediaWikiTestCase {
                                'testing-callbacks' => function( $modelId ) {
                                        return new DummyContentHandlerForTesting( $modelId );
                                }
-                       ),
-               ) );
+                       ],
+               ] );
 
                // Reset namespace cache
                MWNamespace::getCanonicalNamespaces( true );
                $wgContLang->resetNamespaces();
                // And LinkCache
-               LinkCache::destroySingleton();
+               MediaWikiServices::getInstance()->resetServiceForTesting( 'LinkCache' );
        }
 
        protected function tearDown() {
@@ -46,37 +48,42 @@ class ContentHandlerTest extends MediaWikiTestCase {
                MWNamespace::getCanonicalNamespaces( true );
                $wgContLang->resetNamespaces();
                // And LinkCache
-               LinkCache::destroySingleton();
+               MediaWikiServices::getInstance()->resetServiceForTesting( 'LinkCache' );
 
                parent::tearDown();
        }
 
+       public function addDBDataOnce() {
+               $this->insertPage( 'Not_Main_Page', 'This is not a main page' );
+               $this->insertPage( 'Smithee', 'A smithee is one who smiths. See also [[Alan Smithee]]' );
+       }
+
        public static function dataGetDefaultModelFor() {
-               return array(
-                       array( 'Help:Foo', CONTENT_MODEL_WIKITEXT ),
-                       array( 'Help:Foo.js', CONTENT_MODEL_WIKITEXT ),
-                       array( 'Help:Foo.css', CONTENT_MODEL_WIKITEXT ),
-                       array( 'Help:Foo.json', CONTENT_MODEL_WIKITEXT ),
-                       array( 'Help:Foo/bar.js', CONTENT_MODEL_WIKITEXT ),
-                       array( 'User:Foo', CONTENT_MODEL_WIKITEXT ),
-                       array( 'User:Foo.js', CONTENT_MODEL_WIKITEXT ),
-                       array( 'User:Foo.css', CONTENT_MODEL_WIKITEXT ),
-                       array( 'User:Foo.json', CONTENT_MODEL_WIKITEXT ),
-                       array( 'User:Foo/bar.js', CONTENT_MODEL_JAVASCRIPT ),
-                       array( 'User:Foo/bar.css', CONTENT_MODEL_CSS ),
-                       array( 'User:Foo/bar.json', CONTENT_MODEL_JSON ),
-                       array( 'User:Foo/bar.json.nope', CONTENT_MODEL_WIKITEXT ),
-                       array( 'User talk:Foo/bar.css', CONTENT_MODEL_WIKITEXT ),
-                       array( 'User:Foo/bar.js.xxx', CONTENT_MODEL_WIKITEXT ),
-                       array( 'User:Foo/bar.xxx', CONTENT_MODEL_WIKITEXT ),
-                       array( 'MediaWiki:Foo.js', CONTENT_MODEL_JAVASCRIPT ),
-                       array( 'MediaWiki:Foo.JS', CONTENT_MODEL_WIKITEXT ),
-                       array( 'MediaWiki:Foo.css', CONTENT_MODEL_CSS ),
-                       array( 'MediaWiki:Foo.css.xxx', CONTENT_MODEL_WIKITEXT ),
-                       array( 'MediaWiki:Foo.CSS', CONTENT_MODEL_WIKITEXT ),
-                       array( 'MediaWiki:Foo.json', CONTENT_MODEL_JSON ),
-                       array( 'MediaWiki:Foo.JSON', CONTENT_MODEL_WIKITEXT ),
-               );
+               return [
+                       [ 'Help:Foo', CONTENT_MODEL_WIKITEXT ],
+                       [ 'Help:Foo.js', CONTENT_MODEL_WIKITEXT ],
+                       [ 'Help:Foo.css', CONTENT_MODEL_WIKITEXT ],
+                       [ 'Help:Foo.json', CONTENT_MODEL_WIKITEXT ],
+                       [ 'Help:Foo/bar.js', CONTENT_MODEL_WIKITEXT ],
+                       [ 'User:Foo', CONTENT_MODEL_WIKITEXT ],
+                       [ 'User:Foo.js', CONTENT_MODEL_WIKITEXT ],
+                       [ 'User:Foo.css', CONTENT_MODEL_WIKITEXT ],
+                       [ 'User:Foo.json', CONTENT_MODEL_WIKITEXT ],
+                       [ 'User:Foo/bar.js', CONTENT_MODEL_JAVASCRIPT ],
+                       [ 'User:Foo/bar.css', CONTENT_MODEL_CSS ],
+                       [ 'User:Foo/bar.json', CONTENT_MODEL_JSON ],
+                       [ 'User:Foo/bar.json.nope', CONTENT_MODEL_WIKITEXT ],
+                       [ 'User talk:Foo/bar.css', CONTENT_MODEL_WIKITEXT ],
+                       [ 'User:Foo/bar.js.xxx', CONTENT_MODEL_WIKITEXT ],
+                       [ 'User:Foo/bar.xxx', CONTENT_MODEL_WIKITEXT ],
+                       [ 'MediaWiki:Foo.js', CONTENT_MODEL_JAVASCRIPT ],
+                       [ 'MediaWiki:Foo.JS', CONTENT_MODEL_WIKITEXT ],
+                       [ 'MediaWiki:Foo.css', CONTENT_MODEL_CSS ],
+                       [ 'MediaWiki:Foo.css.xxx', CONTENT_MODEL_WIKITEXT ],
+                       [ 'MediaWiki:Foo.CSS', CONTENT_MODEL_WIKITEXT ],
+                       [ 'MediaWiki:Foo.json', CONTENT_MODEL_JSON ],
+                       [ 'MediaWiki:Foo.JSON', CONTENT_MODEL_WIKITEXT ],
+               ];
        }
 
        /**
@@ -100,13 +107,13 @@ class ContentHandlerTest extends MediaWikiTestCase {
        }
 
        public static function dataGetLocalizedName() {
-               return array(
-                       array( null, null ),
-                       array( "xyzzy", null ),
+               return [
+                       [ null, null ],
+                       [ "xyzzy", null ],
 
                        // XXX: depends on content language
-                       array( CONTENT_MODEL_JAVASCRIPT, '/javascript/i' ),
-               );
+                       [ CONTENT_MODEL_JAVASCRIPT, '/javascript/i' ],
+               ];
        }
 
        /**
@@ -131,17 +138,17 @@ class ContentHandlerTest extends MediaWikiTestCase {
        public static function dataGetPageLanguage() {
                global $wgLanguageCode;
 
-               return array(
-                       array( "Main", $wgLanguageCode ),
-                       array( "Dummy:Foo", $wgLanguageCode ),
-                       array( "MediaWiki:common.js", 'en' ),
-                       array( "User:Foo/common.js", 'en' ),
-                       array( "MediaWiki:common.css", 'en' ),
-                       array( "User:Foo/common.css", 'en' ),
-                       array( "User:Foo", $wgLanguageCode ),
-
-                       array( CONTENT_MODEL_JAVASCRIPT, 'javascript' ),
-               );
+               return [
+                       [ "Main", $wgLanguageCode ],
+                       [ "Dummy:Foo", $wgLanguageCode ],
+                       [ "MediaWiki:common.js", 'en' ],
+                       [ "User:Foo/common.js", 'en' ],
+                       [ "MediaWiki:common.css", 'en' ],
+                       [ "User:Foo/common.css", 'en' ],
+                       [ "User:Foo", $wgLanguageCode ],
+
+                       [ CONTENT_MODEL_JAVASCRIPT, 'javascript' ],
+               ];
        }
 
        /**
@@ -163,11 +170,11 @@ class ContentHandlerTest extends MediaWikiTestCase {
        }
 
        public static function dataGetContentText_Null() {
-               return array(
-                       array( 'fail' ),
-                       array( 'serialize' ),
-                       array( 'ignore' ),
-               );
+               return [
+                       [ 'fail' ],
+                       [ 'serialize' ],
+                       [ 'ignore' ],
+               ];
        }
 
        /**
@@ -184,11 +191,11 @@ class ContentHandlerTest extends MediaWikiTestCase {
        }
 
        public static function dataGetContentText_TextContent() {
-               return array(
-                       array( 'fail' ),
-                       array( 'serialize' ),
-                       array( 'ignore' ),
-               );
+               return [
+                       [ 'fail' ],
+                       [ 'serialize' ],
+                       [ 'ignore' ],
+               ];
        }
 
        /**
@@ -246,12 +253,12 @@ class ContentHandlerTest extends MediaWikiTestCase {
        */
 
        public static function dataMakeContent() {
-               return array(
-                       array( 'hallo', 'Help:Test', null, null, CONTENT_MODEL_WIKITEXT, 'hallo', false ),
-                       array( 'hallo', 'MediaWiki:Test.js', null, null, CONTENT_MODEL_JAVASCRIPT, 'hallo', false ),
-                       array( serialize( 'hallo' ), 'Dummy:Test', null, null, "testing", 'hallo', false ),
+               return [
+                       [ 'hallo', 'Help:Test', null, null, CONTENT_MODEL_WIKITEXT, 'hallo', false ],
+                       [ 'hallo', 'MediaWiki:Test.js', null, null, CONTENT_MODEL_JAVASCRIPT, 'hallo', false ],
+                       [ serialize( 'hallo' ), 'Dummy:Test', null, null, "testing", 'hallo', false ],
 
-                       array(
+                       [
                                'hallo',
                                'Help:Test',
                                null,
@@ -259,8 +266,8 @@ class ContentHandlerTest extends MediaWikiTestCase {
                                CONTENT_MODEL_WIKITEXT,
                                'hallo',
                                false
-                       ),
-                       array(
+                       ],
+                       [
                                'hallo',
                                'MediaWiki:Test.js',
                                null,
@@ -268,11 +275,11 @@ class ContentHandlerTest extends MediaWikiTestCase {
                                CONTENT_MODEL_JAVASCRIPT,
                                'hallo',
                                false
-                       ),
-                       array( serialize( 'hallo' ), 'Dummy:Test', null, "testing", "testing", 'hallo', false ),
+                       ],
+                       [ serialize( 'hallo' ), 'Dummy:Test', null, "testing", "testing", 'hallo', false ],
 
-                       array( 'hallo', 'Help:Test', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, 'hallo', false ),
-                       array(
+                       [ 'hallo', 'Help:Test', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, 'hallo', false ],
+                       [
                                'hallo',
                                'MediaWiki:Test.js',
                                CONTENT_MODEL_CSS,
@@ -280,8 +287,8 @@ class ContentHandlerTest extends MediaWikiTestCase {
                                CONTENT_MODEL_CSS,
                                'hallo',
                                false
-                       ),
-                       array(
+                       ],
+                       [
                                serialize( 'hallo' ),
                                'Dummy:Test',
                                CONTENT_MODEL_CSS,
@@ -289,12 +296,12 @@ class ContentHandlerTest extends MediaWikiTestCase {
                                CONTENT_MODEL_CSS,
                                serialize( 'hallo' ),
                                false
-                       ),
+                       ],
 
-                       array( 'hallo', 'Help:Test', CONTENT_MODEL_WIKITEXT, "testing", null, null, true ),
-                       array( 'hallo', 'MediaWiki:Test.js', CONTENT_MODEL_CSS, "testing", null, null, true ),
-                       array( 'hallo', 'Dummy:Test', CONTENT_MODEL_JAVASCRIPT, "testing", null, null, true ),
-               );
+                       [ 'hallo', 'Help:Test', CONTENT_MODEL_WIKITEXT, "testing", null, null, true ],
+                       [ 'hallo', 'MediaWiki:Test.js', CONTENT_MODEL_CSS, "testing", null, null, true ],
+                       [ 'hallo', 'Dummy:Test', CONTENT_MODEL_JAVASCRIPT, "testing", null, null, true ],
+               ];
        }
 
        /**
@@ -350,6 +357,11 @@ class ContentHandlerTest extends MediaWikiTestCase {
        }
        */
 
+       public function testSupportsCategories() {
+               $handler = new DummyContentHandlerForTesting( CONTENT_MODEL_WIKITEXT );
+               $this->assertTrue( $handler->supportsCategories(), 'content model supports categories' );
+       }
+
        public function testSupportsDirectEditing() {
                $handler = new DummyContentHandlerForTesting( CONTENT_MODEL_JSON );
                $this->assertFalse( $handler->supportsDirectEditing(), 'direct editing is not supported' );
@@ -364,7 +376,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $content = new WikitextContent( 'test text' );
                $ok = ContentHandler::runLegacyHooks(
                        'testRunLegacyHooks',
-                       array( 'foo', &$content, 'bar' ),
+                       [ 'foo', &$content, 'bar' ],
                        false
                );
 
@@ -383,15 +395,15 @@ class ContentHandlerTest extends MediaWikiTestCase {
        }
 
        public function provideGetModelForID() {
-               return array(
-                       array( CONTENT_MODEL_WIKITEXT, 'WikitextContentHandler' ),
-                       array( CONTENT_MODEL_JAVASCRIPT, 'JavaScriptContentHandler' ),
-                       array( CONTENT_MODEL_JSON, 'JsonContentHandler' ),
-                       array( CONTENT_MODEL_CSS, 'CssContentHandler' ),
-                       array( CONTENT_MODEL_TEXT, 'TextContentHandler' ),
-                       array( 'testing', 'DummyContentHandlerForTesting' ),
-                       array( 'testing-callbacks', 'DummyContentHandlerForTesting' ),
-               );
+               return [
+                       [ CONTENT_MODEL_WIKITEXT, 'WikitextContentHandler' ],
+                       [ CONTENT_MODEL_JAVASCRIPT, 'JavaScriptContentHandler' ],
+                       [ CONTENT_MODEL_JSON, 'JsonContentHandler' ],
+                       [ CONTENT_MODEL_CSS, 'CssContentHandler' ],
+                       [ CONTENT_MODEL_TEXT, 'TextContentHandler' ],
+                       [ 'testing', 'DummyContentHandlerForTesting' ],
+                       [ 'testing-callbacks', 'DummyContentHandlerForTesting' ],
+               ];
        }
 
        /**
@@ -403,4 +415,39 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $this->assertInstanceOf( $handlerClass, $handler );
        }
 
+       /**
+        * @covers ContentHandler::getDataForSearchIndex
+        */
+       public function testDataIndexFields() {
+               $mockEngine = $this->getMock( 'SearchEngine' );
+               $title = Title::newFromText( 'Not_Main_Page', NS_MAIN );
+               $page = new WikiPage( $title );
+
+               $this->setTemporaryHook( 'SearchDataForIndex',
+                       function ( &$fields, ContentHandler $handler, WikiPage $page, ParserOutput $output,
+                                  SearchEngine $engine ) {
+                               $fields['testDataField'] = 'test content';
+                       } );
+
+               $output = $page->getContent()->getParserOutput( $title );
+               $data = $page->getContentHandler()->getDataForSearchIndex( $page, $output, $mockEngine );
+               $this->assertArrayHasKey( 'text', $data );
+               $this->assertArrayHasKey( 'text_bytes', $data );
+               $this->assertArrayHasKey( 'language', $data );
+               $this->assertArrayHasKey( 'testDataField', $data );
+               $this->assertEquals( 'test content', $data['testDataField'] );
+       }
+
+       /**
+        * @covers ContentHandler::getParserOutputForIndexing
+        */
+       public function testParserOutputForIndexing() {
+               $title = Title::newFromText( 'Smithee', NS_MAIN );
+               $page = new WikiPage( $title );
+
+               $out = $page->getContentHandler()->getParserOutputForIndexing( $page );
+               $this->assertInstanceOf( ParserOutput::class, $out );
+               $this->assertContains( 'one who smiths', $out->getRawText() );
+       }
+
 }