summaryrefslogtreecommitdiffstats
path: root/tests/lib/App/ManagerTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lib/App/ManagerTest.php')
-rw-r--r--tests/lib/App/ManagerTest.php381
1 files changed, 381 insertions, 0 deletions
diff --git a/tests/lib/App/ManagerTest.php b/tests/lib/App/ManagerTest.php
new file mode 100644
index 00000000000..26584829b5f
--- /dev/null
+++ b/tests/lib/App/ManagerTest.php
@@ -0,0 +1,381 @@
+<?php
+
+/**
+ * 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.
+ */
+
+namespace Test\App;
+
+use OC\Group\Group;
+use OC\User\User;
+use Test\TestCase;
+
+/**
+ * Class Manager
+ *
+ * @package Test\App
+ * @group DB
+ */
+class ManagerTest extends 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;
+
+ /** @var \Symfony\Component\EventDispatcher\EventDispatcherInterface */
+ protected $eventDispatcher;
+
+ 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->eventDispatcher = $this->getMock('\Symfony\Component\EventDispatcher\EventDispatcherInterface');
+ $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, $this->eventDispatcher);
+ }
+
+ 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 dataEnableAppForGroupsAllowedTypes() {
+ return [
+ [[]],
+ [[
+ 'types' => [],
+ ]],
+ [[
+ 'types' => ['nickvergessen'],
+ ]],
+ ];
+ }
+
+ /**
+ * @dataProvider dataEnableAppForGroupsAllowedTypes
+ *
+ * @param array $appInfo
+ */
+ public function testEnableAppForGroupsAllowedTypes(array $appInfo) {
+ $groups = array(
+ new Group('group1', array(), null),
+ new Group('group2', array(), null)
+ );
+ $this->expectClearCache();
+
+ /** @var \OC\App\AppManager|\PHPUnit_Framework_MockObject_MockObject $manager */
+ $manager = $this->getMockBuilder('OC\App\AppManager')
+ ->setConstructorArgs([
+ $this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory, $this->eventDispatcher
+ ])
+ ->setMethods([
+ 'getAppInfo'
+ ])
+ ->getMock();
+
+ $manager->expects($this->once())
+ ->method('getAppInfo')
+ ->with('test')
+ ->willReturn($appInfo);
+
+ $manager->enableAppForGroups('test', $groups);
+ $this->assertEquals('["group1","group2"]', $this->appConfig->getValue('test', 'enabled', 'no'));
+ }
+
+ public function dataEnableAppForGroupsForbiddenTypes() {
+ return [
+ ['filesystem'],
+ ['prelogin'],
+ ['authentication'],
+ ['logging'],
+ ['prevent_group_restriction'],
+ ];
+ }
+
+ /**
+ * @dataProvider dataEnableAppForGroupsForbiddenTypes
+ *
+ * @param string $type
+ *
+ * @expectedException \Exception
+ * @expectedExceptionMessage test can't be enabled for groups.
+ */
+ public function testEnableAppForGroupsForbiddenTypes($type) {
+ $groups = array(
+ new Group('group1', array(), null),
+ new Group('group2', array(), null)
+ );
+
+ /** @var \OC\App\AppManager|\PHPUnit_Framework_MockObject_MockObject $manager */
+ $manager = $this->getMockBuilder('OC\App\AppManager')
+ ->setConstructorArgs([
+ $this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory, $this->eventDispatcher
+ ])
+ ->setMethods([
+ 'getAppInfo'
+ ])
+ ->getMock();
+
+ $manager->expects($this->once())
+ ->method('getAppInfo')
+ ->with('test')
+ ->willReturn([
+ 'types' => [$type],
+ ]);
+
+ $manager->enableAppForGroups('test', $groups);
+ }
+
+ 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', 'federatedfilesharing', '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', 'federatedfilesharing', '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, $this->eventDispatcher])
+ ->setMethods(['getAppInfo'])
+ ->getMock();
+
+ $appInfos = [
+ 'dav' => ['id' => 'dav'],
+ 'files' => ['id' => 'files'],
+ 'federatedfilesharing' => ['id' => 'federatedfilesharing'],
+ '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, $this->eventDispatcher])
+ ->setMethods(['getAppInfo'])
+ ->getMock();
+
+ $appInfos = [
+ 'dav' => ['id' => 'dav'],
+ 'files' => ['id' => 'files'],
+ 'federatedfilesharing' => ['id' => 'federatedfilesharing'],
+ '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']);
+ }
+}