2013-02-25 15:38:00 +04:00
< ? php
/**
2014-05-07 00:25:05 +04:00
* Copyright ( c ) 2012 Bernhard Posselt < dev @ bernhard - posselt . com >
2014-05-27 13:54:12 +04:00
* Copyright ( c ) 2014 Vincent Petry < pvince81 @ owncloud . com >
2013-02-25 15:38:00 +04:00
* This file is licensed under the Affero General Public License version 3 or
* later .
* See the COPYING - README file .
*/
2015-11-03 03:52:41 +03:00
2016-05-19 10:27:21 +03:00
namespace Test ;
2017-01-11 12:57:26 +03:00
2020-03-18 12:43:54 +03:00
use OC\App\AppManager ;
2018-04-12 13:28:25 +03:00
use OC\App\InfoParser ;
2016-09-12 21:54:21 +03:00
use OC\AppConfig ;
2016-05-19 10:27:21 +03:00
use OCP\IAppConfig ;
2015-11-03 03:52:41 +03:00
/**
2016-05-19 10:27:21 +03:00
* Class AppTest
2015-11-03 03:52:41 +03:00
*
* @ group DB
*/
2016-05-19 10:27:21 +03:00
class AppTest extends \Test\TestCase {
2013-02-25 15:38:00 +04:00
2014-09-02 16:30:46 +04:00
const TEST_USER1 = 'user1' ;
const TEST_USER2 = 'user2' ;
const TEST_USER3 = 'user3' ;
const TEST_GROUP1 = 'group1' ;
const TEST_GROUP2 = 'group2' ;
2017-01-11 12:57:26 +03:00
public function appVersionsProvider () {
2014-05-27 13:54:12 +04:00
return array (
// exact match
array (
'6.0.0.0' ,
array (
'requiremin' => '6.0' ,
'requiremax' => '6.0' ,
),
true
),
// in-between match
array (
'6.0.0.0' ,
array (
'requiremin' => '5.0' ,
'requiremax' => '7.0' ,
),
true
),
// app too old
array (
'6.0.0.0' ,
array (
'requiremin' => '5.0' ,
'requiremax' => '5.0' ,
),
false
),
// app too new
array (
'5.0.0.0' ,
array (
'requiremin' => '6.0' ,
'requiremax' => '6.0' ,
),
false
),
// only min specified
array (
'6.0.0.0' ,
array (
'requiremin' => '6.0' ,
),
true
),
// only min specified fail
array (
'5.0.0.0' ,
array (
'requiremin' => '6.0' ,
),
false
),
// only min specified legacy
array (
'6.0.0.0' ,
array (
'require' => '6.0' ,
),
true
),
// only min specified legacy fail
array (
'4.0.0.0' ,
array (
'require' => '6.0' ,
),
false
),
// only max specified
array (
'5.0.0.0' ,
array (
'requiremax' => '6.0' ,
),
true
),
// only max specified fail
array (
'7.0.0.0' ,
array (
'requiremax' => '6.0' ,
),
false
),
// variations of versions
// single OC number
array (
'4' ,
array (
'require' => '4.0' ,
),
true
),
2015-01-14 14:48:59 +03:00
// multiple OC number
2014-05-27 13:54:12 +04:00
array (
'4.3.1' ,
array (
'require' => '4.3' ,
),
true
),
2015-01-14 14:48:59 +03:00
// single app number
2014-05-27 13:54:12 +04:00
array (
'4' ,
array (
'require' => '4' ,
),
true
),
// single app number fail
array (
'4.3' ,
array (
'require' => '5' ,
),
false
),
// complex
array (
'5.0.0' ,
array (
'require' => '4.5.1' ,
),
true
),
// complex fail
array (
'4.3.1' ,
array (
'require' => '4.3.2' ,
),
false
),
// two numbers
array (
'4.3.1' ,
array (
'require' => '4.4' ,
),
false
),
// one number fail
array (
'4.3.1' ,
array (
'require' => '5' ,
),
false
),
// pre-alpha app
array (
'5.0.3' ,
array (
'require' => '4.93' ,
),
true
),
// pre-alpha OC
array (
'6.90.0.2' ,
array (
'require' => '6.90' ,
),
true
),
// pre-alpha OC max
array (
'6.90.0.2' ,
array (
'requiremax' => '7' ,
),
true
),
// expect same major number match
array (
'5.0.3' ,
array (
'require' => '5' ,
),
true
),
// expect same major number match
array (
'5.0.3' ,
array (
'requiremax' => '5' ,
),
true
),
2015-01-14 14:48:59 +03:00
// dependencies versions before require*
array (
'6.0.0.0' ,
array (
'requiremin' => '5.0' ,
'requiremax' => '7.0' ,
'dependencies' => array (
'owncloud' => array (
'@attributes' => array (
'min-version' => '7.0' ,
'max-version' => '7.0' ,
),
),
),
),
false
),
array (
'6.0.0.0' ,
array (
'requiremin' => '5.0' ,
'requiremax' => '7.0' ,
'dependencies' => array (
'owncloud' => array (
'@attributes' => array (
'min-version' => '5.0' ,
'max-version' => '5.0' ,
),
),
),
),
false
),
array (
'6.0.0.0' ,
array (
'requiremin' => '5.0' ,
'requiremax' => '5.0' ,
'dependencies' => array (
'owncloud' => array (
'@attributes' => array (
'min-version' => '5.0' ,
'max-version' => '7.0' ,
),
),
),
),
true
),
2016-10-31 13:07:54 +03:00
[
'9.2.0.0' ,
[
'dependencies' => [
'owncloud' => [
'@attributes' => [
'min-version' => '9.0' ,
'max-version' => '9.1' ,
],
],
'nextcloud' => [
'@attributes' => [
'min-version' => '9.1' ,
'max-version' => '9.2' ,
],
],
],
],
true
],
[
'9.2.0.0' ,
[
'dependencies' => [
'nextcloud' => [
'@attributes' => [
'min-version' => '9.1' ,
'max-version' => '9.2' ,
],
],
],
],
true
],
2014-05-27 13:54:12 +04:00
);
2013-02-25 15:38:00 +04:00
}
2014-05-27 13:54:12 +04:00
/**
* @ dataProvider appVersionsProvider
*/
public function testIsAppCompatible ( $ocVersion , $appInfo , $expectedResult ) {
2016-05-19 10:27:21 +03:00
$this -> assertEquals ( $expectedResult , \OC_App :: isAppCompatible ( $ocVersion , $appInfo ));
2013-04-09 12:41:25 +04:00
}
2013-12-16 20:22:44 +04:00
/**
* Tests that the app order is correct
*/
public function testGetEnabledAppsIsSorted () {
2016-02-14 23:07:01 +03:00
$apps = \OC_App :: getEnabledApps ();
2013-12-16 20:22:44 +04: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 16:30:46 +04:00
/**
* Providers for the app config values
*/
2017-01-11 12:57:26 +03:00
public function appConfigValuesProvider () {
2014-09-02 16:30:46 +04:00
return array (
// logged in user1
array (
self :: TEST_USER1 ,
array (
'files' ,
'app1' ,
'app3' ,
'appforgroup1' ,
'appforgroup12' ,
2018-06-29 11:46:09 +03:00
'cloud_federation_api' ,
2015-11-23 15:13:26 +03:00
'dav' ,
2016-02-04 14:07:25 +03:00
'federatedfilesharing' ,
2016-11-19 13:36:51 +03:00
'lookup_server_connector' ,
2017-05-20 21:58:36 +03:00
'oauth2' ,
2016-09-19 20:43:47 +03:00
'provisioning_api' ,
2019-09-17 17:33:27 +03:00
'settings' ,
2016-09-05 09:51:03 +03:00
'twofactor_backupcodes' ,
2019-12-11 01:29:43 +03:00
'viewer' ,
2016-07-27 09:36:03 +03:00
'workflowengine' ,
2014-09-02 16:30:46 +04:00
),
false
),
// logged in user2
array (
self :: TEST_USER2 ,
array (
'files' ,
'app1' ,
'app3' ,
'appforgroup12' ,
'appforgroup2' ,
2018-06-29 11:46:09 +03:00
'cloud_federation_api' ,
2015-11-23 15:13:26 +03:00
'dav' ,
2016-02-04 14:07:25 +03:00
'federatedfilesharing' ,
2016-11-19 13:36:51 +03:00
'lookup_server_connector' ,
2017-05-20 21:58:36 +03:00
'oauth2' ,
2016-09-19 20:43:47 +03:00
'provisioning_api' ,
2019-09-17 17:33:27 +03:00
'settings' ,
2016-09-05 09:51:03 +03:00
'twofactor_backupcodes' ,
2019-12-11 01:29:43 +03:00
'viewer' ,
2016-07-27 09:36:03 +03:00
'workflowengine' ,
2014-09-02 16:30:46 +04:00
),
false
),
// logged in user3
array (
self :: TEST_USER3 ,
array (
'files' ,
'app1' ,
'app3' ,
'appforgroup1' ,
'appforgroup12' ,
'appforgroup2' ,
2018-06-29 11:46:09 +03:00
'cloud_federation_api' ,
2015-11-23 15:13:26 +03:00
'dav' ,
2016-02-04 14:07:25 +03:00
'federatedfilesharing' ,
2016-11-19 13:36:51 +03:00
'lookup_server_connector' ,
2017-05-20 21:58:36 +03:00
'oauth2' ,
2016-09-19 20:43:47 +03:00
'provisioning_api' ,
2019-09-17 17:33:27 +03:00
'settings' ,
2016-09-05 09:51:03 +03:00
'twofactor_backupcodes' ,
2019-12-11 01:29:43 +03:00
'viewer' ,
2016-07-27 09:36:03 +03:00
'workflowengine' ,
2014-09-02 16:30:46 +04:00
),
false
),
// no user, returns all apps
array (
null ,
array (
'files' ,
'app1' ,
'app3' ,
'appforgroup1' ,
'appforgroup12' ,
'appforgroup2' ,
2018-06-29 11:46:09 +03:00
'cloud_federation_api' ,
2015-11-23 15:13:26 +03:00
'dav' ,
2016-02-04 14:07:25 +03:00
'federatedfilesharing' ,
2016-11-19 13:36:51 +03:00
'lookup_server_connector' ,
2017-05-20 21:58:36 +03:00
'oauth2' ,
2016-09-19 20:43:47 +03:00
'provisioning_api' ,
2019-09-17 17:33:27 +03:00
'settings' ,
2016-09-05 09:51:03 +03:00
'twofactor_backupcodes' ,
2019-12-11 01:29:43 +03:00
'viewer' ,
2016-07-27 09:36:03 +03:00
'workflowengine' ,
2014-09-02 16:30:46 +04:00
),
false ,
),
// user given, but ask for all
array (
self :: TEST_USER1 ,
array (
'files' ,
'app1' ,
'app3' ,
'appforgroup1' ,
'appforgroup12' ,
'appforgroup2' ,
2018-06-29 11:46:09 +03:00
'cloud_federation_api' ,
2015-11-23 15:13:26 +03:00
'dav' ,
2016-02-04 14:07:25 +03:00
'federatedfilesharing' ,
2016-11-18 12:10:05 +03:00
'lookup_server_connector' ,
2017-05-20 21:58:36 +03:00
'oauth2' ,
2016-09-19 20:43:47 +03:00
'provisioning_api' ,
2019-09-17 17:33:27 +03:00
'settings' ,
2016-09-05 09:51:03 +03:00
'twofactor_backupcodes' ,
2019-12-11 01:29:43 +03:00
'viewer' ,
2016-07-27 09:36:03 +03:00
'workflowengine' ,
2014-09-02 16:30:46 +04:00
),
true ,
),
);
}
/**
* Test enabled apps
*
* @ dataProvider appConfigValuesProvider
*/
public function testEnabledApps ( $user , $expectedApps , $forceAll ) {
$userManager = \OC :: $server -> getUserManager ();
$groupManager = \OC :: $server -> getGroupManager ();
$user1 = $userManager -> createUser ( self :: TEST_USER1 , self :: TEST_USER1 );
$user2 = $userManager -> createUser ( self :: TEST_USER2 , self :: TEST_USER2 );
$user3 = $userManager -> createUser ( self :: TEST_USER3 , self :: TEST_USER3 );
$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 13:01:59 +04:00
$this -> setupAppConfigMock () -> expects ( $this -> once ())
2014-09-02 16:30:46 +04:00
-> method ( 'getValues' )
-> will ( $this -> returnValue (
array (
'app3' => 'yes' ,
'app2' => 'no' ,
'app1' => 'yes' ,
'appforgroup1' => '["group1"]' ,
'appforgroup2' => '["group2"]' ,
'appforgroup12' => '["group2","group1"]' ,
)
)
2015-02-02 17:47:54 +03:00
);
2014-09-02 16:30:46 +04:00
2016-02-14 23:07:01 +03:00
$apps = \OC_App :: getEnabledApps ( false , $forceAll );
2014-09-02 16:30:46 +04:00
$this -> restoreAppConfig ();
\OC_User :: setUserId ( null );
$user1 -> delete ();
$user2 -> delete ();
$user3 -> delete ();
2014-11-05 17:45:58 +03:00
2014-09-02 16:30:46 +04:00
$group1 -> delete ();
$group2 -> delete ();
2015-02-02 17:47:54 +03:00
$this -> assertEquals ( $expectedApps , $apps );
2014-09-02 16:30:46 +04:00
}
2014-09-03 13:01:59 +04:00
/**
* Test isEnabledApps () with cache , not re - reading the list of
* enabled apps more than once when a user is set .
*/
public function testEnabledAppsCache () {
$userManager = \OC :: $server -> getUserManager ();
$user1 = $userManager -> createUser ( self :: TEST_USER1 , self :: TEST_USER1 );
\OC_User :: setUserId ( self :: TEST_USER1 );
$this -> setupAppConfigMock () -> expects ( $this -> once ())
-> method ( 'getValues' )
-> will ( $this -> returnValue (
array (
'app3' => 'yes' ,
'app2' => 'no' ,
)
)
2015-02-02 17:47:54 +03:00
);
2014-09-03 13:01:59 +04:00
2016-02-14 23:07:01 +03:00
$apps = \OC_App :: getEnabledApps ();
2019-12-11 01:29:43 +03:00
$this -> assertEquals ( array ( 'files' , 'app3' , 'cloud_federation_api' , 'dav' , 'federatedfilesharing' , 'lookup_server_connector' , 'oauth2' , 'provisioning_api' , 'settings' , 'twofactor_backupcodes' , 'viewer' , 'workflowengine' ), $apps );
2014-09-03 13:01:59 +04:00
// mock should not be called again here
2016-02-14 23:07:01 +03:00
$apps = \OC_App :: getEnabledApps ();
2019-12-11 01:29:43 +03:00
$this -> assertEquals ( array ( 'files' , 'app3' , 'cloud_federation_api' , 'dav' , 'federatedfilesharing' , 'lookup_server_connector' , 'oauth2' , 'provisioning_api' , 'settings' , 'twofactor_backupcodes' , 'viewer' , 'workflowengine' ), $apps );
2014-09-03 13:01:59 +04:00
$this -> restoreAppConfig ();
\OC_User :: setUserId ( null );
$user1 -> delete ();
}
private function setupAppConfigMock () {
2016-09-12 21:54:21 +03:00
$appConfig = $this -> getMockBuilder ( AppConfig :: class )
-> setMethods ([ 'getValues' ])
-> setConstructorArgs ([ \OC :: $server -> getDatabaseConnection ()])
-> disableOriginalConstructor ()
-> getMock ();
2014-09-03 13:01:59 +04:00
$this -> registerAppConfig ( $appConfig );
return $appConfig ;
}
2014-09-02 16:30:46 +04:00
/**
* Register an app config mock for testing purposes .
2015-02-02 17:47:54 +03:00
*
2016-05-19 10:27:21 +03:00
* @ param IAppConfig $appConfig app config mock
2014-09-02 16:30:46 +04:00
*/
2018-01-17 23:10:40 +03:00
private function registerAppConfig ( AppConfig $appConfig ) {
2020-03-18 12:43:54 +03:00
$this -> overwriteService ( AppConfig :: class , $appConfig );
$this -> overwriteService ( AppManager :: class , new \OC\App\AppManager (
2016-10-20 16:11:01 +03:00
\OC :: $server -> getUserSession (),
2019-09-05 13:55:24 +03:00
\OC :: $server -> getConfig (),
2016-10-20 16:11:01 +03:00
$appConfig ,
\OC :: $server -> getGroupManager (),
\OC :: $server -> getMemCacheFactory (),
2019-07-15 23:19:11 +03:00
\OC :: $server -> getEventDispatcher (),
\OC :: $server -> getLogger ()
2016-10-20 16:11:01 +03:00
));
2014-09-02 16:30:46 +04:00
}
/**
* Restore the original app config service .
*/
private function restoreAppConfig () {
2020-03-18 12:43:54 +03:00
$this -> restoreService ( AppConfig :: class );
$this -> restoreService ( AppManager :: class );
2014-11-14 14:51:59 +03:00
// Remove the cache of the mocked apps list with a forceRefresh
2016-02-14 23:07:01 +03:00
\OC_App :: getEnabledApps ();
2014-09-02 16:30:46 +04:00
}
2015-01-13 16:48:30 +03:00
/**
* Providers for the app data values
*/
2017-01-11 12:57:26 +03:00
public function appDataProvider () {
2015-01-13 16:48:30 +03:00
return [
[
[ 'description' => " \t This is a multiline \n test with \n \t \n \n some new lines " ],
2017-01-11 12:57:26 +03:00
[ 'description' => " This is a multiline \n test with \n \t \n \n some new lines " ],
2015-01-13 16:48:30 +03:00
],
[
[ 'description' => " \t This is a multiline \n test with \n \t some new lines " ],
2017-01-11 12:57:26 +03:00
[ 'description' => " This is a multiline \n test with \n \t some new lines " ],
2015-01-13 16:48:30 +03:00
],
2015-07-01 02:44:33 +03:00
[
[ 'description' => hex2bin ( '5065726d657420646520732761757468656e7469666965722064616e732070697769676f20646972656374656d656e74206176656320736573206964656e74696669616e7473206f776e636c6f75642073616e73206c65732072657461706572206574206d657420c3a0206a6f757273206365757820636920656e20636173206465206368616e67656d656e74206465206d6f742064652070617373652e0d0a0d' )],
2017-01-11 12:57:26 +03:00
[ 'description' => " Permet de s'authentifier dans piwigo directement avec ses identifiants owncloud sans les retaper et met à jours ceux ci en cas de changement de mot de passe. " ],
2015-07-01 02:44:33 +03:00
],
2015-01-13 16:48:30 +03:00
[
[ 'not-a-description' => " \t This is a multiline \n test with \n \t some new lines " ],
2017-01-11 12:57:26 +03:00
[
'not-a-description' => " \t This is a multiline \n test with \n \t some new lines " ,
'description' => '' ,
],
2015-01-13 16:48:30 +03:00
],
2015-06-30 13:20:28 +03:00
[
[ 'description' => [ 100 , 'bla' ]],
2017-01-11 12:57:26 +03:00
[ 'description' => '' ],
2015-06-30 13:20:28 +03:00
],
2015-01-13 16:48:30 +03:00
];
}
/**
* Test app info parser
*
* @ dataProvider appDataProvider
2015-07-01 02:44:33 +03:00
* @ param array $data
* @ param array $expected
2015-01-13 16:48:30 +03:00
*/
2015-07-01 02:44:33 +03:00
public function testParseAppInfo ( array $data , array $expected ) {
$this -> assertSame ( $expected , \OC_App :: parseAppInfo ( $data ));
2015-01-13 16:48:30 +03:00
}
2018-04-12 13:28:25 +03:00
public function testParseAppInfoL10N () {
$parser = new InfoParser ();
$data = $parser -> parse ( \OC :: $SERVERROOT . " /tests/data/app/description-multi-lang.xml " );
$this -> assertEquals ( 'English' , \OC_App :: parseAppInfo ( $data , 'en' )[ 'description' ]);
$this -> assertEquals ( 'German' , \OC_App :: parseAppInfo ( $data , 'de' )[ 'description' ]);
}
public function testParseAppInfoL10NSingleLanguage () {
$parser = new InfoParser ();
$data = $parser -> parse ( \OC :: $SERVERROOT . " /tests/data/app/description-single-lang.xml " );
$this -> assertEquals ( 'English' , \OC_App :: parseAppInfo ( $data , 'en' )[ 'description' ]);
}
2013-08-18 13:02:08 +04:00
}