* This file is licensed under the Affero General Public License version 3 or * later. * See the COPYING-README file. */ namespace Test\App; use OC\Group\Group; use OC\User\User; class Manager extends \PHPUnit_Framework_TestCase { /** * @return \OCP\IAppConfig | \PHPUnit_Framework_MockObject_MockObject */ protected function getAppConfig() { $appConfig = array(); $config = $this->getMockBuilder('\OCP\IAppConfig') ->disableOriginalConstructor() ->getMock(); $config->expects($this->any()) ->method('getValue') ->will($this->returnCallback(function ($app, $key, $default) use (&$appConfig) { return (isset($appConfig[$app]) and isset($appConfig[$app][$key])) ? $appConfig[$app][$key] : $default; })); $config->expects($this->any()) ->method('setValue') ->will($this->returnCallback(function ($app, $key, $value) use (&$appConfig) { if (!isset($appConfig[$app])) { $appConfig[$app] = array(); } $appConfig[$app][$key] = $value; })); $config->expects($this->any()) ->method('getValues') ->will($this->returnCallback(function ($app, $key) use (&$appConfig) { if ($app) { return $appConfig[$app]; } else { $values = array(); foreach ($appConfig as $app => $appData) { if (isset($appData[$key])) { $values[$app] = $appData[$key]; } } return $values; } })); return $config; } /** @var \OCP\IUserSession */ protected $userSession; /** @var \OCP\IGroupManager */ protected $groupManager; /** @var \OCP\IAppConfig */ protected $appConfig; /** @var \OCP\ICache */ protected $cache; /** @var \OCP\ICacheFactory */ protected $cacheFactory; /** @var \OCP\App\IAppManager */ protected $manager; protected function setUp() { parent::setUp(); $this->userSession = $this->getMock('\OCP\IUserSession'); $this->groupManager = $this->getMock('\OCP\IGroupManager'); $this->appConfig = $this->getAppConfig(); $this->cacheFactory = $this->getMock('\OCP\ICacheFactory'); $this->cache = $this->getMock('\OCP\ICache'); $this->cacheFactory->expects($this->any()) ->method('create') ->with('settings') ->willReturn($this->cache); $this->manager = new \OC\App\AppManager($this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory); } protected function expectClearCache() { $this->cache->expects($this->once()) ->method('clear') ->with('listApps'); } public function testEnableApp() { $this->expectClearCache(); $this->manager->enableApp('test'); $this->assertEquals('yes', $this->appConfig->getValue('test', 'enabled', 'no')); } public function testDisableApp() { $this->expectClearCache(); $this->manager->disableApp('test'); $this->assertEquals('no', $this->appConfig->getValue('test', 'enabled', 'no')); } public function testEnableAppForGroups() { $groups = array( new Group('group1', array(), null), new Group('group2', array(), null) ); $this->expectClearCache(); $this->manager->enableAppForGroups('test', $groups); $this->assertEquals('["group1","group2"]', $this->appConfig->getValue('test', 'enabled', 'no')); } public function testIsInstalledEnabled() { $this->appConfig->setValue('test', 'enabled', 'yes'); $this->assertTrue($this->manager->isInstalled('test')); } public function testIsInstalledDisabled() { $this->appConfig->setValue('test', 'enabled', 'no'); $this->assertFalse($this->manager->isInstalled('test')); } public function testIsInstalledEnabledForGroups() { $this->appConfig->setValue('test', 'enabled', '["foo"]'); $this->assertTrue($this->manager->isInstalled('test')); } public function testIsEnabledForUserEnabled() { $this->appConfig->setValue('test', 'enabled', 'yes'); $user = new User('user1', null); $this->assertTrue($this->manager->isEnabledForUser('test', $user)); } public function testIsEnabledForUserDisabled() { $this->appConfig->setValue('test', 'enabled', 'no'); $user = new User('user1', null); $this->assertFalse($this->manager->isEnabledForUser('test', $user)); } public function testIsEnabledForUserEnabledForGroup() { $user = new User('user1', null); $this->groupManager->expects($this->once()) ->method('getUserGroupIds') ->with($user) ->will($this->returnValue(array('foo', 'bar'))); $this->appConfig->setValue('test', 'enabled', '["foo"]'); $this->assertTrue($this->manager->isEnabledForUser('test', $user)); } public function testIsEnabledForUserDisabledForGroup() { $user = new User('user1', null); $this->groupManager->expects($this->once()) ->method('getUserGroupIds') ->with($user) ->will($this->returnValue(array('bar'))); $this->appConfig->setValue('test', 'enabled', '["foo"]'); $this->assertFalse($this->manager->isEnabledForUser('test', $user)); } public function testIsEnabledForUserLoggedOut() { $this->appConfig->setValue('test', 'enabled', '["foo"]'); $this->assertFalse($this->manager->IsEnabledForUser('test')); } public function testIsEnabledForUserLoggedIn() { $user = new User('user1', null); $this->userSession->expects($this->once()) ->method('getUser') ->will($this->returnValue($user)); $this->groupManager->expects($this->once()) ->method('getUserGroupIds') ->with($user) ->will($this->returnValue(array('foo', 'bar'))); $this->appConfig->setValue('test', 'enabled', '["foo"]'); $this->assertTrue($this->manager->isEnabledForUser('test')); } public function testGetInstalledApps() { $this->appConfig->setValue('test1', 'enabled', 'yes'); $this->appConfig->setValue('test2', 'enabled', 'no'); $this->appConfig->setValue('test3', 'enabled', '["foo"]'); $this->assertEquals(['dav', 'files', 'test1', 'test3'], $this->manager->getInstalledApps()); } public function testGetAppsForUser() { $user = new User('user1', null); $this->groupManager->expects($this->any()) ->method('getUserGroupIds') ->with($user) ->will($this->returnValue(array('foo', 'bar'))); $this->appConfig->setValue('test1', 'enabled', 'yes'); $this->appConfig->setValue('test2', 'enabled', 'no'); $this->appConfig->setValue('test3', 'enabled', '["foo"]'); $this->appConfig->setValue('test4', 'enabled', '["asd"]'); $this->assertEquals(['dav', 'files', 'test1', 'test3'], $this->manager->getEnabledAppsForUser($user)); } public function testGetAppsNeedingUpgrade() { $this->manager = $this->getMockBuilder('\OC\App\AppManager') ->setConstructorArgs([$this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory]) ->setMethods(['getAppInfo']) ->getMock(); $appInfos = [ 'dav' => ['id' => 'dav'], 'files' => ['id' => 'files'], 'test1' => ['id' => 'test1', 'version' => '1.0.1', 'requiremax' => '9.0.0'], 'test2' => ['id' => 'test2', 'version' => '1.0.0', 'requiremin' => '8.2.0'], 'test3' => ['id' => 'test3', 'version' => '1.2.4', 'requiremin' => '9.0.0'], 'test4' => ['id' => 'test4', 'version' => '3.0.0', 'requiremin' => '8.1.0'], 'testnoversion' => ['id' => 'testnoversion', 'requiremin' => '8.2.0'], ]; $this->manager->expects($this->any()) ->method('getAppInfo') ->will($this->returnCallback( function($appId) use ($appInfos) { return $appInfos[$appId]; } )); $this->appConfig->setValue('test1', 'enabled', 'yes'); $this->appConfig->setValue('test1', 'installed_version', '1.0.0'); $this->appConfig->setValue('test2', 'enabled', 'yes'); $this->appConfig->setValue('test2', 'installed_version', '1.0.0'); $this->appConfig->setValue('test3', 'enabled', 'yes'); $this->appConfig->setValue('test3', 'installed_version', '1.0.0'); $this->appConfig->setValue('test4', 'enabled', 'yes'); $this->appConfig->setValue('test4', 'installed_version', '2.4.0'); $apps = $this->manager->getAppsNeedingUpgrade('8.2.0'); $this->assertCount(2, $apps); $this->assertEquals('test1', $apps[0]['id']); $this->assertEquals('test4', $apps[1]['id']); } public function testGetIncompatibleApps() { $this->manager = $this->getMockBuilder('\OC\App\AppManager') ->setConstructorArgs([$this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory]) ->setMethods(['getAppInfo']) ->getMock(); $appInfos = [ 'dav' => ['id' => 'dav'], 'files' => ['id' => 'files'], 'test1' => ['id' => 'test1', 'version' => '1.0.1', 'requiremax' => '8.0.0'], 'test2' => ['id' => 'test2', 'version' => '1.0.0', 'requiremin' => '8.2.0'], 'test3' => ['id' => 'test3', 'version' => '1.2.4', 'requiremin' => '9.0.0'], 'testnoversion' => ['id' => 'testnoversion', 'requiremin' => '8.2.0'], ]; $this->manager->expects($this->any()) ->method('getAppInfo') ->will($this->returnCallback( function($appId) use ($appInfos) { return $appInfos[$appId]; } )); $this->appConfig->setValue('test1', 'enabled', 'yes'); $this->appConfig->setValue('test2', 'enabled', 'yes'); $this->appConfig->setValue('test3', 'enabled', 'yes'); $apps = $this->manager->getIncompatibleApps('8.2.0'); $this->assertCount(2, $apps); $this->assertEquals('test1', $apps[0]['id']); $this->assertEquals('test3', $apps[1]['id']); } }