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 ) {
82 $moduleManager = $this->getModuleManager();
83 $moduleManager->addModule( $name, $group, $spec, $factory );
85 $this->assertTrue( $moduleManager->isDefined( $name, $group ), 'isDefined' );
86 $this->assertNotNull( $moduleManager->getModule( $name, $group, true ), 'getModule' );
89 public function addModulesProvider() {
98 'login' => ApiLogin
::class,
99 'logout' => ApiLogout
::class,
104 'with factories' => [
107 'class' => ApiLogin
::class,
108 'factory' => [ $this, 'newApiLogin' ],
111 'class' => ApiLogout
::class,
112 'factory' => function ( ApiMain
$main, $action ) {
113 return new ApiLogout( $main, $action );
123 * @dataProvider addModulesProvider
125 public function testAddModules( array $modules, $group ) {
126 $moduleManager = $this->getModuleManager();
127 $moduleManager->addModules( $modules, $group );
129 foreach ( array_keys( $modules ) as $name ) {
130 $this->assertTrue( $moduleManager->isDefined( $name, $group ), 'isDefined' );
131 $this->assertNotNull( $moduleManager->getModule( $name, $group, true ), 'getModule' );
134 $this->assertTrue( true ); // Don't mark the test as risky if $modules is empty
137 public function getModuleProvider() {
139 'feedrecentchanges' => ApiFeedRecentChanges
::class,
140 'feedcontributions' => [ 'class' => ApiFeedContributions
::class ],
142 'class' => ApiLogin
::class,
143 'factory' => [ $this, 'newApiLogin' ],
146 'class' => ApiLogout
::class,
147 'factory' => function ( ApiMain
$main, $action ) {
148 return new ApiLogout( $main, $action );
157 ApiFeedRecentChanges
::class,
163 ApiFeedContributions
::class,
181 * @covers ApiModuleManager::getModule
182 * @dataProvider getModuleProvider
184 public function testGetModule( $modules, $name, $expectedClass ) {
185 $moduleManager = $this->getModuleManager();
186 $moduleManager->addModules( $modules, 'test' );
188 // should return the right module
189 $module1 = $moduleManager->getModule( $name, null, false );
190 $this->assertInstanceOf( $expectedClass, $module1 );
192 // should pass group check (with caching disabled)
193 $module2 = $moduleManager->getModule( $name, 'test', true );
194 $this->assertNotNull( $module2 );
196 // should use cached instance
197 $module3 = $moduleManager->getModule( $name, null, false );
198 $this->assertSame( $module1, $module3 );
200 // should not use cached instance if caching is disabled
201 $module4 = $moduleManager->getModule( $name, null, true );
202 $this->assertNotSame( $module1, $module4 );
206 * @covers ApiModuleManager::getModule
208 public function testGetModule_null() {
210 'login' => ApiLogin
::class,
211 'logout' => ApiLogout
::class,
214 $moduleManager = $this->getModuleManager();
215 $moduleManager->addModules( $modules, 'test' );
217 $this->assertNull( $moduleManager->getModule( 'quux' ), 'unknown name' );
218 $this->assertNull( $moduleManager->getModule( 'login', 'bla' ), 'wrong group' );
222 * @covers ApiModuleManager::getNames
224 public function testGetNames() {
226 'login' => ApiLogin
::class,
227 'logout' => ApiLogout
::class,
231 'feedcontributions' => [ 'class' => ApiFeedContributions
::class ],
232 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges
::class ],
235 $moduleManager = $this->getModuleManager();
236 $moduleManager->addModules( $fooModules, 'foo' );
237 $moduleManager->addModules( $barModules, 'bar' );
239 $fooNames = $moduleManager->getNames( 'foo' );
240 $this->assertArrayEquals( array_keys( $fooModules ), $fooNames );
242 $allNames = $moduleManager->getNames();
243 $allModules = array_merge( $fooModules, $barModules );
244 $this->assertArrayEquals( array_keys( $allModules ), $allNames );
248 * @covers ApiModuleManager::getNamesWithClasses
250 public function testGetNamesWithClasses() {
252 'login' => ApiLogin
::class,
253 'logout' => ApiLogout
::class,
257 'feedcontributions' => [ 'class' => ApiFeedContributions
::class ],
258 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges
::class ],
261 $moduleManager = $this->getModuleManager();
262 $moduleManager->addModules( $fooModules, 'foo' );
263 $moduleManager->addModules( $barModules, 'bar' );
265 $fooNamesWithClasses = $moduleManager->getNamesWithClasses( 'foo' );
266 $this->assertArrayEquals( $fooModules, $fooNamesWithClasses );
268 $allNamesWithClasses = $moduleManager->getNamesWithClasses();
269 $allModules = array_merge( $fooModules, [
270 'feedcontributions' => ApiFeedContributions
::class,
271 'feedrecentchanges' => ApiFeedRecentChanges
::class,
273 $this->assertArrayEquals( $allModules, $allNamesWithClasses );
277 * @covers ApiModuleManager::getModuleGroup
279 public function testGetModuleGroup() {
281 'login' => ApiLogin
::class,
282 'logout' => ApiLogout
::class,
286 'feedcontributions' => [ 'class' => ApiFeedContributions
::class ],
287 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges
::class ],
290 $moduleManager = $this->getModuleManager();
291 $moduleManager->addModules( $fooModules, 'foo' );
292 $moduleManager->addModules( $barModules, 'bar' );
294 $this->assertEquals( 'foo', $moduleManager->getModuleGroup( 'login' ) );
295 $this->assertEquals( 'bar', $moduleManager->getModuleGroup( 'feedrecentchanges' ) );
296 $this->assertNull( $moduleManager->getModuleGroup( 'quux' ) );
300 * @covers ApiModuleManager::getGroups
302 public function testGetGroups() {
304 'login' => ApiLogin
::class,
305 'logout' => ApiLogout
::class,
309 'feedcontributions' => [ 'class' => ApiFeedContributions
::class ],
310 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges
::class ],
313 $moduleManager = $this->getModuleManager();
314 $moduleManager->addModules( $fooModules, 'foo' );
315 $moduleManager->addModules( $barModules, 'bar' );
317 $groups = $moduleManager->getGroups();
318 $this->assertArrayEquals( [ 'foo', 'bar' ], $groups );
322 * @covers ApiModuleManager::getClassName
324 public function testGetClassName() {
326 'login' => ApiLogin
::class,
327 'logout' => ApiLogout
::class,
331 'feedcontributions' => [ 'class' => ApiFeedContributions
::class ],
332 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges
::class ],
335 $moduleManager = $this->getModuleManager();
336 $moduleManager->addModules( $fooModules, 'foo' );
337 $moduleManager->addModules( $barModules, 'bar' );
341 $moduleManager->getClassName( 'login' )
345 $moduleManager->getClassName( 'logout' )
348 ApiFeedContributions
::class,
349 $moduleManager->getClassName( 'feedcontributions' )
352 ApiFeedRecentChanges
::class,
353 $moduleManager->getClassName( 'feedrecentchanges' )
356 $moduleManager->getClassName( 'nonexistentmodule' )
361 * @expectedException \InvalidArgumentException
362 * @expectedExceptionMessage $spec must define a class name
364 public function testAddModuleWithIncompleteSpec() {
365 $moduleManager = $this->getModuleManager();
367 $moduleManager->addModule(
371 'factory' => function ( ApiMain
$main, $action ) {
372 return new ApiLogout( $main, $action );