123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- <?php
- /**
- * @covers ApiModuleManager
- *
- * @group API
- * @group Database
- * @group medium
- */
- class ApiModuleManagerTest extends MediaWikiTestCase {
- private function getModuleManager() {
- $request = new FauxRequest();
- $main = new ApiMain( $request );
- return new ApiModuleManager( $main );
- }
- public function newApiLogin( $main, $action ) {
- return new ApiLogin( $main, $action );
- }
- public function addModuleProvider() {
- return [
- 'plain class' => [
- 'login',
- 'action',
- ApiLogin::class,
- null,
- ],
- 'with factory' => [
- 'login',
- 'action',
- ApiLogin::class,
- [ $this, 'newApiLogin' ],
- ],
- 'with closure' => [
- 'logout',
- 'action',
- ApiLogout::class,
- function ( ApiMain $main, $action ) {
- return new ApiLogout( $main, $action );
- },
- ],
- ];
- }
- /**
- * @dataProvider addModuleProvider
- */
- public function testAddModule( $name, $group, $class, $factory = null ) {
- $moduleManager = $this->getModuleManager();
- $moduleManager->addModule( $name, $group, $class, $factory );
- $this->assertTrue( $moduleManager->isDefined( $name, $group ), 'isDefined' );
- $this->assertNotNull( $moduleManager->getModule( $name, $group, true ), 'getModule' );
- }
- public function addModulesProvider() {
- return [
- 'empty' => [
- [],
- 'action',
- ],
- 'simple' => [
- [
- 'login' => ApiLogin::class,
- 'logout' => ApiLogout::class,
- ],
- 'action',
- ],
- 'with factories' => [
- [
- 'login' => [
- 'class' => ApiLogin::class,
- 'factory' => [ $this, 'newApiLogin' ],
- ],
- 'logout' => [
- 'class' => ApiLogout::class,
- 'factory' => function ( ApiMain $main, $action ) {
- return new ApiLogout( $main, $action );
- },
- ],
- ],
- 'action',
- ],
- ];
- }
- /**
- * @dataProvider addModulesProvider
- */
- public function testAddModules( array $modules, $group ) {
- $moduleManager = $this->getModuleManager();
- $moduleManager->addModules( $modules, $group );
- foreach ( array_keys( $modules ) as $name ) {
- $this->assertTrue( $moduleManager->isDefined( $name, $group ), 'isDefined' );
- $this->assertNotNull( $moduleManager->getModule( $name, $group, true ), 'getModule' );
- }
- $this->assertTrue( true ); // Don't mark the test as risky if $modules is empty
- }
- public function getModuleProvider() {
- $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 [
- 'legacy entry' => [
- $modules,
- 'feedrecentchanges',
- ApiFeedRecentChanges::class,
- ],
- 'just a class' => [
- $modules,
- 'feedcontributions',
- ApiFeedContributions::class,
- ],
- 'with factory' => [
- $modules,
- 'login',
- ApiLogin::class,
- ],
- 'with closure' => [
- $modules,
- 'logout',
- ApiLogout::class,
- ],
- ];
- }
- /**
- * @covers ApiModuleManager::getModule
- * @dataProvider getModuleProvider
- */
- public function testGetModule( $modules, $name, $expectedClass ) {
- $moduleManager = $this->getModuleManager();
- $moduleManager->addModules( $modules, 'test' );
- // should return the right module
- $module1 = $moduleManager->getModule( $name, null, false );
- $this->assertInstanceOf( $expectedClass, $module1 );
- // should pass group check (with caching disabled)
- $module2 = $moduleManager->getModule( $name, 'test', true );
- $this->assertNotNull( $module2 );
- // should use cached instance
- $module3 = $moduleManager->getModule( $name, null, false );
- $this->assertSame( $module1, $module3 );
- // should not use cached instance if caching is disabled
- $module4 = $moduleManager->getModule( $name, null, true );
- $this->assertNotSame( $module1, $module4 );
- }
- /**
- * @covers ApiModuleManager::getModule
- */
- public function testGetModule_null() {
- $modules = [
- 'login' => ApiLogin::class,
- 'logout' => ApiLogout::class,
- ];
- $moduleManager = $this->getModuleManager();
- $moduleManager->addModules( $modules, 'test' );
- $this->assertNull( $moduleManager->getModule( 'quux' ), 'unknown name' );
- $this->assertNull( $moduleManager->getModule( 'login', 'bla' ), 'wrong group' );
- }
- /**
- * @covers ApiModuleManager::getNames
- */
- public function testGetNames() {
- $fooModules = [
- 'login' => ApiLogin::class,
- 'logout' => ApiLogout::class,
- ];
- $barModules = [
- 'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
- 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
- ];
- $moduleManager = $this->getModuleManager();
- $moduleManager->addModules( $fooModules, 'foo' );
- $moduleManager->addModules( $barModules, 'bar' );
- $fooNames = $moduleManager->getNames( 'foo' );
- $this->assertArrayEquals( array_keys( $fooModules ), $fooNames );
- $allNames = $moduleManager->getNames();
- $allModules = array_merge( $fooModules, $barModules );
- $this->assertArrayEquals( array_keys( $allModules ), $allNames );
- }
- /**
- * @covers ApiModuleManager::getNamesWithClasses
- */
- public function testGetNamesWithClasses() {
- $fooModules = [
- 'login' => ApiLogin::class,
- 'logout' => ApiLogout::class,
- ];
- $barModules = [
- 'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
- 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
- ];
- $moduleManager = $this->getModuleManager();
- $moduleManager->addModules( $fooModules, 'foo' );
- $moduleManager->addModules( $barModules, 'bar' );
- $fooNamesWithClasses = $moduleManager->getNamesWithClasses( 'foo' );
- $this->assertArrayEquals( $fooModules, $fooNamesWithClasses );
- $allNamesWithClasses = $moduleManager->getNamesWithClasses();
- $allModules = array_merge( $fooModules, [
- 'feedcontributions' => ApiFeedContributions::class,
- 'feedrecentchanges' => ApiFeedRecentChanges::class,
- ] );
- $this->assertArrayEquals( $allModules, $allNamesWithClasses );
- }
- /**
- * @covers ApiModuleManager::getModuleGroup
- */
- public function testGetModuleGroup() {
- $fooModules = [
- 'login' => ApiLogin::class,
- 'logout' => ApiLogout::class,
- ];
- $barModules = [
- 'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
- 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
- ];
- $moduleManager = $this->getModuleManager();
- $moduleManager->addModules( $fooModules, 'foo' );
- $moduleManager->addModules( $barModules, 'bar' );
- $this->assertEquals( 'foo', $moduleManager->getModuleGroup( 'login' ) );
- $this->assertEquals( 'bar', $moduleManager->getModuleGroup( 'feedrecentchanges' ) );
- $this->assertNull( $moduleManager->getModuleGroup( 'quux' ) );
- }
- /**
- * @covers ApiModuleManager::getGroups
- */
- public function testGetGroups() {
- $fooModules = [
- 'login' => ApiLogin::class,
- 'logout' => ApiLogout::class,
- ];
- $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( [ 'foo', 'bar' ], $groups );
- }
- /**
- * @covers ApiModuleManager::getClassName
- */
- public function testGetClassName() {
- $fooModules = [
- 'login' => ApiLogin::class,
- 'logout' => ApiLogout::class,
- ];
- $barModules = [
- 'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
- 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
- ];
- $moduleManager = $this->getModuleManager();
- $moduleManager->addModules( $fooModules, 'foo' );
- $moduleManager->addModules( $barModules, 'bar' );
- $this->assertEquals(
- ApiLogin::class,
- $moduleManager->getClassName( 'login' )
- );
- $this->assertEquals(
- ApiLogout::class,
- $moduleManager->getClassName( 'logout' )
- );
- $this->assertEquals(
- ApiFeedContributions::class,
- $moduleManager->getClassName( 'feedcontributions' )
- );
- $this->assertEquals(
- ApiFeedRecentChanges::class,
- $moduleManager->getClassName( 'feedrecentchanges' )
- );
- $this->assertFalse(
- $moduleManager->getClassName( 'nonexistentmodule' )
- );
- }
- }
|