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 ;
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' ;
2014-05-27 13:54:12 +04:00
function appVersionsProvider () {
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
),
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
}
2014-05-27 13:54:12 +04:00
/**
* Test that the isAppCompatible method also supports passing an array
* as $ocVersion
*/
public function testIsAppCompatibleWithArray () {
$ocVersion = array ( 6 );
$appInfo = array (
'requiremin' => '6' ,
'requiremax' => '6' ,
);
2016-05-19 10:27:21 +03:00
$this -> assertTrue ( \OC_App :: isAppCompatible ( $ocVersion , $appInfo ));
2013-02-25 15:47:34 +04:00
}
2013-02-25 15:38:00 +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
*/
function appConfigValuesProvider () {
return array (
// logged in user1
array (
self :: TEST_USER1 ,
array (
'files' ,
'app1' ,
'app3' ,
'appforgroup1' ,
'appforgroup12' ,
2015-11-23 15:13:26 +03:00
'dav' ,
2016-02-04 14:07:25 +03:00
'federatedfilesharing' ,
2016-09-05 09:51:03 +03:00
'twofactor_backupcodes' ,
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' ,
2015-11-23 15:13:26 +03:00
'dav' ,
2016-02-04 14:07:25 +03:00
'federatedfilesharing' ,
2016-09-05 09:51:03 +03:00
'twofactor_backupcodes' ,
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' ,
2015-11-23 15:13:26 +03:00
'dav' ,
2016-02-04 14:07:25 +03:00
'federatedfilesharing' ,
2016-09-05 09:51:03 +03:00
'twofactor_backupcodes' ,
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' ,
2015-11-23 15:13:26 +03:00
'dav' ,
2016-02-04 14:07:25 +03:00
'federatedfilesharing' ,
2016-09-05 09:51:03 +03:00
'twofactor_backupcodes' ,
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' ,
2015-11-23 15:13:26 +03:00
'dav' ,
2016-02-04 14:07:25 +03:00
'federatedfilesharing' ,
2016-09-05 09:51:03 +03:00
'twofactor_backupcodes' ,
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 ();
2016-09-05 09:51:03 +03:00
$this -> assertEquals ( array ( 'files' , 'app3' , 'dav' , 'federatedfilesharing' , 'twofactor_backupcodes' , '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 ();
2016-09-05 09:51:03 +03:00
$this -> assertEquals ( array ( 'files' , 'app3' , 'dav' , 'federatedfilesharing' , 'twofactor_backupcodes' , 'workflowengine' ), $apps );
2014-09-03 13:01:59 +04:00
$this -> restoreAppConfig ();
\OC_User :: setUserId ( null );
$user1 -> delete ();
}
private function setupAppConfigMock () {
$appConfig = $this -> getMock (
'\OC\AppConfig' ,
array ( 'getValues' ),
2016-01-07 12:26:00 +03:00
array ( \OC :: $server -> getDatabaseConnection ()),
2014-09-03 13:01:59 +04:00
'' ,
false
);
$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
*/
2016-05-19 10:27:21 +03:00
private function registerAppConfig ( IAppConfig $appConfig ) {
2014-09-02 16:30:46 +04:00
\OC :: $server -> registerService ( 'AppConfig' , function ( $c ) use ( $appConfig ) {
return $appConfig ;
});
2015-02-02 16:47:38 +03:00
\OC :: $server -> registerService ( 'AppManager' , function ( \OC\Server $c ) use ( $appConfig ) {
2016-02-09 04:51:12 +03:00
return new \OC\App\AppManager ( $c -> getUserSession (), $appConfig , $c -> getGroupManager (), $c -> getMemCacheFactory (), $c -> getEventDispatcher ());
2015-02-02 16:47:38 +03:00
});
2014-09-02 16:30:46 +04:00
}
/**
* Restore the original app config service .
*/
private function restoreAppConfig () {
2016-01-07 12:26:00 +03:00
\OC :: $server -> registerService ( 'AppConfig' , function ( \OC\Server $c ) {
return new \OC\AppConfig ( $c -> getDatabaseConnection ());
2015-02-02 16:47:38 +03:00
});
2015-02-02 17:47:54 +03:00
\OC :: $server -> registerService ( 'AppManager' , function ( \OC\Server $c ) {
2016-02-09 04:51:12 +03:00
return new \OC\App\AppManager ( $c -> getUserSession (), $c -> getAppConfig (), $c -> getGroupManager (), $c -> getMemCacheFactory (), $c -> getEventDispatcher ());
2014-09-02 16:30:46 +04:00
});
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
*/
function appDataProvider () {
return [
[
[ 'description' => " \t This is a multiline \n test with \n \t \n \n some new lines " ],
[ 'description' => " This is a multiline test with \n \n some new lines " ]
],
[
[ 'description' => " \t This is a multiline \n test with \n \t some new lines " ],
[ 'description' => " This is a multiline test with some new lines " ]
],
2015-07-01 02:44:33 +03:00
[
[ 'description' => hex2bin ( '5065726d657420646520732761757468656e7469666965722064616e732070697769676f20646972656374656d656e74206176656320736573206964656e74696669616e7473206f776e636c6f75642073616e73206c65732072657461706572206574206d657420c3a0206a6f757273206365757820636920656e20636173206465206368616e67656d656e74206465206d6f742064652070617373652e0d0a0d' )],
[ '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-01-13 16:48:30 +03:00
[
[ 'not-a-description' => " \t This is a multiline \n test with \n \t some new lines " ],
[ 'not-a-description' => " \t This is a multiline \n test with \n \t some new lines " ]
],
2015-06-30 13:20:28 +03:00
[
[ 'description' => [ 100 , 'bla' ]],
[ 'description' => " " ]
],
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
}
2013-08-18 13:02:08 +04:00
}
2014-09-02 16:30:46 +04:00