<?php
+use MediaWiki\MediaWikiServices;
+use Wikimedia\ObjectFactory;
+
/**
* @covers ApiModuleManager
*
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 ) {
}
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',
- ),
- );
+ ],
+ ];
}
/**
}
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,
+ ],
+ ];
}
/**
* @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' );
* @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' );
* @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' );
$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 );
}
* @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' );
* @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 );
+ },
+ ]
+ );
+ }
}