3 use MediaWiki\MediaWikiServices
;
4 use Wikimedia\ObjectFactory
;
7 * @covers ApiModuleManager
13 class ApiModuleManagerTest
extends MediaWikiTestCase
{
15 private function getModuleManager() {
16 $request = new FauxRequest();
17 $main = new ApiMain( $request );
19 return new ApiModuleManager( $main, MediaWikiServices
::getInstance()->getObjectFactory() );
22 public function newApiLogin( $main, $action ) {
23 return new ApiLogin( $main, $action );
26 public function addModuleProvider() {
35 'with class and factory' => [
39 [ $this, 'newApiLogin' ],
42 'with spec (class only)' => [
46 'class' => ApiLogin
::class
55 'class' => ApiLogin
::class,
56 'factory' => [ $this, 'newApiLogin' ],
61 'with spec (using services)' => [
65 'class' => ApiLogout
::class,
66 'factory' => function ( ApiMain
$main, $action, ObjectFactory
$objectFactory ) {
67 return new ApiLogout( $main, $action );
79 * @dataProvider addModuleProvider
81 public function testAddModule( $name, $group, $spec, $factory ) {
83 $this->hideDeprecated(
84 ApiModuleManager
::class . '::addModule with $class and $factory'
88 $moduleManager = $this->getModuleManager();
89 $moduleManager->addModule( $name, $group, $spec, $factory );
91 $this->assertTrue( $moduleManager->isDefined( $name, $group ), 'isDefined' );
92 $this->assertNotNull( $moduleManager->getModule( $name, $group, true ), 'getModule' );
95 public function addModulesProvider() {
104 'login' => ApiLogin
::class,
105 'logout' => ApiLogout
::class,
110 'with factories' => [
113 'class' => ApiLogin
::class,
114 'factory' => [ $this, 'newApiLogin' ],
117 'class' => ApiLogout
::class,
118 'factory' => function ( ApiMain
$main, $action ) {
119 return new ApiLogout( $main, $action );
129 * @dataProvider addModulesProvider
131 public function testAddModules( array $modules, $group ) {
132 $moduleManager = $this->getModuleManager();
133 $moduleManager->addModules( $modules, $group );
135 foreach ( array_keys( $modules ) as $name ) {
136 $this->assertTrue( $moduleManager->isDefined( $name, $group ), 'isDefined' );
137 $this->assertNotNull( $moduleManager->getModule( $name, $group, true ), 'getModule' );
140 $this->assertTrue( true ); // Don't mark the test as risky if $modules is empty
143 public function getModuleProvider() {
145 'feedrecentchanges' => ApiFeedRecentChanges
::class,
146 'feedcontributions' => [ 'class' => ApiFeedContributions
::class ],
148 'class' => ApiLogin
::class,
149 'factory' => [ $this, 'newApiLogin' ],
152 'class' => ApiLogout
::class,
153 'factory' => function ( ApiMain
$main, $action ) {
154 return new ApiLogout( $main, $action );
163 ApiFeedRecentChanges
::class,
169 ApiFeedContributions
::class,
187 * @covers ApiModuleManager::getModule
188 * @dataProvider getModuleProvider
190 public function testGetModule( $modules, $name, $expectedClass ) {
191 $moduleManager = $this->getModuleManager();
192 $moduleManager->addModules( $modules, 'test' );
194 // should return the right module
195 $module1 = $moduleManager->getModule( $name, null, false );
196 $this->assertInstanceOf( $expectedClass, $module1 );
198 // should pass group check (with caching disabled)
199 $module2 = $moduleManager->getModule( $name, 'test', true );
200 $this->assertNotNull( $module2 );
202 // should use cached instance
203 $module3 = $moduleManager->getModule( $name, null, false );
204 $this->assertSame( $module1, $module3 );
206 // should not use cached instance if caching is disabled
207 $module4 = $moduleManager->getModule( $name, null, true );
208 $this->assertNotSame( $module1, $module4 );
212 * @covers ApiModuleManager::getModule
214 public function testGetModule_null() {
216 'login' => ApiLogin
::class,
217 'logout' => ApiLogout
::class,
220 $moduleManager = $this->getModuleManager();
221 $moduleManager->addModules( $modules, 'test' );
223 $this->assertNull( $moduleManager->getModule( 'quux' ), 'unknown name' );
224 $this->assertNull( $moduleManager->getModule( 'login', 'bla' ), 'wrong group' );
228 * @covers ApiModuleManager::getNames
230 public function testGetNames() {
232 'login' => ApiLogin
::class,
233 'logout' => ApiLogout
::class,
237 'feedcontributions' => [ 'class' => ApiFeedContributions
::class ],
238 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges
::class ],
241 $moduleManager = $this->getModuleManager();
242 $moduleManager->addModules( $fooModules, 'foo' );
243 $moduleManager->addModules( $barModules, 'bar' );
245 $fooNames = $moduleManager->getNames( 'foo' );
246 $this->assertArrayEquals( array_keys( $fooModules ), $fooNames );
248 $allNames = $moduleManager->getNames();
249 $allModules = array_merge( $fooModules, $barModules );
250 $this->assertArrayEquals( array_keys( $allModules ), $allNames );
254 * @covers ApiModuleManager::getNamesWithClasses
256 public function testGetNamesWithClasses() {
258 'login' => ApiLogin
::class,
259 'logout' => ApiLogout
::class,
263 'feedcontributions' => [ 'class' => ApiFeedContributions
::class ],
264 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges
::class ],
267 $moduleManager = $this->getModuleManager();
268 $moduleManager->addModules( $fooModules, 'foo' );
269 $moduleManager->addModules( $barModules, 'bar' );
271 $fooNamesWithClasses = $moduleManager->getNamesWithClasses( 'foo' );
272 $this->assertArrayEquals( $fooModules, $fooNamesWithClasses );
274 $allNamesWithClasses = $moduleManager->getNamesWithClasses();
275 $allModules = array_merge( $fooModules, [
276 'feedcontributions' => ApiFeedContributions
::class,
277 'feedrecentchanges' => ApiFeedRecentChanges
::class,
279 $this->assertArrayEquals( $allModules, $allNamesWithClasses );
283 * @covers ApiModuleManager::getModuleGroup
285 public function testGetModuleGroup() {
287 'login' => ApiLogin
::class,
288 'logout' => ApiLogout
::class,
292 'feedcontributions' => [ 'class' => ApiFeedContributions
::class ],
293 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges
::class ],
296 $moduleManager = $this->getModuleManager();
297 $moduleManager->addModules( $fooModules, 'foo' );
298 $moduleManager->addModules( $barModules, 'bar' );
300 $this->assertEquals( 'foo', $moduleManager->getModuleGroup( 'login' ) );
301 $this->assertEquals( 'bar', $moduleManager->getModuleGroup( 'feedrecentchanges' ) );
302 $this->assertNull( $moduleManager->getModuleGroup( 'quux' ) );
306 * @covers ApiModuleManager::getGroups
308 public function testGetGroups() {
310 'login' => ApiLogin
::class,
311 'logout' => ApiLogout
::class,
315 'feedcontributions' => [ 'class' => ApiFeedContributions
::class ],
316 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges
::class ],
319 $moduleManager = $this->getModuleManager();
320 $moduleManager->addModules( $fooModules, 'foo' );
321 $moduleManager->addModules( $barModules, 'bar' );
323 $groups = $moduleManager->getGroups();
324 $this->assertArrayEquals( [ 'foo', 'bar' ], $groups );
328 * @covers ApiModuleManager::getClassName
330 public function testGetClassName() {
332 'login' => ApiLogin
::class,
333 'logout' => ApiLogout
::class,
337 'feedcontributions' => [ 'class' => ApiFeedContributions
::class ],
338 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges
::class ],
341 $moduleManager = $this->getModuleManager();
342 $moduleManager->addModules( $fooModules, 'foo' );
343 $moduleManager->addModules( $barModules, 'bar' );
347 $moduleManager->getClassName( 'login' )
351 $moduleManager->getClassName( 'logout' )
354 ApiFeedContributions
::class,
355 $moduleManager->getClassName( 'feedcontributions' )
358 ApiFeedRecentChanges
::class,
359 $moduleManager->getClassName( 'feedrecentchanges' )
362 $moduleManager->getClassName( 'nonexistentmodule' )
367 * @expectedException \InvalidArgumentException
368 * @expectedExceptionMessage $spec must define a class name
370 public function testAddModuleWithIncompleteSpec() {
371 $moduleManager = $this->getModuleManager();
373 $moduleManager->addModule(
377 'factory' => function ( ApiMain
$main, $action ) {
378 return new ApiLogout( $main, $action );