diff options
Diffstat (limited to 'tests/settings/controller/userscontrollertest.php')
-rw-r--r-- | tests/settings/controller/userscontrollertest.php | 793 |
1 files changed, 726 insertions, 67 deletions
diff --git a/tests/settings/controller/userscontrollertest.php b/tests/settings/controller/userscontrollertest.php index c6506ee440b..53a42de62ab 100644 --- a/tests/settings/controller/userscontrollertest.php +++ b/tests/settings/controller/userscontrollertest.php @@ -1,7 +1,7 @@ <?php /** * @author Lukas Reschke - * @copyright 2014 Lukas Reschke lukas@owncloud.com + * @copyright 2014-2015 Lukas Reschke lukas@owncloud.com * * This file is licensed under the Affero General Public License version 3 or * later. @@ -21,9 +21,6 @@ class UsersControllerTest extends \Test\TestCase { /** @var \OCP\AppFramework\IAppContainer */ private $container; - /** @var UsersController */ - private $usersController; - protected function setUp() { $app = new Application(); $this->container = $app->getContainer(); @@ -36,9 +33,10 @@ class UsersControllerTest extends \Test\TestCase { ->disableOriginalConstructor()->getMock(); $this->container['L10N'] = $this->getMockBuilder('\OCP\IL10N') ->disableOriginalConstructor()->getMock(); + $this->container['SubAdminFactory'] = $this->getMockBuilder('\OC\Settings\Factory\SubAdminFactory') + ->disableOriginalConstructor()->getMock(); $this->container['Config'] = $this->getMockBuilder('\OCP\IConfig') ->disableOriginalConstructor()->getMock(); - $this->container['IsAdmin'] = true; $this->container['L10N'] ->expects($this->any()) ->method('t') @@ -54,16 +52,13 @@ class UsersControllerTest extends \Test\TestCase { ->disableOriginalConstructor()->getMock(); $this->container['URLGenerator'] = $this->getMockBuilder('\OCP\IURLGenerator') ->disableOriginalConstructor()->getMock(); - - $this->usersController = $this->container['UsersController']; - + $this->container['OCP\\App\\IAppManager'] = $this->getMockBuilder('OCP\\App\\IAppManager') + ->disableOriginalConstructor()->getMock(); } - /** - * TODO: Since the function uses the static OC_Subadmin class it can't be mocked - * to test for subadmins. Thus the test always assumes you have admin permissions... - */ - public function testIndex() { + public function testIndexAdmin() { + $this->container['IsAdmin'] = true; + $foo = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $foo @@ -169,7 +164,8 @@ class UsersControllerTest extends \Test\TestCase { 'storageLocation' => '/home/foo', 'lastLogin' => 500, 'backend' => 'OC_User_Database', - 'email' => 'foo@bar.com' + 'email' => 'foo@bar.com', + 'isRestoreDisabled' => false, ), 1 => array( 'name' => 'admin', @@ -180,7 +176,8 @@ class UsersControllerTest extends \Test\TestCase { 'storageLocation' => '/home/admin', 'lastLogin' => 12, 'backend' => 'OC_User_Dummy', - 'email' => 'admin@bar.com' + 'email' => 'admin@bar.com', + 'isRestoreDisabled' => false, ), 2 => array( 'name' => 'bar', @@ -191,11 +188,181 @@ class UsersControllerTest extends \Test\TestCase { 'storageLocation' => '/home/bar', 'lastLogin' => 3999, 'backend' => 'OC_User_Dummy', - 'email' => 'bar@dummy.com' + 'email' => 'bar@dummy.com', + 'isRestoreDisabled' => false, ), ) ); - $response = $this->usersController->index(0, 10, 'gid', 'pattern'); + $response = $this->container['UsersController']->index(0, 10, 'gid', 'pattern'); + $this->assertEquals($expectedResponse, $response); + } + + public function testIndexSubAdmin() { + $this->container['IsAdmin'] = false; + $this->container['SubAdminFactory'] + ->expects($this->once()) + ->method('getSubAdminsOfGroups') + ->with('username') + ->will($this->returnValue(['SubGroup1', 'SubGroup2'])); + + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user + ->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('username')); + $this->container['UserSession'] + ->expects($this->once()) + ->method('getUser') + ->will($this->returnValue($user)); + + $foo = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $foo + ->expects($this->exactly(4)) + ->method('getUID') + ->will($this->returnValue('foo')); + $foo + ->expects($this->once()) + ->method('getDisplayName') + ->will($this->returnValue('M. Foo')); + $foo + ->method('getLastLogin') + ->will($this->returnValue(500)); + $foo + ->method('getHome') + ->will($this->returnValue('/home/foo')); + $foo + ->expects($this->once()) + ->method('getBackendClassName') + ->will($this->returnValue('OC_User_Database')); + $admin = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $admin + ->expects($this->exactly(4)) + ->method('getUID') + ->will($this->returnValue('admin')); + $admin + ->expects($this->once()) + ->method('getDisplayName') + ->will($this->returnValue('S. Admin')); + $admin + ->expects($this->once()) + ->method('getLastLogin') + ->will($this->returnValue(12)); + $admin + ->expects($this->once()) + ->method('getHome') + ->will($this->returnValue('/home/admin')); + $admin + ->expects($this->once()) + ->method('getBackendClassName') + ->will($this->returnValue('OC_User_Dummy')); + $bar = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $bar + ->expects($this->exactly(4)) + ->method('getUID') + ->will($this->returnValue('bar')); + $bar + ->expects($this->once()) + ->method('getDisplayName') + ->will($this->returnValue('B. Ar')); + $bar + ->method('getLastLogin') + ->will($this->returnValue(3999)); + $bar + ->method('getHome') + ->will($this->returnValue('/home/bar')); + $bar + ->expects($this->once()) + ->method('getBackendClassName') + ->will($this->returnValue('OC_User_Dummy')); + + $this->container['GroupManager'] + ->expects($this->at(0)) + ->method('displayNamesInGroup') + ->with('SubGroup1', 'pattern') + ->will($this->returnValue(['foo' => 'M. Foo', 'admin' => 'S. Admin'])); + $this->container['GroupManager'] + ->expects($this->at(1)) + ->method('displayNamesInGroup') + ->with('SubGroup2', 'pattern') + ->will($this->returnValue(['bar' => 'B. Ar'])); + $this->container['GroupManager'] + ->expects($this->exactly(3)) + ->method('getUserGroupIds') + ->will($this->onConsecutiveCalls( + ['SubGroup2', 'SubGroup1'], + ['SubGroup2', 'Foo'], + ['admin', 'SubGroup1', 'testGroup'] + )); + $this->container['UserManager'] + ->expects($this->at(0)) + ->method('get') + ->with('foo') + ->will($this->returnValue($foo)); + $this->container['UserManager'] + ->expects($this->at(1)) + ->method('get') + ->with('admin') + ->will($this->returnValue($admin)); + $this->container['UserManager'] + ->expects($this->at(2)) + ->method('get') + ->with('bar') + ->will($this->returnValue($bar)); + $this->container['Config'] + ->expects($this->exactly(6)) + ->method('getUserValue') + ->will($this->onConsecutiveCalls( + 1024, 'foo@bar.com', + 404, 'admin@bar.com', + 2323, 'bar@dummy.com' + )); + + $expectedResponse = new DataResponse( + [ + 0 => [ + 'name' => 'foo', + 'displayname' => 'M. Foo', + 'groups' => ['SubGroup2', 'SubGroup1'], + 'subadmin' => [], + 'quota' => 1024, + 'storageLocation' => '/home/foo', + 'lastLogin' => 500, + 'backend' => 'OC_User_Database', + 'email' => 'foo@bar.com', + 'isRestoreDisabled' => false, + ], + 1 => [ + 'name' => 'admin', + 'displayname' => 'S. Admin', + 'groups' => ['SubGroup2'], + 'subadmin' => [], + 'quota' => 404, + 'storageLocation' => '/home/admin', + 'lastLogin' => 12, + 'backend' => 'OC_User_Dummy', + 'email' => 'admin@bar.com', + 'isRestoreDisabled' => false, + ], + 2 => [ + 'name' => 'bar', + 'displayname' => 'B. Ar', + 'groups' => ['SubGroup1'], + 'subadmin' => [], + 'quota' => 2323, + 'storageLocation' => '/home/bar', + 'lastLogin' => 3999, + 'backend' => 'OC_User_Dummy', + 'email' => 'bar@dummy.com', + 'isRestoreDisabled' => false, + ], + ] + ); + + $response = $this->container['UsersController']->index(0, 10, '', 'pattern'); $this->assertEquals($expectedResponse, $response); } @@ -204,6 +371,8 @@ class UsersControllerTest extends \Test\TestCase { * to test for subadmins. Thus the test always assumes you have admin permissions... */ public function testIndexWithSearch() { + $this->container['IsAdmin'] = true; + $foo = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $foo @@ -294,7 +463,8 @@ class UsersControllerTest extends \Test\TestCase { 'storageLocation' => '/home/foo', 'lastLogin' => 500, 'backend' => 'OC_User_Database', - 'email' => 'foo@bar.com' + 'email' => 'foo@bar.com', + 'isRestoreDisabled' => false, ), 1 => array( 'name' => 'admin', @@ -305,7 +475,8 @@ class UsersControllerTest extends \Test\TestCase { 'storageLocation' => '/home/admin', 'lastLogin' => 12, 'backend' => 'OC_User_Dummy', - 'email' => 'admin@bar.com' + 'email' => 'admin@bar.com', + 'isRestoreDisabled' => false, ), 2 => array( 'name' => 'bar', @@ -316,16 +487,18 @@ class UsersControllerTest extends \Test\TestCase { 'storageLocation' => '/home/bar', 'lastLogin' => 3999, 'backend' => 'OC_User_Dummy', - 'email' => 'bar@dummy.com' + 'email' => 'bar@dummy.com', + 'isRestoreDisabled' => false, ), ) ); - $response = $this->usersController->index(0, 10, '', 'pattern'); + $response = $this->container['UsersController']->index(0, 10, '', 'pattern'); $this->assertEquals($expectedResponse, $response); } - public function testIndexWithBackend() { + $this->container['IsAdmin'] = true; + $user = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $user @@ -374,15 +547,18 @@ class UsersControllerTest extends \Test\TestCase { 'storageLocation' => '/home/foo', 'lastLogin' => 500, 'backend' => 'OC_User_Database', - 'email' => null + 'email' => null, + 'isRestoreDisabled' => false, ) ) ); - $response = $this->usersController->index(0, 10, '','', 'OC_User_Dummy'); + $response = $this->container['UsersController']->index(0, 10, '','', 'OC_User_Dummy'); $this->assertEquals($expectedResponse, $response); } public function testIndexWithBackendNoUser() { + $this->container['IsAdmin'] = true; + $this->container['UserManager'] ->expects($this->once()) ->method('getBackends') @@ -394,15 +570,13 @@ class UsersControllerTest extends \Test\TestCase { ->will($this->returnValue([])); $expectedResponse = new DataResponse([]); - $response = $this->usersController->index(0, 10, '','', 'OC_User_Dummy'); + $response = $this->container['UsersController']->index(0, 10, '','', 'OC_User_Dummy'); $this->assertEquals($expectedResponse, $response); } - /** - * TODO: Since the function uses the static OC_Subadmin class it can't be mocked - * to test for subadmins. Thus the test always assumes you have admin permissions... - */ - public function testCreateSuccessfulWithoutGroup() { + public function testCreateSuccessfulWithoutGroupAdmin() { + $this->container['IsAdmin'] = true; + $user = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $user @@ -432,19 +606,97 @@ class UsersControllerTest extends \Test\TestCase { 'displayname' => null, 'quota' => null, 'subadmin' => array(), - 'email' => null + 'email' => null, + 'isRestoreDisabled' => false, ), Http::STATUS_CREATED ); - $response = $this->usersController->create('foo', 'password', array()); + $response = $this->container['UsersController']->create('foo', 'password', array()); $this->assertEquals($expectedResponse, $response); } - /** - * TODO: Since the function uses the static OC_Subadmin class it can't be mocked - * to test for subadmins. Thus the test always assumes you have admin permissions... - */ - public function testCreateSuccessfulWithGroup() { + public function testCreateSuccessfulWithoutGroupSubAdmin() { + $this->container['IsAdmin'] = false; + $this->container['SubAdminFactory'] + ->expects($this->once()) + ->method('getSubAdminsOfGroups') + ->with('username') + ->will($this->returnValue(['SubGroup1', 'SubGroup2'])); + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user + ->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('username')); + $this->container['UserSession'] + ->expects($this->once()) + ->method('getUser') + ->will($this->returnValue($user)); + + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user + ->method('getHome') + ->will($this->returnValue('/home/user')); + $user + ->method('getHome') + ->will($this->returnValue('/home/user')); + $user + ->method('getUID') + ->will($this->returnValue('foo')); + $user + ->expects($this->once()) + ->method('getBackendClassName') + ->will($this->returnValue('bar')); + $subGroup1 = $this->getMockBuilder('\OCP\IGroup') + ->disableOriginalConstructor()->getMock(); + $subGroup1 + ->expects($this->once()) + ->method('addUser') + ->with($user); + $subGroup2 = $this->getMockBuilder('\OCP\IGroup') + ->disableOriginalConstructor()->getMock(); + $subGroup2 + ->expects($this->once()) + ->method('addUser') + ->with($user); + + $this->container['UserManager'] + ->expects($this->once()) + ->method('createUser') + ->will($this->onConsecutiveCalls($user)); + $this->container['GroupManager'] + ->expects($this->exactly(2)) + ->method('get') + ->will($this->onConsecutiveCalls($subGroup1, $subGroup2)); + $this->container['GroupManager'] + ->expects($this->once()) + ->method('getUserGroupIds') + ->with($user) + ->will($this->onConsecutiveCalls(['SubGroup1', 'SubGroup2'])); + + $expectedResponse = new DataResponse( + array( + 'name' => 'foo', + 'groups' => ['SubGroup1', 'SubGroup2'], + 'storageLocation' => '/home/user', + 'backend' => 'bar', + 'lastLogin' => null, + 'displayname' => null, + 'quota' => null, + 'subadmin' => [], + 'email' => null, + 'isRestoreDisabled' => false, + ), + Http::STATUS_CREATED + ); + $response = $this->container['UsersController']->create('foo', 'password'); + $this->assertEquals($expectedResponse, $response); + } + + public function testCreateSuccessfulWithGroupAdmin() { + $this->container['IsAdmin'] = true; + $user = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $user @@ -502,19 +754,97 @@ class UsersControllerTest extends \Test\TestCase { 'displayname' => null, 'quota' => null, 'subadmin' => array(), - 'email' => null + 'email' => null, + 'isRestoreDisabled' => false, ), Http::STATUS_CREATED ); - $response = $this->usersController->create('foo', 'password', array('NewGroup', 'ExistingGroup')); + $response = $this->container['UsersController']->create('foo', 'password', array('NewGroup', 'ExistingGroup')); $this->assertEquals($expectedResponse, $response); } - /** - * TODO: Since the function uses the static OC_Subadmin class it can't be mocked - * to test for subadmins. Thus the test always assumes you have admin permissions... - */ - public function testCreateUnsuccessful() { + public function testCreateSuccessfulWithGroupSubAdmin() { + $this->container['IsAdmin'] = false; + $this->container['SubAdminFactory'] + ->expects($this->once()) + ->method('getSubAdminsOfGroups') + ->with('username') + ->will($this->returnValue(['SubGroup1', 'SubGroup2'])); + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user + ->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('username')); + $this->container['UserSession'] + ->expects($this->once()) + ->method('getUser') + ->will($this->returnValue($user)); + + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user + ->method('getHome') + ->will($this->returnValue('/home/user')); + $user + ->method('getHome') + ->will($this->returnValue('/home/user')); + $user + ->method('getUID') + ->will($this->returnValue('foo')); + $user + ->expects($this->once()) + ->method('getBackendClassName') + ->will($this->returnValue('bar')); + $subGroup1 = $this->getMockBuilder('\OCP\IGroup') + ->disableOriginalConstructor()->getMock(); + $subGroup1 + ->expects($this->once()) + ->method('addUser') + ->with($user); + $subGroup2 = $this->getMockBuilder('\OCP\IGroup') + ->disableOriginalConstructor()->getMock(); + $subGroup2 + ->expects($this->once()) + ->method('addUser') + ->with($user); + + $this->container['UserManager'] + ->expects($this->once()) + ->method('createUser') + ->will($this->onConsecutiveCalls($user)); + $this->container['GroupManager'] + ->expects($this->exactly(2)) + ->method('get') + ->will($this->onConsecutiveCalls($subGroup1, $subGroup2)); + $this->container['GroupManager'] + ->expects($this->once()) + ->method('getUserGroupIds') + ->with($user) + ->will($this->onConsecutiveCalls(['SubGroup1'])); + + $expectedResponse = new DataResponse( + array( + 'name' => 'foo', + 'groups' => ['SubGroup1'], + 'storageLocation' => '/home/user', + 'backend' => 'bar', + 'lastLogin' => null, + 'displayname' => null, + 'quota' => null, + 'subadmin' => [], + 'email' => null, + 'isRestoreDisabled' => false, + ), + Http::STATUS_CREATED + ); + $response = $this->container['UsersController']->create('foo', 'password', ['SubGroup1', 'ExistingGroup']); + $this->assertEquals($expectedResponse, $response); + } + + public function testCreateUnsuccessfulAdmin() { + $this->container['IsAdmin'] = true; + $this->container['UserManager'] ->method('createUser') ->will($this->throwException(new \Exception())); @@ -525,15 +855,45 @@ class UsersControllerTest extends \Test\TestCase { ), Http::STATUS_FORBIDDEN ); - $response = $this->usersController->create('foo', 'password', array()); + $response = $this->container['UsersController']->create('foo', 'password', array()); $this->assertEquals($expectedResponse, $response); } - /** - * TODO: Since the function uses the static OC_Subadmin class it can't be mocked - * to test for subadmins. Thus the test always assumes you have admin permissions... - */ - public function testDestroySelf() { + public function testCreateUnsuccessfulSubAdmin() { + $this->container['IsAdmin'] = false; + $this->container['SubAdminFactory'] + ->expects($this->once()) + ->method('getSubAdminsOfGroups') + ->with('username') + ->will($this->returnValue(['SubGroup1', 'SubGroup2'])); + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user + ->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('username')); + $this->container['UserSession'] + ->expects($this->once()) + ->method('getUser') + ->will($this->returnValue($user)); + + $this->container['UserManager'] + ->method('createUser') + ->will($this->throwException(new \Exception())); + + $expectedResponse = new DataResponse( + [ + 'message' => 'Unable to create user.' + ], + Http::STATUS_FORBIDDEN + ); + $response = $this->container['UsersController']->create('foo', 'password', array()); + $this->assertEquals($expectedResponse, $response); + } + + public function testDestroySelfAdmin() { + $this->container['IsAdmin'] = true; + $user = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $user @@ -553,15 +913,39 @@ class UsersControllerTest extends \Test\TestCase { ), Http::STATUS_FORBIDDEN ); - $response = $this->usersController->destroy('myself'); + $response = $this->container['UsersController']->destroy('myself'); $this->assertEquals($expectedResponse, $response); } - /** - * TODO: Since the function uses the static OC_Subadmin class it can't be mocked - * to test for subadmins. Thus the test always assumes you have admin permissions... - */ - public function testDestroy() { + public function testDestroySelfSubadmin() { + $this->container['IsAdmin'] = false; + + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user + ->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('myself')); + $this->container['UserSession'] + ->method('getUser') + ->will($this->returnValue($user)); + + $expectedResponse = new DataResponse( + array( + 'status' => 'error', + 'data' => array( + 'message' => 'Unable to delete user.' + ) + ), + Http::STATUS_FORBIDDEN + ); + $response = $this->container['UsersController']->destroy('myself'); + $this->assertEquals($expectedResponse, $response); + } + + public function testDestroyAdmin() { + $this->container['IsAdmin'] = true; + $user = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $user @@ -591,14 +975,59 @@ class UsersControllerTest extends \Test\TestCase { ), Http::STATUS_NO_CONTENT ); - $response = $this->usersController->destroy('UserToDelete'); + $response = $this->container['UsersController']->destroy('UserToDelete'); $this->assertEquals($expectedResponse, $response); } - /** - * TODO: Since the function uses the static OC_Subadmin class it can't be mocked - * to test for subadmins. Thus the test always assumes you have admin permissions... - */ - public function testDestroyUnsuccessful() { + + public function testDestroySubAdmin() { + $this->container['IsAdmin'] = false; + $this->container['SubAdminFactory'] + ->expects($this->once()) + ->method('isUserAccessible') + ->with('myself', 'UserToDelete') + ->will($this->returnValue(true)); + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user + ->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('myself')); + $this->container['UserSession'] + ->method('getUser') + ->will($this->returnValue($user)); + + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $toDeleteUser = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $toDeleteUser + ->expects($this->once()) + ->method('delete') + ->will($this->returnValue(true)); + $this->container['UserSession'] + ->method('getUser') + ->will($this->returnValue($user)); + $this->container['UserManager'] + ->method('get') + ->with('UserToDelete') + ->will($this->returnValue($toDeleteUser)); + + $expectedResponse = new DataResponse( + [ + 'status' => 'success', + 'data' => [ + 'username' => 'UserToDelete' + ] + ], + Http::STATUS_NO_CONTENT + ); + $response = $this->container['UsersController']->destroy('UserToDelete'); + $this->assertEquals($expectedResponse, $response); + } + + public function testDestroyUnsuccessfulAdmin() { + $this->container['IsAdmin'] = true; + $user = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $user @@ -628,14 +1057,100 @@ class UsersControllerTest extends \Test\TestCase { ), Http::STATUS_FORBIDDEN ); - $response = $this->usersController->destroy('UserToDelete'); + $response = $this->container['UsersController']->destroy('UserToDelete'); + $this->assertEquals($expectedResponse, $response); + } + + public function testDestroyUnsuccessfulSubAdmin() { + $this->container['IsAdmin'] = false; + $this->container['SubAdminFactory'] + ->expects($this->once()) + ->method('isUserAccessible') + ->with('myself', 'UserToDelete') + ->will($this->returnValue(true)); + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user + ->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('myself')); + $this->container['UserSession'] + ->method('getUser') + ->will($this->returnValue($user)); + + $toDeleteUser = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $toDeleteUser + ->expects($this->once()) + ->method('delete') + ->will($this->returnValue(false)); + $this->container['UserSession'] + ->method('getUser') + ->will($this->returnValue($user)); + $this->container['UserManager'] + ->method('get') + ->with('UserToDelete') + ->will($this->returnValue($toDeleteUser)); + + $expectedResponse = new DataResponse( + [ + 'status' => 'error', + 'data' => [ + 'message' => 'Unable to delete user.' + ] + ], + Http::STATUS_FORBIDDEN + ); + $response = $this->container['UsersController']->destroy('UserToDelete'); + $this->assertEquals($expectedResponse, $response); + } + + public function testDestroyNotAccessibleToSubAdmin() { + $this->container['IsAdmin'] = false; + $this->container['SubAdminFactory'] + ->expects($this->once()) + ->method('isUserAccessible') + ->with('myself', 'UserToDelete') + ->will($this->returnValue(false)); + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user + ->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('myself')); + $this->container['UserSession'] + ->method('getUser') + ->will($this->returnValue($user)); + + $toDeleteUser = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $this->container['UserSession'] + ->method('getUser') + ->will($this->returnValue($user)); + $this->container['UserManager'] + ->method('get') + ->with('UserToDelete') + ->will($this->returnValue($toDeleteUser)); + + $expectedResponse = new DataResponse( + [ + 'status' => 'error', + 'data' => [ + 'message' => 'Authentication error' + ] + ], + Http::STATUS_FORBIDDEN + ); + $response = $this->container['UsersController']->destroy('UserToDelete'); $this->assertEquals($expectedResponse, $response); } /** * test if an invalid mail result in a failure response */ - public function testCreateUnsuccessfulWithInvalidEMail() { + public function testCreateUnsuccessfulWithInvalidEmailAdmin() { + $this->container['IsAdmin'] = true; + /** * FIXME: Disabled due to missing DI on mail class. * TODO: Re-enable when https://github.com/owncloud/core/pull/12085 is merged. @@ -653,14 +1168,16 @@ class UsersControllerTest extends \Test\TestCase { ), Http::STATUS_UNPROCESSABLE_ENTITY ); - $response = $this->usersController->create('foo', 'password', array(), 'invalidMailAdress'); + $response = $this->container['UsersController']->create('foo', 'password', array(), 'invalidMailAdress'); $this->assertEquals($expectedResponse, $response); } /** * test if a valid mail result in a successful mail send */ - public function testCreateSuccessfulWithValidEMail() { + public function testCreateSuccessfulWithValidEmailAdmin() { + $this->container['IsAdmin'] = true; + /** * FIXME: Disabled due to missing DI on mail class. * TODO: Re-enable when https://github.com/owncloud/core/pull/12085 is merged. @@ -688,8 +1205,150 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->never()) ->method('error'); - $response = $this->usersController->create('foo', 'password', array(), 'validMail@Adre.ss'); + $response = $this->container['UsersController']->create('foo', 'password', array(), 'validMail@Adre.ss'); $this->assertEquals(Http::STATUS_CREATED, $response->getStatus()); } + private function mockUser($userId = 'foo', $displayName = 'M. Foo', + $lastLogin = 500, $home = '/home/foo', $backend = 'OC_User_Database') { + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user + ->expects($this->any()) + ->method('getUID') + ->will($this->returnValue($userId)); + $user + ->expects($this->once()) + ->method('getDisplayName') + ->will($this->returnValue($displayName)); + $user + ->method('getLastLogin') + ->will($this->returnValue($lastLogin)); + $user + ->method('getHome') + ->will($this->returnValue($home)); + $user + ->expects($this->once()) + ->method('getBackendClassName') + ->will($this->returnValue($backend)); + + $result = [ + 'name' => $userId, + 'displayname' => $displayName, + 'groups' => null, + 'subadmin' => array(), + 'quota' => null, + 'storageLocation' => $home, + 'lastLogin' => $lastLogin, + 'backend' => $backend, + 'email' => null, + 'isRestoreDisabled' => false, + ]; + + return [$user, $result]; + } + + public function testRestorePossibleWithoutEncryption() { + $this->container['IsAdmin'] = true; + + list($user, $expectedResult) = $this->mockUser(); + + $result = \Test_Helper::invokePrivate($this->container['UsersController'], 'formatUserForIndex', [$user]); + $this->assertEquals($expectedResult, $result); + } + + public function testRestorePossibleWithAdminAndUserRestore() { + $this->container['IsAdmin'] = true; + + list($user, $expectedResult) = $this->mockUser(); + + $this->container['OCP\\App\\IAppManager'] + ->expects($this->once()) + ->method('isEnabledForUser') + ->with( + $this->equalTo('files_encryption') + ) + ->will($this->returnValue(true)); + $this->container['Config'] + ->expects($this->once()) + ->method('getAppValue') + ->with( + $this->equalTo('files_encryption'), + $this->equalTo('recoveryAdminEnabled'), + $this->anything() + ) + ->will($this->returnValue('1')); + + $this->container['Config'] + ->expects($this->at(1)) + ->method('getUserValue') + ->with( + $this->anything(), + $this->equalTo('files_encryption'), + $this->equalTo('recovery_enabled'), + $this->anything() + ) + ->will($this->returnValue('1')); + + $result = \Test_Helper::invokePrivate($this->container['UsersController'], 'formatUserForIndex', [$user]); + $this->assertEquals($expectedResult, $result); + } + + public function testRestoreNotPossibleWithoutAdminRestore() { + $this->container['IsAdmin'] = true; + + list($user, $expectedResult) = $this->mockUser(); + + $this->container['OCP\\App\\IAppManager'] + ->method('isEnabledForUser') + ->with( + $this->equalTo('files_encryption') + ) + ->will($this->returnValue(true)); + + $expectedResult['isRestoreDisabled'] = true; + + $result = \Test_Helper::invokePrivate($this->container['UsersController'], 'formatUserForIndex', [$user]); + $this->assertEquals($expectedResult, $result); + } + + public function testRestoreNotPossibleWithoutUserRestore() { + $this->container['IsAdmin'] = true; + + list($user, $expectedResult) = $this->mockUser(); + + $this->container['OCP\\App\\IAppManager'] + ->expects($this->once()) + ->method('isEnabledForUser') + ->with( + $this->equalTo('files_encryption') + ) + ->will($this->returnValue(true)); + $this->container['Config'] + ->expects($this->once()) + ->method('getAppValue') + ->with( + $this->equalTo('files_encryption'), + $this->equalTo('recoveryAdminEnabled'), + $this->anything() + ) + ->will($this->returnValue('1')); + + $this->container['Config'] + ->expects($this->at(1)) + ->method('getUserValue') + ->with( + $this->anything(), + $this->equalTo('files_encryption'), + $this->equalTo('recovery_enabled'), + $this->anything() + ) + ->will($this->returnValue('0')); + + $expectedResult['isRestoreDisabled'] = true; + + $result = \Test_Helper::invokePrivate($this->container['UsersController'], 'formatUserForIndex', [$user]); + $this->assertEquals($expectedResult, $result); + } + } |