2013-02-25 06:38:00 -05:00
|
|
|
<?php
|
2025-06-30 09:04:05 -04:00
|
|
|
|
2013-02-25 06:38:00 -05:00
|
|
|
/**
|
2024-05-10 09:09:14 -04:00
|
|
|
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
|
|
|
|
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
|
|
|
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
2013-02-25 06:38:00 -05:00
|
|
|
*/
|
2015-11-02 19:52:41 -05:00
|
|
|
|
2016-05-19 03:27:21 -04:00
|
|
|
namespace Test;
|
2017-01-11 04:57:26 -05:00
|
|
|
|
2020-03-18 05:43:54 -04:00
|
|
|
use OC\App\AppManager;
|
2025-07-31 11:44:44 -04:00
|
|
|
use OC\App\DependencyAnalyzer;
|
2016-09-12 14:54:21 -04:00
|
|
|
use OC\AppConfig;
|
2025-06-04 15:38:43 -04:00
|
|
|
use OC\Config\ConfigManager;
|
2022-12-08 04:55:19 -05:00
|
|
|
use OCP\EventDispatcher\IEventDispatcher;
|
2016-05-19 03:27:21 -04:00
|
|
|
use OCP\IAppConfig;
|
2025-01-24 07:14:19 -05:00
|
|
|
use OCP\ICacheFactory;
|
|
|
|
|
use OCP\IConfig;
|
|
|
|
|
use OCP\IDBConnection;
|
|
|
|
|
use OCP\IGroupManager;
|
|
|
|
|
use OCP\IUserManager;
|
|
|
|
|
use OCP\IUserSession;
|
2025-06-12 12:31:58 -04:00
|
|
|
use OCP\Server;
|
2025-01-24 07:14:19 -05:00
|
|
|
use OCP\ServerVersion;
|
2024-03-06 05:13:29 -05:00
|
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
2021-04-19 08:06:34 -04:00
|
|
|
use Psr\Log\LoggerInterface;
|
2016-05-19 03:27:21 -04:00
|
|
|
|
2015-11-02 19:52:41 -05:00
|
|
|
/**
|
2016-05-19 03:27:21 -04:00
|
|
|
* Class AppTest
|
2015-11-02 19:52:41 -05:00
|
|
|
*/
|
2025-10-20 19:52:40 -04:00
|
|
|
#[\PHPUnit\Framework\Attributes\Group('DB')]
|
2016-05-19 03:27:21 -04:00
|
|
|
class AppTest extends \Test\TestCase {
|
2020-04-10 10:54:27 -04:00
|
|
|
public const TEST_USER1 = 'user1';
|
|
|
|
|
public const TEST_USER2 = 'user2';
|
|
|
|
|
public const TEST_USER3 = 'user3';
|
|
|
|
|
public const TEST_GROUP1 = 'group1';
|
|
|
|
|
public const TEST_GROUP2 = 'group2';
|
2014-09-02 08:30:46 -04:00
|
|
|
|
2013-12-16 11:22:44 -05:00
|
|
|
/**
|
|
|
|
|
* Tests that the app order is correct
|
|
|
|
|
*/
|
2024-09-15 16:32:31 -04:00
|
|
|
public function testGetEnabledAppsIsSorted(): void {
|
2016-02-14 15:07:01 -05:00
|
|
|
$apps = \OC_App::getEnabledApps();
|
2013-12-16 11:22:44 -05:00
|
|
|
// copy array
|
|
|
|
|
$sortedApps = $apps;
|
|
|
|
|
sort($sortedApps);
|
|
|
|
|
// 'files' is always on top
|
|
|
|
|
unset($sortedApps[array_search('files', $sortedApps)]);
|
|
|
|
|
array_unshift($sortedApps, 'files');
|
|
|
|
|
$this->assertEquals($sortedApps, $apps);
|
|
|
|
|
}
|
2014-09-02 08:30:46 -04:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Providers for the app config values
|
|
|
|
|
*/
|
2025-05-13 04:10:13 -04:00
|
|
|
public static function appConfigValuesProvider(): array {
|
2020-03-26 04:30:18 -04:00
|
|
|
return [
|
2014-09-02 08:30:46 -04:00
|
|
|
// logged in user1
|
2020-03-26 04:30:18 -04:00
|
|
|
[
|
2014-09-02 08:30:46 -04:00
|
|
|
self::TEST_USER1,
|
2020-03-26 04:30:18 -04:00
|
|
|
[
|
2014-09-02 08:30:46 -04:00
|
|
|
'files',
|
|
|
|
|
'app1',
|
|
|
|
|
'app3',
|
|
|
|
|
'appforgroup1',
|
|
|
|
|
'appforgroup12',
|
2018-06-29 04:46:09 -04:00
|
|
|
'cloud_federation_api',
|
2015-11-23 07:13:26 -05:00
|
|
|
'dav',
|
2016-02-04 06:07:25 -05:00
|
|
|
'federatedfilesharing',
|
2016-11-19 05:36:51 -05:00
|
|
|
'lookup_server_connector',
|
2017-05-20 14:58:36 -04:00
|
|
|
'oauth2',
|
2024-11-13 04:45:01 -05:00
|
|
|
'profile',
|
2016-09-19 13:43:47 -04:00
|
|
|
'provisioning_api',
|
2019-09-17 10:33:27 -04:00
|
|
|
'settings',
|
2022-10-14 09:25:02 -04:00
|
|
|
'theming',
|
2016-09-05 02:51:03 -04:00
|
|
|
'twofactor_backupcodes',
|
2019-12-10 17:29:43 -05:00
|
|
|
'viewer',
|
2016-07-27 02:36:03 -04:00
|
|
|
'workflowengine',
|
2020-03-26 04:30:18 -04:00
|
|
|
],
|
2014-09-02 08:30:46 -04:00
|
|
|
false
|
2020-03-26 04:30:18 -04:00
|
|
|
],
|
2014-09-02 08:30:46 -04:00
|
|
|
// logged in user2
|
2020-03-26 04:30:18 -04:00
|
|
|
[
|
2014-09-02 08:30:46 -04:00
|
|
|
self::TEST_USER2,
|
2020-03-26 04:30:18 -04:00
|
|
|
[
|
2014-09-02 08:30:46 -04:00
|
|
|
'files',
|
|
|
|
|
'app1',
|
|
|
|
|
'app3',
|
|
|
|
|
'appforgroup12',
|
|
|
|
|
'appforgroup2',
|
2018-06-29 04:46:09 -04:00
|
|
|
'cloud_federation_api',
|
2015-11-23 07:13:26 -05:00
|
|
|
'dav',
|
2016-02-04 06:07:25 -05:00
|
|
|
'federatedfilesharing',
|
2016-11-19 05:36:51 -05:00
|
|
|
'lookup_server_connector',
|
2017-05-20 14:58:36 -04:00
|
|
|
'oauth2',
|
2024-11-13 04:45:01 -05:00
|
|
|
'profile',
|
2016-09-19 13:43:47 -04:00
|
|
|
'provisioning_api',
|
2019-09-17 10:33:27 -04:00
|
|
|
'settings',
|
2022-10-14 09:25:02 -04:00
|
|
|
'theming',
|
2016-09-05 02:51:03 -04:00
|
|
|
'twofactor_backupcodes',
|
2019-12-10 17:29:43 -05:00
|
|
|
'viewer',
|
2016-07-27 02:36:03 -04:00
|
|
|
'workflowengine',
|
2020-03-26 04:30:18 -04:00
|
|
|
],
|
2014-09-02 08:30:46 -04:00
|
|
|
false
|
2020-03-26 04:30:18 -04:00
|
|
|
],
|
2014-09-02 08:30:46 -04:00
|
|
|
// logged in user3
|
2020-03-26 04:30:18 -04:00
|
|
|
[
|
2014-09-02 08:30:46 -04:00
|
|
|
self::TEST_USER3,
|
2020-03-26 04:30:18 -04:00
|
|
|
[
|
2014-09-02 08:30:46 -04:00
|
|
|
'files',
|
|
|
|
|
'app1',
|
|
|
|
|
'app3',
|
|
|
|
|
'appforgroup1',
|
|
|
|
|
'appforgroup12',
|
|
|
|
|
'appforgroup2',
|
2018-06-29 04:46:09 -04:00
|
|
|
'cloud_federation_api',
|
2015-11-23 07:13:26 -05:00
|
|
|
'dav',
|
2016-02-04 06:07:25 -05:00
|
|
|
'federatedfilesharing',
|
2016-11-19 05:36:51 -05:00
|
|
|
'lookup_server_connector',
|
2017-05-20 14:58:36 -04:00
|
|
|
'oauth2',
|
2024-11-13 04:45:01 -05:00
|
|
|
'profile',
|
2016-09-19 13:43:47 -04:00
|
|
|
'provisioning_api',
|
2019-09-17 10:33:27 -04:00
|
|
|
'settings',
|
2022-10-14 09:25:02 -04:00
|
|
|
'theming',
|
2016-09-05 02:51:03 -04:00
|
|
|
'twofactor_backupcodes',
|
2019-12-10 17:29:43 -05:00
|
|
|
'viewer',
|
2016-07-27 02:36:03 -04:00
|
|
|
'workflowengine',
|
2020-03-26 04:30:18 -04:00
|
|
|
],
|
2014-09-02 08:30:46 -04:00
|
|
|
false
|
2020-03-26 04:30:18 -04:00
|
|
|
],
|
2014-09-02 08:30:46 -04:00
|
|
|
// no user, returns all apps
|
2020-03-26 04:30:18 -04:00
|
|
|
[
|
2014-09-02 08:30:46 -04:00
|
|
|
null,
|
2020-03-26 04:30:18 -04:00
|
|
|
[
|
2014-09-02 08:30:46 -04:00
|
|
|
'files',
|
|
|
|
|
'app1',
|
|
|
|
|
'app3',
|
|
|
|
|
'appforgroup1',
|
|
|
|
|
'appforgroup12',
|
|
|
|
|
'appforgroup2',
|
2018-06-29 04:46:09 -04:00
|
|
|
'cloud_federation_api',
|
2015-11-23 07:13:26 -05:00
|
|
|
'dav',
|
2016-02-04 06:07:25 -05:00
|
|
|
'federatedfilesharing',
|
2016-11-19 05:36:51 -05:00
|
|
|
'lookup_server_connector',
|
2017-05-20 14:58:36 -04:00
|
|
|
'oauth2',
|
2024-11-13 04:45:01 -05:00
|
|
|
'profile',
|
2016-09-19 13:43:47 -04:00
|
|
|
'provisioning_api',
|
2019-09-17 10:33:27 -04:00
|
|
|
'settings',
|
2022-10-14 09:25:02 -04:00
|
|
|
'theming',
|
2016-09-05 02:51:03 -04:00
|
|
|
'twofactor_backupcodes',
|
2019-12-10 17:29:43 -05:00
|
|
|
'viewer',
|
2016-07-27 02:36:03 -04:00
|
|
|
'workflowengine',
|
2020-03-26 04:30:18 -04:00
|
|
|
],
|
2014-09-02 08:30:46 -04:00
|
|
|
false,
|
2020-03-26 04:30:18 -04:00
|
|
|
],
|
2014-09-02 08:30:46 -04:00
|
|
|
// user given, but ask for all
|
2020-03-26 04:30:18 -04:00
|
|
|
[
|
2014-09-02 08:30:46 -04:00
|
|
|
self::TEST_USER1,
|
2020-03-26 04:30:18 -04:00
|
|
|
[
|
2014-09-02 08:30:46 -04:00
|
|
|
'files',
|
|
|
|
|
'app1',
|
|
|
|
|
'app3',
|
|
|
|
|
'appforgroup1',
|
|
|
|
|
'appforgroup12',
|
|
|
|
|
'appforgroup2',
|
2018-06-29 04:46:09 -04:00
|
|
|
'cloud_federation_api',
|
2015-11-23 07:13:26 -05:00
|
|
|
'dav',
|
2016-02-04 06:07:25 -05:00
|
|
|
'federatedfilesharing',
|
2016-11-18 04:10:05 -05:00
|
|
|
'lookup_server_connector',
|
2017-05-20 14:58:36 -04:00
|
|
|
'oauth2',
|
2024-11-13 04:45:01 -05:00
|
|
|
'profile',
|
2016-09-19 13:43:47 -04:00
|
|
|
'provisioning_api',
|
2019-09-17 10:33:27 -04:00
|
|
|
'settings',
|
2022-10-14 09:25:02 -04:00
|
|
|
'theming',
|
2016-09-05 02:51:03 -04:00
|
|
|
'twofactor_backupcodes',
|
2019-12-10 17:29:43 -05:00
|
|
|
'viewer',
|
2016-07-27 02:36:03 -04:00
|
|
|
'workflowengine',
|
2020-03-26 04:30:18 -04:00
|
|
|
],
|
2014-09-02 08:30:46 -04:00
|
|
|
true,
|
2020-03-26 04:30:18 -04:00
|
|
|
],
|
|
|
|
|
];
|
2014-09-02 08:30:46 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Test enabled apps
|
|
|
|
|
*/
|
2025-06-30 10:56:59 -04:00
|
|
|
#[\PHPUnit\Framework\Attributes\DataProvider('appConfigValuesProvider')]
|
2024-09-15 16:32:31 -04:00
|
|
|
public function testEnabledApps($user, $expectedApps, $forceAll): void {
|
2025-06-12 12:31:58 -04:00
|
|
|
$userManager = Server::get(IUserManager::class);
|
|
|
|
|
$groupManager = Server::get(IGroupManager::class);
|
2024-09-15 07:43:03 -04:00
|
|
|
$user1 = $userManager->createUser(self::TEST_USER1, 'NotAnEasyPassword123456+');
|
|
|
|
|
$user2 = $userManager->createUser(self::TEST_USER2, 'NotAnEasyPassword123456_');
|
|
|
|
|
$user3 = $userManager->createUser(self::TEST_USER3, 'NotAnEasyPassword123456?');
|
2014-09-02 08:30:46 -04:00
|
|
|
|
|
|
|
|
$group1 = $groupManager->createGroup(self::TEST_GROUP1);
|
|
|
|
|
$group1->addUser($user1);
|
|
|
|
|
$group1->addUser($user3);
|
|
|
|
|
$group2 = $groupManager->createGroup(self::TEST_GROUP2);
|
|
|
|
|
$group2->addUser($user2);
|
|
|
|
|
$group2->addUser($user3);
|
|
|
|
|
|
|
|
|
|
\OC_User::setUserId($user);
|
|
|
|
|
|
2014-09-03 05:01:59 -04:00
|
|
|
$this->setupAppConfigMock()->expects($this->once())
|
2025-06-02 12:05:40 -04:00
|
|
|
->method('searchValues')
|
2020-03-25 17:21:27 -04:00
|
|
|
->willReturn(
|
2020-03-26 04:30:18 -04:00
|
|
|
[
|
2014-09-02 08:30:46 -04:00
|
|
|
'app3' => 'yes',
|
|
|
|
|
'app2' => 'no',
|
|
|
|
|
'app1' => 'yes',
|
|
|
|
|
'appforgroup1' => '["group1"]',
|
|
|
|
|
'appforgroup2' => '["group2"]',
|
|
|
|
|
'appforgroup12' => '["group2","group1"]',
|
2020-03-26 04:30:18 -04:00
|
|
|
]
|
2015-02-02 09:47:54 -05:00
|
|
|
);
|
2014-09-02 08:30:46 -04:00
|
|
|
|
2016-02-14 15:07:01 -05:00
|
|
|
$apps = \OC_App::getEnabledApps(false, $forceAll);
|
2014-09-02 08:30:46 -04:00
|
|
|
|
|
|
|
|
$this->restoreAppConfig();
|
|
|
|
|
\OC_User::setUserId(null);
|
|
|
|
|
|
|
|
|
|
$user1->delete();
|
|
|
|
|
$user2->delete();
|
|
|
|
|
$user3->delete();
|
2014-11-05 09:45:58 -05:00
|
|
|
|
2014-09-02 08:30:46 -04:00
|
|
|
$group1->delete();
|
|
|
|
|
$group2->delete();
|
2015-02-02 09:47:54 -05:00
|
|
|
|
|
|
|
|
$this->assertEquals($expectedApps, $apps);
|
2014-09-02 08:30:46 -04:00
|
|
|
}
|
|
|
|
|
|
2014-09-03 05:01:59 -04:00
|
|
|
/**
|
|
|
|
|
* Test isEnabledApps() with cache, not re-reading the list of
|
|
|
|
|
* enabled apps more than once when a user is set.
|
|
|
|
|
*/
|
2024-09-15 16:32:31 -04:00
|
|
|
public function testEnabledAppsCache(): void {
|
2025-06-12 12:31:58 -04:00
|
|
|
$userManager = Server::get(IUserManager::class);
|
2024-09-15 07:43:03 -04:00
|
|
|
$user1 = $userManager->createUser(self::TEST_USER1, 'NotAnEasyPassword123456+');
|
2014-09-03 05:01:59 -04:00
|
|
|
|
|
|
|
|
\OC_User::setUserId(self::TEST_USER1);
|
|
|
|
|
|
|
|
|
|
$this->setupAppConfigMock()->expects($this->once())
|
2025-06-02 12:05:40 -04:00
|
|
|
->method('searchValues')
|
2020-03-25 17:21:27 -04:00
|
|
|
->willReturn(
|
2020-03-26 04:30:18 -04:00
|
|
|
[
|
2014-09-03 05:01:59 -04:00
|
|
|
'app3' => 'yes',
|
|
|
|
|
'app2' => 'no',
|
2020-03-26 04:30:18 -04:00
|
|
|
]
|
2015-02-02 09:47:54 -05:00
|
|
|
);
|
2014-09-03 05:01:59 -04:00
|
|
|
|
2016-02-14 15:07:01 -05:00
|
|
|
$apps = \OC_App::getEnabledApps();
|
2024-11-13 04:45:01 -05:00
|
|
|
$this->assertEquals(['files', 'app3', 'cloud_federation_api', 'dav', 'federatedfilesharing', 'lookup_server_connector', 'oauth2', 'profile', 'provisioning_api', 'settings', 'theming', 'twofactor_backupcodes', 'viewer', 'workflowengine'], $apps);
|
2014-09-03 05:01:59 -04:00
|
|
|
|
|
|
|
|
// mock should not be called again here
|
2016-02-14 15:07:01 -05:00
|
|
|
$apps = \OC_App::getEnabledApps();
|
2024-11-13 04:45:01 -05:00
|
|
|
$this->assertEquals(['files', 'app3', 'cloud_federation_api', 'dav', 'federatedfilesharing', 'lookup_server_connector', 'oauth2', 'profile', 'provisioning_api', 'settings', 'theming', 'twofactor_backupcodes', 'viewer', 'workflowengine'], $apps);
|
2014-09-03 05:01:59 -04:00
|
|
|
|
|
|
|
|
$this->restoreAppConfig();
|
|
|
|
|
\OC_User::setUserId(null);
|
|
|
|
|
|
|
|
|
|
$user1->delete();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private function setupAppConfigMock() {
|
2024-03-06 05:13:29 -05:00
|
|
|
/** @var AppConfig|MockObject */
|
2016-09-12 14:54:21 -04:00
|
|
|
$appConfig = $this->getMockBuilder(AppConfig::class)
|
2025-06-02 12:05:40 -04:00
|
|
|
->onlyMethods(['searchValues'])
|
2025-06-12 12:31:58 -04:00
|
|
|
->setConstructorArgs([Server::get(IDBConnection::class)])
|
2016-09-12 14:54:21 -04:00
|
|
|
->disableOriginalConstructor()
|
|
|
|
|
->getMock();
|
2014-09-03 05:01:59 -04:00
|
|
|
|
|
|
|
|
$this->registerAppConfig($appConfig);
|
|
|
|
|
return $appConfig;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-02 08:30:46 -04:00
|
|
|
/**
|
|
|
|
|
* Register an app config mock for testing purposes.
|
2015-02-02 09:47:54 -05:00
|
|
|
*
|
2016-05-19 03:27:21 -04:00
|
|
|
* @param IAppConfig $appConfig app config mock
|
2014-09-02 08:30:46 -04:00
|
|
|
*/
|
2018-01-17 15:10:40 -05:00
|
|
|
private function registerAppConfig(AppConfig $appConfig) {
|
2020-03-18 05:43:54 -04:00
|
|
|
$this->overwriteService(AppConfig::class, $appConfig);
|
2022-12-08 04:55:19 -05:00
|
|
|
$this->overwriteService(AppManager::class, new AppManager(
|
2025-06-12 12:31:58 -04:00
|
|
|
Server::get(IUserSession::class),
|
|
|
|
|
Server::get(IConfig::class),
|
|
|
|
|
Server::get(IGroupManager::class),
|
|
|
|
|
Server::get(ICacheFactory::class),
|
|
|
|
|
Server::get(IEventDispatcher::class),
|
|
|
|
|
Server::get(LoggerInterface::class),
|
|
|
|
|
Server::get(ServerVersion::class),
|
2025-06-30 10:56:59 -04:00
|
|
|
Server::get(ConfigManager::class),
|
2025-07-31 11:44:44 -04:00
|
|
|
Server::get(DependencyAnalyzer::class),
|
2016-10-20 09:11:01 -04:00
|
|
|
));
|
2014-09-02 08:30:46 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Restore the original app config service.
|
|
|
|
|
*/
|
|
|
|
|
private function restoreAppConfig() {
|
2020-03-18 05:43:54 -04:00
|
|
|
$this->restoreService(AppConfig::class);
|
|
|
|
|
$this->restoreService(AppManager::class);
|
2014-11-14 06:51:59 -05:00
|
|
|
|
|
|
|
|
// Remove the cache of the mocked apps list with a forceRefresh
|
2016-02-14 15:07:01 -05:00
|
|
|
\OC_App::getEnabledApps();
|
2014-09-02 08:30:46 -04:00
|
|
|
}
|
2013-08-18 05:02:08 -04:00
|
|
|
}
|