diff options
Diffstat (limited to 'tests/lib/App/AppManagerTest.php')
-rw-r--r-- | tests/lib/App/AppManagerTest.php | 463 |
1 files changed, 374 insertions, 89 deletions
diff --git a/tests/lib/App/AppManagerTest.php b/tests/lib/App/AppManagerTest.php index de515837406..6637c529a1e 100644 --- a/tests/lib/App/AppManagerTest.php +++ b/tests/lib/App/AppManagerTest.php @@ -3,28 +3,32 @@ declare(strict_types=1); /** - * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace Test\App; use OC\App\AppManager; use OC\AppConfig; +use OC\Config\ConfigManager; use OCP\App\AppPathNotFoundException; +use OCP\App\Events\AppDisableEvent; +use OCP\App\Events\AppEnableEvent; use OCP\App\IAppManager; +use OCP\EventDispatcher\IEventDispatcher; use OCP\ICache; use OCP\ICacheFactory; use OCP\IConfig; use OCP\IGroup; use OCP\IGroupManager; +use OCP\IURLGenerator; use OCP\IUser; use OCP\IUserSession; +use OCP\ServerVersion; use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Test\TestCase; /** @@ -33,10 +37,7 @@ use Test\TestCase; * @package Test\App */ class AppManagerTest extends TestCase { - /** - * @return AppConfig|MockObject - */ - protected function getAppConfig() { + protected function getAppConfig(): AppConfig&MockObject { $appConfig = []; $config = $this->createMock(AppConfig::class); @@ -47,7 +48,7 @@ class AppManagerTest extends TestCase { }); $config->expects($this->any()) ->method('setValue') - ->willReturnCallback(function ($app, $key, $value) use (&$appConfig) { + ->willReturnCallback(function ($app, $key, $value) use (&$appConfig): void { if (!isset($appConfig[$app])) { $appConfig[$app] = []; } @@ -68,33 +69,32 @@ class AppManagerTest extends TestCase { return $values; } }); + $config->expects($this->any()) + ->method('searchValues') + ->willReturnCallback(function ($key, $lazy, $type) use (&$appConfig) { + $values = []; + foreach ($appConfig as $appid => $appData) { + if (isset($appData[$key])) { + $values[$appid] = $appData[$key]; + } + } + return $values; + }); return $config; } - /** @var IUserSession|MockObject */ - protected $userSession; - - /** @var IConfig|MockObject */ - private $config; - - /** @var IGroupManager|MockObject */ - protected $groupManager; - - /** @var AppConfig|MockObject */ - protected $appConfig; - - /** @var ICache|MockObject */ - protected $cache; - - /** @var ICacheFactory|MockObject */ - protected $cacheFactory; - - /** @var EventDispatcherInterface|MockObject */ - protected $eventDispatcher; - - /** @var LoggerInterface|MockObject */ - protected $logger; + protected IUserSession&MockObject $userSession; + private IConfig&MockObject $config; + protected IGroupManager&MockObject $groupManager; + protected AppConfig&MockObject $appConfig; + protected ICache&MockObject $cache; + protected ICacheFactory&MockObject $cacheFactory; + protected IEventDispatcher&MockObject $eventDispatcher; + protected LoggerInterface&MockObject $logger; + protected IURLGenerator&MockObject $urlGenerator; + protected ServerVersion&MockObject $serverVersion; + protected ConfigManager&MockObject $configManager; /** @var IAppManager */ protected $manager; @@ -108,46 +108,142 @@ class AppManagerTest extends TestCase { $this->appConfig = $this->getAppConfig(); $this->cacheFactory = $this->createMock(ICacheFactory::class); $this->cache = $this->createMock(ICache::class); - $this->eventDispatcher = $this->createMock(EventDispatcherInterface::class); + $this->eventDispatcher = $this->createMock(IEventDispatcher::class); $this->logger = $this->createMock(LoggerInterface::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->serverVersion = $this->createMock(ServerVersion::class); + $this->configManager = $this->createMock(ConfigManager::class); + + $this->overwriteService(AppConfig::class, $this->appConfig); + $this->overwriteService(IURLGenerator::class, $this->urlGenerator); + $this->cacheFactory->expects($this->any()) ->method('createDistributed') ->with('settings') ->willReturn($this->cache); + + $this->config + ->method('getSystemValueBool') + ->with('installed', false) + ->willReturn(true); + $this->manager = new AppManager( $this->userSession, $this->config, - $this->appConfig, $this->groupManager, $this->cacheFactory, $this->eventDispatcher, - $this->logger + $this->logger, + $this->serverVersion, + $this->configManager, ); } - protected function expectClearCache() { - $this->cache->expects($this->once()) - ->method('clear') - ->with('listApps'); + #[\PHPUnit\Framework\Attributes\DataProvider('dataGetAppIcon')] + public function testGetAppIcon($callback, ?bool $dark, ?string $expected): void { + $this->urlGenerator->expects($this->atLeastOnce()) + ->method('imagePath') + ->willReturnCallback($callback); + + if ($dark !== null) { + $this->assertEquals($expected, $this->manager->getAppIcon('test', $dark)); + } else { + $this->assertEquals($expected, $this->manager->getAppIcon('test')); + } + } + + public static function dataGetAppIcon(): array { + $nothing = function ($appId): void { + self::assertEquals('test', $appId); + throw new \RuntimeException(); + }; + + $createCallback = function ($workingIcons) { + return function ($appId, $icon) use ($workingIcons) { + self::assertEquals('test', $appId); + if (in_array($icon, $workingIcons)) { + return '/path/' . $icon; + } + throw new \RuntimeException(); + }; + }; + + return [ + 'does not find anything' => [ + $nothing, + false, + null, + ], + 'nothing if request dark but only bright available' => [ + $createCallback(['app.svg']), + true, + null, + ], + 'nothing if request bright but only dark available' => [ + $createCallback(['app-dark.svg']), + false, + null, + ], + 'bright and only app.svg' => [ + $createCallback(['app.svg']), + false, + '/path/app.svg', + ], + 'dark and only app-dark.svg' => [ + $createCallback(['app-dark.svg']), + true, + '/path/app-dark.svg', + ], + 'dark only appname -dark.svg' => [ + $createCallback(['test-dark.svg']), + true, + '/path/test-dark.svg', + ], + 'bright and only appname.svg' => [ + $createCallback(['test.svg']), + false, + '/path/test.svg', + ], + 'priotize custom over default' => [ + $createCallback(['app.svg', 'test.svg']), + false, + '/path/test.svg', + ], + 'defaults to bright' => [ + $createCallback(['test-dark.svg', 'test.svg']), + null, + '/path/test.svg', + ], + 'no dark icon on default' => [ + $createCallback(['test-dark.svg', 'test.svg', 'app-dark.svg', 'app.svg']), + false, + '/path/test.svg', + ], + 'no bright icon on dark' => [ + $createCallback(['test-dark.svg', 'test.svg', 'app-dark.svg', 'app.svg']), + true, + '/path/test-dark.svg', + ], + ]; } - public function testEnableApp() { - $this->expectClearCache(); + public function testEnableApp(): void { // making sure "files_trashbin" is disabled if ($this->manager->isEnabledForUser('files_trashbin')) { $this->manager->disableApp('files_trashbin'); } + $this->eventDispatcher->expects($this->once())->method('dispatchTyped')->with(new AppEnableEvent('files_trashbin')); $this->manager->enableApp('files_trashbin'); $this->assertEquals('yes', $this->appConfig->getValue('files_trashbin', 'enabled', 'no')); } - public function testDisableApp() { - $this->expectClearCache(); + public function testDisableApp(): void { + $this->eventDispatcher->expects($this->once())->method('dispatchTyped')->with(new AppDisableEvent('files_trashbin')); $this->manager->disableApp('files_trashbin'); $this->assertEquals('no', $this->appConfig->getValue('files_trashbin', 'enabled', 'no')); } - public function testNotEnableIfNotInstalled() { + public function testNotEnableIfNotInstalled(): void { try { $this->manager->enableApp('some_random_name_which_i_hope_is_not_an_app'); $this->assertFalse(true, 'If this line is reached the expected exception is not thrown.'); @@ -161,7 +257,7 @@ class AppManagerTest extends TestCase { )); } - public function testEnableAppForGroups() { + public function testEnableAppForGroups(): void { $group1 = $this->createMock(IGroup::class); $group1->method('getGID') ->willReturn('group1'); @@ -170,14 +266,20 @@ class AppManagerTest extends TestCase { ->willReturn('group2'); $groups = [$group1, $group2]; - $this->expectClearCache(); /** @var AppManager|MockObject $manager */ $manager = $this->getMockBuilder(AppManager::class) ->setConstructorArgs([ - $this->userSession, $this->config, $this->appConfig, $this->groupManager, $this->cacheFactory, $this->eventDispatcher, $this->logger + $this->userSession, + $this->config, + $this->groupManager, + $this->cacheFactory, + $this->eventDispatcher, + $this->logger, + $this->serverVersion, + $this->configManager, ]) - ->setMethods([ + ->onlyMethods([ 'getAppPath', ]) ->getMock(); @@ -187,11 +289,13 @@ class AppManagerTest extends TestCase { ->with('test') ->willReturn('apps/test'); + $this->eventDispatcher->expects($this->once())->method('dispatchTyped')->with(new AppEnableEvent('test', ['group1', 'group2'])); + $manager->enableAppForGroups('test', $groups); $this->assertEquals('["group1","group2"]', $this->appConfig->getValue('test', 'enabled', 'no')); } - public function dataEnableAppForGroupsAllowedTypes() { + public static function dataEnableAppForGroupsAllowedTypes(): array { return [ [[]], [[ @@ -204,11 +308,10 @@ class AppManagerTest extends TestCase { } /** - * @dataProvider dataEnableAppForGroupsAllowedTypes - * * @param array $appInfo */ - public function testEnableAppForGroupsAllowedTypes(array $appInfo) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataEnableAppForGroupsAllowedTypes')] + public function testEnableAppForGroupsAllowedTypes(array $appInfo): void { $group1 = $this->createMock(IGroup::class); $group1->method('getGID') ->willReturn('group1'); @@ -217,14 +320,20 @@ class AppManagerTest extends TestCase { ->willReturn('group2'); $groups = [$group1, $group2]; - $this->expectClearCache(); /** @var AppManager|MockObject $manager */ $manager = $this->getMockBuilder(AppManager::class) ->setConstructorArgs([ - $this->userSession, $this->config, $this->appConfig, $this->groupManager, $this->cacheFactory, $this->eventDispatcher, $this->logger + $this->userSession, + $this->config, + $this->groupManager, + $this->cacheFactory, + $this->eventDispatcher, + $this->logger, + $this->serverVersion, + $this->configManager, ]) - ->setMethods([ + ->onlyMethods([ 'getAppPath', 'getAppInfo', ]) @@ -233,18 +342,20 @@ class AppManagerTest extends TestCase { $manager->expects($this->once()) ->method('getAppPath') ->with('test') - ->willReturn(null); + ->willReturn(''); $manager->expects($this->once()) ->method('getAppInfo') ->with('test') ->willReturn($appInfo); + $this->eventDispatcher->expects($this->once())->method('dispatchTyped')->with(new AppEnableEvent('test', ['group1', 'group2'])); + $manager->enableAppForGroups('test', $groups); $this->assertEquals('["group1","group2"]', $this->appConfig->getValue('test', 'enabled', 'no')); } - public function dataEnableAppForGroupsForbiddenTypes() { + public static function dataEnableAppForGroupsForbiddenTypes(): array { return [ ['filesystem'], ['prelogin'], @@ -255,12 +366,12 @@ class AppManagerTest extends TestCase { } /** - * @dataProvider dataEnableAppForGroupsForbiddenTypes * * @param string $type * */ - public function testEnableAppForGroupsForbiddenTypes($type) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataEnableAppForGroupsForbiddenTypes')] + public function testEnableAppForGroupsForbiddenTypes($type): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('test can\'t be enabled for groups.'); @@ -276,9 +387,16 @@ class AppManagerTest extends TestCase { /** @var AppManager|MockObject $manager */ $manager = $this->getMockBuilder(AppManager::class) ->setConstructorArgs([ - $this->userSession, $this->config, $this->appConfig, $this->groupManager, $this->cacheFactory, $this->eventDispatcher, $this->logger + $this->userSession, + $this->config, + $this->groupManager, + $this->cacheFactory, + $this->eventDispatcher, + $this->logger, + $this->serverVersion, + $this->configManager, ]) - ->setMethods([ + ->onlyMethods([ 'getAppPath', 'getAppInfo', ]) @@ -287,7 +405,7 @@ class AppManagerTest extends TestCase { $manager->expects($this->once()) ->method('getAppPath') ->with('test') - ->willReturn(null); + ->willReturn(''); $manager->expects($this->once()) ->method('getAppInfo') @@ -296,22 +414,24 @@ class AppManagerTest extends TestCase { 'types' => [$type], ]); + $this->eventDispatcher->expects($this->never())->method('dispatchTyped')->with(new AppEnableEvent('test', ['group1', 'group2'])); + $manager->enableAppForGroups('test', $groups); } - public function testIsInstalledEnabled() { + public function testIsInstalledEnabled(): void { $this->appConfig->setValue('test', 'enabled', 'yes'); - $this->assertTrue($this->manager->isInstalled('test')); + $this->assertTrue($this->manager->isEnabledForAnyone('test')); } - public function testIsInstalledDisabled() { + public function testIsInstalledDisabled(): void { $this->appConfig->setValue('test', 'enabled', 'no'); - $this->assertFalse($this->manager->isInstalled('test')); + $this->assertFalse($this->manager->isEnabledForAnyone('test')); } - public function testIsInstalledEnabledForGroups() { + public function testIsInstalledEnabledForGroups(): void { $this->appConfig->setValue('test', 'enabled', '["foo"]'); - $this->assertTrue($this->manager->isInstalled('test')); + $this->assertTrue($this->manager->isEnabledForAnyone('test')); } private function newUser($uid) { @@ -322,23 +442,23 @@ class AppManagerTest extends TestCase { return $user; } - public function testIsEnabledForUserEnabled() { + public function testIsEnabledForUserEnabled(): void { $this->appConfig->setValue('test', 'enabled', 'yes'); $user = $this->newUser('user1'); $this->assertTrue($this->manager->isEnabledForUser('test', $user)); } - public function testIsEnabledForUserDisabled() { + public function testIsEnabledForUserDisabled(): void { $this->appConfig->setValue('test', 'enabled', 'no'); $user = $this->newUser('user1'); $this->assertFalse($this->manager->isEnabledForUser('test', $user)); } - public function testGetAppPath() { + public function testGetAppPath(): void { $this->assertEquals(\OC::$SERVERROOT . '/apps/files', $this->manager->getAppPath('files')); } - public function testGetAppPathSymlink() { + public function testGetAppPathSymlink(): void { $fakeAppDirname = sha1(uniqid('test', true)); $fakeAppPath = sys_get_temp_dir() . '/' . $fakeAppDirname; $fakeAppLink = \OC::$SERVERROOT . '/' . $fakeAppDirname; @@ -367,12 +487,12 @@ class AppManagerTest extends TestCase { $this->assertEquals($fakeAppLink . '/test-test-app', $generatedAppPath); } - public function testGetAppPathFail() { + public function testGetAppPathFail(): void { $this->expectException(AppPathNotFoundException::class); $this->manager->getAppPath('testnotexisting'); } - public function testIsEnabledForUserEnabledForGroup() { + public function testIsEnabledForUserEnabledForGroup(): void { $user = $this->newUser('user1'); $this->groupManager->expects($this->once()) ->method('getUserGroupIds') @@ -383,7 +503,7 @@ class AppManagerTest extends TestCase { $this->assertTrue($this->manager->isEnabledForUser('test', $user)); } - public function testIsEnabledForUserDisabledForGroup() { + public function testIsEnabledForUserDisabledForGroup(): void { $user = $this->newUser('user1'); $this->groupManager->expects($this->once()) ->method('getUserGroupIds') @@ -394,12 +514,12 @@ class AppManagerTest extends TestCase { $this->assertFalse($this->manager->isEnabledForUser('test', $user)); } - public function testIsEnabledForUserLoggedOut() { + public function testIsEnabledForUserLoggedOut(): void { $this->appConfig->setValue('test', 'enabled', '["foo"]'); $this->assertFalse($this->manager->isEnabledForUser('test')); } - public function testIsEnabledForUserLoggedIn() { + public function testIsEnabledForUserLoggedIn(): void { $user = $this->newUser('user1'); $this->userSession->expects($this->once()) @@ -414,7 +534,7 @@ class AppManagerTest extends TestCase { $this->assertTrue($this->manager->isEnabledForUser('test')); } - public function testGetInstalledApps() { + public function testGetEnabledApps(): void { $this->appConfig->setValue('test1', 'enabled', 'yes'); $this->appConfig->setValue('test2', 'enabled', 'no'); $this->appConfig->setValue('test3', 'enabled', '["foo"]'); @@ -425,6 +545,7 @@ class AppManagerTest extends TestCase { 'files', 'lookup_server_connector', 'oauth2', + 'profile', 'provisioning_api', 'settings', 'test1', @@ -434,10 +555,10 @@ class AppManagerTest extends TestCase { 'viewer', 'workflowengine', ]; - $this->assertEquals($apps, $this->manager->getInstalledApps()); + $this->assertEquals($apps, $this->manager->getEnabledApps()); } - public function testGetAppsForUser() { + public function testGetAppsForUser(): void { $user = $this->newUser('user1'); $this->groupManager->expects($this->any()) ->method('getUserGroupIds') @@ -455,6 +576,7 @@ class AppManagerTest extends TestCase { 'files', 'lookup_server_connector', 'oauth2', + 'profile', 'provisioning_api', 'settings', 'test1', @@ -467,11 +589,20 @@ class AppManagerTest extends TestCase { $this->assertEquals($enabled, $this->manager->getEnabledAppsForUser($user)); } - public function testGetAppsNeedingUpgrade() { + public function testGetAppsNeedingUpgrade(): void { /** @var AppManager|MockObject $manager */ $manager = $this->getMockBuilder(AppManager::class) - ->setConstructorArgs([$this->userSession, $this->config, $this->appConfig, $this->groupManager, $this->cacheFactory, $this->eventDispatcher, $this->logger]) - ->setMethods(['getAppInfo']) + ->setConstructorArgs([ + $this->userSession, + $this->config, + $this->groupManager, + $this->cacheFactory, + $this->eventDispatcher, + $this->logger, + $this->serverVersion, + $this->configManager, + ]) + ->onlyMethods(['getAppInfo']) ->getMock(); $appInfos = [ @@ -479,6 +610,7 @@ class AppManagerTest extends TestCase { 'dav' => ['id' => 'dav'], 'files' => ['id' => 'files'], 'federatedfilesharing' => ['id' => 'federatedfilesharing'], + 'profile' => ['id' => 'profile'], 'provisioning_api' => ['id' => 'provisioning_api'], 'lookup_server_connector' => ['id' => 'lookup_server_connector'], 'test1' => ['id' => 'test1', 'version' => '1.0.1', 'requiremax' => '9.0.0'], @@ -518,11 +650,20 @@ class AppManagerTest extends TestCase { $this->assertEquals('test4', $apps[1]['id']); } - public function testGetIncompatibleApps() { + public function testGetIncompatibleApps(): void { /** @var AppManager|MockObject $manager */ $manager = $this->getMockBuilder(AppManager::class) - ->setConstructorArgs([$this->userSession, $this->config, $this->appConfig, $this->groupManager, $this->cacheFactory, $this->eventDispatcher, $this->logger]) - ->setMethods(['getAppInfo']) + ->setConstructorArgs([ + $this->userSession, + $this->config, + $this->groupManager, + $this->cacheFactory, + $this->eventDispatcher, + $this->logger, + $this->serverVersion, + $this->configManager, + ]) + ->onlyMethods(['getAppInfo']) ->getMock(); $appInfos = [ @@ -530,6 +671,7 @@ class AppManagerTest extends TestCase { 'dav' => ['id' => 'dav'], 'files' => ['id' => 'files'], 'federatedfilesharing' => ['id' => 'federatedfilesharing'], + 'profile' => ['id' => 'profile'], 'provisioning_api' => ['id' => 'provisioning_api'], 'lookup_server_connector' => ['id' => 'lookup_server_connector'], 'test1' => ['id' => 'test1', 'version' => '1.0.1', 'requiremax' => '8.0.0'], @@ -563,7 +705,7 @@ class AppManagerTest extends TestCase { $this->assertEquals('test3', $apps[1]['id']); } - public function testGetEnabledAppsForGroup() { + public function testGetEnabledAppsForGroup(): void { $group = $this->createMock(IGroup::class); $group->expects($this->any()) ->method('getGID') @@ -580,6 +722,7 @@ class AppManagerTest extends TestCase { 'files', 'lookup_server_connector', 'oauth2', + 'profile', 'provisioning_api', 'settings', 'test1', @@ -592,7 +735,7 @@ class AppManagerTest extends TestCase { $this->assertEquals($enabled, $this->manager->getEnabledAppsForGroup($group)); } - public function testGetAppRestriction() { + public function testGetAppRestriction(): void { $this->appConfig->setValue('test1', 'enabled', 'yes'); $this->appConfig->setValue('test2', 'enabled', 'no'); $this->appConfig->setValue('test3', 'enabled', '["foo"]'); @@ -601,4 +744,146 @@ class AppManagerTest extends TestCase { $this->assertEquals([], $this->manager->getAppRestriction('test2')); $this->assertEquals(['foo'], $this->manager->getAppRestriction('test3')); } + + public static function isBackendRequiredDataProvider(): array { + return [ + // backend available + [ + 'caldav', + ['app1' => ['caldav']], + true, + ], + [ + 'caldav', + ['app1' => [], 'app2' => ['foo'], 'app3' => ['caldav']], + true, + ], + // backend not available + [ + 'caldav', + ['app3' => [], 'app1' => ['foo'], 'app2' => ['bar', 'baz']], + false, + ], + // no app available + [ + 'caldav', + [], + false, + ], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('isBackendRequiredDataProvider')] + public function testIsBackendRequired( + string $backend, + array $appBackends, + bool $expected, + ): void { + $appInfoData = array_map( + static fn (array $backends) => ['dependencies' => ['backend' => $backends]], + $appBackends, + ); + + $reflection = new \ReflectionClass($this->manager); + $property = $reflection->getProperty('appInfos'); + $property->setValue($this->manager, $appInfoData); + + $this->assertEquals($expected, $this->manager->isBackendRequired($backend)); + } + + public function testGetAppVersion() { + $manager = $this->getMockBuilder(AppManager::class) + ->setConstructorArgs([ + $this->userSession, + $this->config, + $this->groupManager, + $this->cacheFactory, + $this->eventDispatcher, + $this->logger, + $this->serverVersion, + $this->configManager, + ]) + ->onlyMethods([ + 'getAppInfo', + ]) + ->getMock(); + + $manager->expects(self::once()) + ->method('getAppInfo') + ->with('myapp') + ->willReturn(['version' => '99.99.99-rc.99']); + + $this->serverVersion + ->expects(self::never()) + ->method('getVersionString'); + + $this->assertEquals( + '99.99.99-rc.99', + $manager->getAppVersion('myapp'), + ); + } + + public function testGetAppVersionCore() { + $manager = $this->getMockBuilder(AppManager::class) + ->setConstructorArgs([ + $this->userSession, + $this->config, + $this->groupManager, + $this->cacheFactory, + $this->eventDispatcher, + $this->logger, + $this->serverVersion, + $this->configManager, + ]) + ->onlyMethods([ + 'getAppInfo', + ]) + ->getMock(); + + $manager->expects(self::never()) + ->method('getAppInfo'); + + $this->serverVersion + ->expects(self::once()) + ->method('getVersionString') + ->willReturn('1.2.3-beta.4'); + + $this->assertEquals( + '1.2.3-beta.4', + $manager->getAppVersion('core'), + ); + } + + public function testGetAppVersionUnknown() { + $manager = $this->getMockBuilder(AppManager::class) + ->setConstructorArgs([ + $this->userSession, + $this->config, + $this->groupManager, + $this->cacheFactory, + $this->eventDispatcher, + $this->logger, + $this->serverVersion, + $this->configManager, + ]) + ->onlyMethods([ + 'getAppInfo', + ]) + ->getMock(); + + $manager->expects(self::once()) + ->method('getAppInfo') + ->with('unknown') + ->willReturn(null); + + $this->serverVersion + ->expects(self::never()) + ->method('getVersionString'); + + $this->assertEquals( + '0', + $manager->getAppVersion('unknown'), + ); + } + } |