MediaWiki
REL1_24
|
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 }