MediaWiki  REL1_24
ApiModuleManagerTest.php
Go to the documentation of this file.
00001 <?php
00002 
00010 class ApiModuleManagerTest extends MediaWikiTestCase {
00011 
00012     private function getModuleManager() {
00013         $request = new FauxRequest();
00014         $main = new ApiMain( $request );
00015         return new ApiModuleManager( $main );
00016     }
00017 
00018     public function newApiLogin( $main, $action ) {
00019         return new ApiLogin( $main, $action );
00020     }
00021 
00022     public function addModuleProvider() {
00023         return array(
00024             'plain class' => array(
00025                 'login',
00026                 'action',
00027                 'ApiLogin',
00028                 null,
00029             ),
00030 
00031             'with factory' => array(
00032                 'login',
00033                 'action',
00034                 'ApiLogin',
00035                 array( $this, 'newApiLogin' ),
00036             ),
00037 
00038             'with closure' => array(
00039                 'logout',
00040                 'action',
00041                 'ApiLogout',
00042                 function ( ApiMain $main, $action ) {
00043                     return new ApiLogout( $main, $action );
00044                 },
00045             ),
00046         );
00047     }
00048 
00052     public function testAddModule( $name, $group, $class, $factory = null ) {
00053         $moduleManager = $this->getModuleManager();
00054         $moduleManager->addModule( $name, $group, $class, $factory );
00055 
00056         $this->assertTrue( $moduleManager->isDefined( $name, $group ), 'isDefined' );
00057         $this->assertNotNull( $moduleManager->getModule( $name, $group, true ), 'getModule' );
00058     }
00059 
00060     public function addModulesProvider() {
00061         return array(
00062             'empty' => array(
00063                 array(),
00064                 'action',
00065             ),
00066 
00067             'simple' => array(
00068                 array(
00069                     'login' => 'ApiLogin',
00070                     'logout' => 'ApiLogout',
00071                 ),
00072                 'action',
00073             ),
00074 
00075             'with factories' => array(
00076                 array(
00077                     'login' => array(
00078                         'class' => 'ApiLogin',
00079                         'factory' => array( $this, 'newApiLogin' ),
00080                     ),
00081                     'logout' => array(
00082                         'class' => 'ApiLogout',
00083                         'factory' => function ( ApiMain $main, $action ) {
00084                             return new ApiLogout( $main, $action );
00085                         },
00086                     ),
00087                 ),
00088                 'action',
00089             ),
00090         );
00091     }
00092 
00096     public function testAddModules( array $modules, $group ) {
00097         $moduleManager = $this->getModuleManager();
00098         $moduleManager->addModules( $modules, $group );
00099 
00100         foreach ( array_keys( $modules ) as $name ) {
00101             $this->assertTrue( $moduleManager->isDefined( $name, $group ), 'isDefined' );
00102             $this->assertNotNull( $moduleManager->getModule( $name, $group, true ), 'getModule' );
00103         }
00104 
00105         $this->assertTrue( true ); // Don't mark the test as risky if $modules is empty
00106     }
00107 
00108     public function getModuleProvider() {
00109         $modules = array(
00110             'feedrecentchanges' => 'ApiFeedRecentChanges',
00111             'feedcontributions' => array( 'class' => 'ApiFeedContributions' ),
00112             'login' => array(
00113                 'class' => 'ApiLogin',
00114                 'factory' => array( $this, 'newApiLogin' ),
00115             ),
00116             'logout' => array(
00117                 'class' => 'ApiLogout',
00118                 'factory' => function ( ApiMain $main, $action ) {
00119                     return new ApiLogout( $main, $action );
00120                 },
00121             ),
00122         );
00123 
00124         return array(
00125             'legacy entry' => array(
00126                 $modules,
00127                 'feedrecentchanges',
00128                 'ApiFeedRecentChanges',
00129             ),
00130 
00131             'just a class' => array(
00132                 $modules,
00133                 'feedcontributions',
00134                 'ApiFeedContributions',
00135             ),
00136 
00137             'with factory' => array(
00138                 $modules,
00139                 'login',
00140                 'ApiLogin',
00141             ),
00142 
00143             'with closure' => array(
00144                 $modules,
00145                 'logout',
00146                 'ApiLogout',
00147             ),
00148         );
00149     }
00150 
00155     public function testGetModule( $modules, $name, $expectedClass ) {
00156         $moduleManager = $this->getModuleManager();
00157         $moduleManager->addModules( $modules, 'test' );
00158 
00159         // should return the right module
00160         $module1 = $moduleManager->getModule( $name, null, false );
00161         $this->assertInstanceOf( $expectedClass, $module1 );
00162 
00163         // should pass group check (with caching disabled)
00164         $module2 = $moduleManager->getModule( $name, 'test', true );
00165         $this->assertNotNull( $module2 );
00166 
00167         // should use cached instance
00168         $module3 = $moduleManager->getModule( $name, null, false );
00169         $this->assertSame( $module1, $module3 );
00170 
00171         // should not use cached instance if caching is disabled
00172         $module4 = $moduleManager->getModule( $name, null, true );
00173         $this->assertNotSame( $module1, $module4 );
00174     }
00175 
00179     public function testGetModule_null() {
00180         $modules = array(
00181             'login' => 'ApiLogin',
00182             'logout' => 'ApiLogout',
00183         );
00184 
00185         $moduleManager = $this->getModuleManager();
00186         $moduleManager->addModules( $modules, 'test' );
00187 
00188         $this->assertNull( $moduleManager->getModule( 'quux' ), 'unknown name' );
00189         $this->assertNull( $moduleManager->getModule( 'login', 'bla' ), 'wrong group' );
00190     }
00191 
00195     public function testGetNames() {
00196         $fooModules = array(
00197             'login' => 'ApiLogin',
00198             'logout' => 'ApiLogout',
00199         );
00200 
00201         $barModules = array(
00202             'feedcontributions' => array( 'class' => 'ApiFeedContributions' ),
00203             'feedrecentchanges' => array( 'class' => 'ApiFeedRecentChanges' ),
00204         );
00205 
00206         $moduleManager = $this->getModuleManager();
00207         $moduleManager->addModules( $fooModules, 'foo' );
00208         $moduleManager->addModules( $barModules, 'bar' );
00209 
00210         $fooNames = $moduleManager->getNames( 'foo' );
00211         $this->assertArrayEquals( array_keys( $fooModules ), $fooNames );
00212 
00213         $allNames = $moduleManager->getNames();
00214         $allModules = array_merge( $fooModules, $barModules );
00215         $this->assertArrayEquals( array_keys( $allModules ), $allNames );
00216     }
00217 
00221     public function testGetNamesWithClasses() {
00222         $fooModules = array(
00223             'login' => 'ApiLogin',
00224             'logout' => 'ApiLogout',
00225         );
00226 
00227         $barModules = array(
00228             'feedcontributions' => array( 'class' => 'ApiFeedContributions' ),
00229             'feedrecentchanges' => array( 'class' => 'ApiFeedRecentChanges' ),
00230         );
00231 
00232         $moduleManager = $this->getModuleManager();
00233         $moduleManager->addModules( $fooModules, 'foo' );
00234         $moduleManager->addModules( $barModules, 'bar' );
00235 
00236         $fooNamesWithClasses = $moduleManager->getNamesWithClasses( 'foo' );
00237         $this->assertArrayEquals( $fooModules, $fooNamesWithClasses );
00238 
00239         $allNamesWithClasses = $moduleManager->getNamesWithClasses();
00240         $allModules = array_merge( $fooModules, array(
00241             'feedcontributions' => 'ApiFeedContributions',
00242             'feedrecentchanges' => 'ApiFeedRecentChanges',
00243         ) );
00244         $this->assertArrayEquals( $allModules, $allNamesWithClasses );
00245     }
00246 
00250     public function testGetModuleGroup() {
00251         $fooModules = array(
00252             'login' => 'ApiLogin',
00253             'logout' => 'ApiLogout',
00254         );
00255 
00256         $barModules = array(
00257             'feedcontributions' => array( 'class' => 'ApiFeedContributions' ),
00258             'feedrecentchanges' => array( 'class' => 'ApiFeedRecentChanges' ),
00259         );
00260 
00261         $moduleManager = $this->getModuleManager();
00262         $moduleManager->addModules( $fooModules, 'foo' );
00263         $moduleManager->addModules( $barModules, 'bar' );
00264 
00265         $this->assertEquals( 'foo', $moduleManager->getModuleGroup( 'login' ) );
00266         $this->assertEquals( 'bar', $moduleManager->getModuleGroup( 'feedrecentchanges' ) );
00267         $this->assertNull( $moduleManager->getModuleGroup( 'quux' ) );
00268     }
00269 
00273     public function testGetGroups() {
00274         $fooModules = array(
00275             'login' => 'ApiLogin',
00276             'logout' => 'ApiLogout',
00277         );
00278 
00279         $barModules = array(
00280             'feedcontributions' => array( 'class' => 'ApiFeedContributions' ),
00281             'feedrecentchanges' => array( 'class' => 'ApiFeedRecentChanges' ),
00282         );
00283 
00284         $moduleManager = $this->getModuleManager();
00285         $moduleManager->addModules( $fooModules, 'foo' );
00286         $moduleManager->addModules( $barModules, 'bar' );
00287 
00288         $groups = $moduleManager->getGroups();
00289         $this->assertArrayEquals( array( 'foo', 'bar' ), $groups );
00290     }
00291 
00295     public function testGetClassName() {
00296         $fooModules = array(
00297             'login' => 'ApiLogin',
00298             'logout' => 'ApiLogout',
00299         );
00300 
00301         $barModules = array(
00302             'feedcontributions' => array( 'class' => 'ApiFeedContributions' ),
00303             'feedrecentchanges' => array( 'class' => 'ApiFeedRecentChanges' ),
00304         );
00305 
00306         $moduleManager = $this->getModuleManager();
00307         $moduleManager->addModules( $fooModules, 'foo' );
00308         $moduleManager->addModules( $barModules, 'bar' );
00309 
00310         $this->assertEquals( 'ApiLogin', $moduleManager->getClassName( 'login' ) );
00311         $this->assertEquals( 'ApiLogout', $moduleManager->getClassName( 'logout' ) );
00312         $this->assertEquals( 'ApiFeedContributions', $moduleManager->getClassName( 'feedcontributions' ) );
00313         $this->assertEquals( 'ApiFeedRecentChanges', $moduleManager->getClassName( 'feedrecentchanges' ) );
00314         $this->assertFalse( $moduleManager->getClassName( 'nonexistentmodule' ) );
00315     }
00316 
00317 
00318 }