Merge "StringUtils: Add a utility for checking if a string is a valid regex"
[lhc/web/wiklou.git] / tests / phpunit / includes / api / ApiModuleManagerTest.php
index 5e74f13..e99e9a9 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+use Wikimedia\ObjectFactory;
+
 /**
  * @covers ApiModuleManager
  *
@@ -12,7 +15,8 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
        private function getModuleManager() {
                $request = new FauxRequest();
                $main = new ApiMain( $request );
-               return new ApiModuleManager( $main );
+
+               return new ApiModuleManager( $main, MediaWikiServices::getInstance()->getObjectFactory() );
        }
 
        public function newApiLogin( $main, $action ) {
@@ -20,74 +24,105 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
        }
 
        public function addModuleProvider() {
-               return array(
-                       'plain class' => array(
+               return [
+                       'plain class' => [
+                               'login',
+                               'action',
+                               ApiLogin::class,
+                               null,
+                       ],
+
+                       'with class and factory' => [
                                'login',
                                'action',
-                               'ApiLogin',
+                               ApiLogin::class,
+                               [ $this, 'newApiLogin' ],
+                       ],
+
+                       'with spec (class only)' => [
+                               'login',
+                               'action',
+                               [
+                                       'class' => ApiLogin::class
+                               ],
                                null,
-                       ),
+                       ],
 
-                       'with factory' => array(
+                       'with spec' => [
                                'login',
                                'action',
-                               'ApiLogin',
-                               array( $this, 'newApiLogin' ),
-                       ),
+                               [
+                                       'class' => ApiLogin::class,
+                                       'factory' => [ $this, 'newApiLogin' ],
+                               ],
+                               null,
+                       ],
 
-                       'with closure' => array(
+                       'with spec (using services)' => [
                                'logout',
                                'action',
-                               'ApiLogout',
-                               function ( ApiMain $main, $action ) {
-                                       return new ApiLogout( $main, $action );
-                               },
-                       ),
-               );
+                               [
+                                       'class' => ApiLogout::class,
+                                       'factory' => function ( ApiMain $main, $action, ObjectFactory $objectFactory ) {
+                                               return new ApiLogout( $main, $action );
+                                       },
+                                       'services' => [
+                                               'ObjectFactory'
+                                       ],
+                               ],
+                               null,
+                       ]
+               ];
        }
 
        /**
         * @dataProvider addModuleProvider
         */
-       public function testAddModule( $name, $group, $class, $factory = null ) {
+       public function testAddModule( $name, $group, $spec, $factory ) {
+               if ( $factory ) {
+                       $this->hideDeprecated(
+                               ApiModuleManager::class . '::addModule with $class and $factory'
+                       );
+               }
+
                $moduleManager = $this->getModuleManager();
-               $moduleManager->addModule( $name, $group, $class, $factory );
+               $moduleManager->addModule( $name, $group, $spec, $factory );
 
                $this->assertTrue( $moduleManager->isDefined( $name, $group ), 'isDefined' );
                $this->assertNotNull( $moduleManager->getModule( $name, $group, true ), 'getModule' );
        }
 
        public function addModulesProvider() {
-               return array(
-                       'empty' => array(
-                               array(),
+               return [
+                       'empty' => [
+                               [],
                                'action',
-                       ),
+                       ],
 
-                       'simple' => array(
-                               array(
-                                       'login' => 'ApiLogin',
-                                       'logout' => 'ApiLogout',
-                               ),
+                       'simple' => [
+                               [
+                                       'login' => ApiLogin::class,
+                                       'logout' => ApiLogout::class,
+                               ],
                                'action',
-                       ),
-
-                       'with factories' => array(
-                               array(
-                                       'login' => array(
-                                               'class' => 'ApiLogin',
-                                               'factory' => array( $this, 'newApiLogin' ),
-                                       ),
-                                       'logout' => array(
-                                               'class' => 'ApiLogout',
+                       ],
+
+                       'with factories' => [
+                               [
+                                       'login' => [
+                                               'class' => ApiLogin::class,
+                                               'factory' => [ $this, 'newApiLogin' ],
+                                       ],
+                                       'logout' => [
+                                               'class' => ApiLogout::class,
                                                'factory' => function ( ApiMain $main, $action ) {
                                                        return new ApiLogout( $main, $action );
                                                },
-                                       ),
-                               ),
+                                       ],
+                               ],
                                'action',
-                       ),
-               );
+                       ],
+               ];
        }
 
        /**
@@ -106,46 +141,46 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
        }
 
        public function getModuleProvider() {
-               $modules = array(
-                       'feedrecentchanges' => 'ApiFeedRecentChanges',
-                       'feedcontributions' => array( 'class' => 'ApiFeedContributions' ),
-                       'login' => array(
-                               'class' => 'ApiLogin',
-                               'factory' => array( $this, 'newApiLogin' ),
-                       ),
-                       'logout' => array(
-                               'class' => 'ApiLogout',
+               $modules = [
+                       'feedrecentchanges' => ApiFeedRecentChanges::class,
+                       'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+                       'login' => [
+                               'class' => ApiLogin::class,
+                               'factory' => [ $this, 'newApiLogin' ],
+                       ],
+                       'logout' => [
+                               'class' => ApiLogout::class,
                                'factory' => function ( ApiMain $main, $action ) {
                                        return new ApiLogout( $main, $action );
                                },
-                       ),
-               );
+                       ],
+               ];
 
-               return array(
-                       'legacy entry' => array(
+               return [
+                       'legacy entry' => [
                                $modules,
                                'feedrecentchanges',
-                               'ApiFeedRecentChanges',
-                       ),
+                               ApiFeedRecentChanges::class,
+                       ],
 
-                       'just a class' => array(
+                       'just a class' => [
                                $modules,
                                'feedcontributions',
-                               'ApiFeedContributions',
-                       ),
+                               ApiFeedContributions::class,
+                       ],
 
-                       'with factory' => array(
+                       'with factory' => [
                                $modules,
                                'login',
-                               'ApiLogin',
-                       ),
+                               ApiLogin::class,
+                       ],
 
-                       'with closure' => array(
+                       'with closure' => [
                                $modules,
                                'logout',
-                               'ApiLogout',
-                       ),
-               );
+                               ApiLogout::class,
+                       ],
+               ];
        }
 
        /**
@@ -177,10 +212,10 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
         * @covers ApiModuleManager::getModule
         */
        public function testGetModule_null() {
-               $modules = array(
-                       'login' => 'ApiLogin',
-                       'logout' => 'ApiLogout',
-               );
+               $modules = [
+                       'login' => ApiLogin::class,
+                       'logout' => ApiLogout::class,
+               ];
 
                $moduleManager = $this->getModuleManager();
                $moduleManager->addModules( $modules, 'test' );
@@ -193,15 +228,15 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
         * @covers ApiModuleManager::getNames
         */
        public function testGetNames() {
-               $fooModules = array(
-                       'login' => 'ApiLogin',
-                       'logout' => 'ApiLogout',
-               );
+               $fooModules = [
+                       'login' => ApiLogin::class,
+                       'logout' => ApiLogout::class,
+               ];
 
-               $barModules = array(
-                       'feedcontributions' => array( 'class' => 'ApiFeedContributions' ),
-                       'feedrecentchanges' => array( 'class' => 'ApiFeedRecentChanges' ),
-               );
+               $barModules = [
+                       'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+                       'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
+               ];
 
                $moduleManager = $this->getModuleManager();
                $moduleManager->addModules( $fooModules, 'foo' );
@@ -219,15 +254,15 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
         * @covers ApiModuleManager::getNamesWithClasses
         */
        public function testGetNamesWithClasses() {
-               $fooModules = array(
-                       'login' => 'ApiLogin',
-                       'logout' => 'ApiLogout',
-               );
+               $fooModules = [
+                       'login' => ApiLogin::class,
+                       'logout' => ApiLogout::class,
+               ];
 
-               $barModules = array(
-                       'feedcontributions' => array( 'class' => 'ApiFeedContributions' ),
-                       'feedrecentchanges' => array( 'class' => 'ApiFeedRecentChanges' ),
-               );
+               $barModules = [
+                       'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+                       'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
+               ];
 
                $moduleManager = $this->getModuleManager();
                $moduleManager->addModules( $fooModules, 'foo' );
@@ -237,10 +272,10 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                $this->assertArrayEquals( $fooModules, $fooNamesWithClasses );
 
                $allNamesWithClasses = $moduleManager->getNamesWithClasses();
-               $allModules = array_merge( $fooModules, array(
-                       'feedcontributions' => 'ApiFeedContributions',
-                       'feedrecentchanges' => 'ApiFeedRecentChanges',
-               ) );
+               $allModules = array_merge( $fooModules, [
+                       'feedcontributions' => ApiFeedContributions::class,
+                       'feedrecentchanges' => ApiFeedRecentChanges::class,
+               ] );
                $this->assertArrayEquals( $allModules, $allNamesWithClasses );
        }
 
@@ -248,15 +283,15 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
         * @covers ApiModuleManager::getModuleGroup
         */
        public function testGetModuleGroup() {
-               $fooModules = array(
-                       'login' => 'ApiLogin',
-                       'logout' => 'ApiLogout',
-               );
+               $fooModules = [
+                       'login' => ApiLogin::class,
+                       'logout' => ApiLogout::class,
+               ];
 
-               $barModules = array(
-                       'feedcontributions' => array( 'class' => 'ApiFeedContributions' ),
-                       'feedrecentchanges' => array( 'class' => 'ApiFeedRecentChanges' ),
-               );
+               $barModules = [
+                       'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+                       'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
+               ];
 
                $moduleManager = $this->getModuleManager();
                $moduleManager->addModules( $fooModules, 'foo' );
@@ -271,60 +306,78 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
         * @covers ApiModuleManager::getGroups
         */
        public function testGetGroups() {
-               $fooModules = array(
-                       'login' => 'ApiLogin',
-                       'logout' => 'ApiLogout',
-               );
+               $fooModules = [
+                       'login' => ApiLogin::class,
+                       'logout' => ApiLogout::class,
+               ];
 
-               $barModules = array(
-                       'feedcontributions' => array( 'class' => 'ApiFeedContributions' ),
-                       'feedrecentchanges' => array( 'class' => 'ApiFeedRecentChanges' ),
-               );
+               $barModules = [
+                       'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+                       'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
+               ];
 
                $moduleManager = $this->getModuleManager();
                $moduleManager->addModules( $fooModules, 'foo' );
                $moduleManager->addModules( $barModules, 'bar' );
 
                $groups = $moduleManager->getGroups();
-               $this->assertArrayEquals( array( 'foo', 'bar' ), $groups );
+               $this->assertArrayEquals( [ 'foo', 'bar' ], $groups );
        }
 
        /**
         * @covers ApiModuleManager::getClassName
         */
        public function testGetClassName() {
-               $fooModules = array(
-                       'login' => 'ApiLogin',
-                       'logout' => 'ApiLogout',
-               );
+               $fooModules = [
+                       'login' => ApiLogin::class,
+                       'logout' => ApiLogout::class,
+               ];
 
-               $barModules = array(
-                       'feedcontributions' => array( 'class' => 'ApiFeedContributions' ),
-                       'feedrecentchanges' => array( 'class' => 'ApiFeedRecentChanges' ),
-               );
+               $barModules = [
+                       'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+                       'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
+               ];
 
                $moduleManager = $this->getModuleManager();
                $moduleManager->addModules( $fooModules, 'foo' );
                $moduleManager->addModules( $barModules, 'bar' );
 
                $this->assertEquals(
-                       'ApiLogin',
+                       ApiLogin::class,
                        $moduleManager->getClassName( 'login' )
                );
                $this->assertEquals(
-                       'ApiLogout',
+                       ApiLogout::class,
                        $moduleManager->getClassName( 'logout' )
                );
                $this->assertEquals(
-                       'ApiFeedContributions',
+                       ApiFeedContributions::class,
                        $moduleManager->getClassName( 'feedcontributions' )
                );
                $this->assertEquals(
-                       'ApiFeedRecentChanges',
+                       ApiFeedRecentChanges::class,
                        $moduleManager->getClassName( 'feedrecentchanges' )
                );
                $this->assertFalse(
                        $moduleManager->getClassName( 'nonexistentmodule' )
                );
        }
+
+       /**
+        * @expectedException \InvalidArgumentException
+        * @expectedExceptionMessage $spec must define a class name
+        */
+       public function testAddModuleWithIncompleteSpec() {
+               $moduleManager = $this->getModuleManager();
+
+               $moduleManager->addModule(
+                       'logout',
+                       'action',
+                       [
+                               'factory' => function ( ApiMain $main, $action ) {
+                                       return new ApiLogout( $main, $action );
+                               },
+                       ]
+               );
+       }
 }