From a49610e18a07d04dd3ed861e15b64a94b8a45e19 Mon Sep 17 00:00:00 2001 From: voxsim Date: Thu, 28 Aug 2014 13:51:48 +0200 Subject: change logic in displayNamesInGroup and add some unit tests --- tests/lib/group/manager.php | 288 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 277 insertions(+), 11 deletions(-) (limited to 'tests/lib/group/manager.php') diff --git a/tests/lib/group/manager.php b/tests/lib/group/manager.php index 6799a598d42..d4a1a737837 100644 --- a/tests/lib/group/manager.php +++ b/tests/lib/group/manager.php @@ -346,14 +346,66 @@ class Manager extends \PHPUnit_Framework_TestCase { $this->assertEquals('group2', $group2->getGID()); } - public function testDisplayNamesInGroupMultipleUserBackends() { + public function testDisplayNamesInGroupWithOneUserBackend() { + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \OC_Group_Backend $backend1 + */ + $backend = $this->getMock('\OC_Group_Database'); + $backend->expects($this->exactly(1)) + ->method('groupExists') + ->with('testgroup') + ->will($this->returnValue(true)); + + $backend->expects($this->any()) + ->method('InGroup') + ->will($this->returnCallback(function($uid, $gid) { + switch($uid) { + case 'user1' : return false; + case 'user2' : return true; + case 'user3' : return false; + case 'user33': return true; + default: + return null; + } + })); + + /** + * @var \OC\User\Manager $userManager + */ + $userManager = $this->getMock('\OC\User\Manager'); $userBackend = $this->getMock('\OC_User_Backend'); - $user1 = new User('user1', $userBackend); - $user2 = new User('user2', $userBackend); - $user3 = new User('user3', $userBackend); - $user4 = new User('user33', $userBackend); + $userManager->expects($this->once()) + ->method('search') + ->with('user3') + ->will($this->returnValue(array('user3' => new User('user3', $userBackend), + 'user33' => new User('user33', $userBackend)))); + $userManager->expects($this->any()) + ->method('get') + ->will($this->returnCallback(function($uid) use ($userBackend) { + switch($uid) { + case 'user1' : return new User('user1', $userBackend); + case 'user2' : return new User('user2', $userBackend); + case 'user3' : return new User('user3', $userBackend); + case 'user33': return new User('user33', $userBackend); + default: + return null; + } + })); + + $manager = new \OC\Group\Manager($userManager); + $manager->addBackend($backend); + + $users = $manager->displayNamesInGroup('testgroup', 'user3'); + $this->assertEquals(1, count($users)); + $this->assertFalse(isset($users['user1'])); + $this->assertFalse(isset($users['user2'])); + $this->assertFalse(isset($users['user3'])); + $this->assertTrue(isset($users['user33'])); + } + + public function testDisplayNamesInGroupWithOneUserBackendWithLimitSpecified() { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC_Group_Backend $backend1 */ @@ -363,20 +415,32 @@ class Manager extends \PHPUnit_Framework_TestCase { ->with('testgroup') ->will($this->returnValue(true)); - $backend->expects($this->once()) - ->method('usersInGroup') - ->with('testgroup', '', -1, 0) - ->will($this->returnValue(array('user2', 'user33'))); + $backend->expects($this->any()) + ->method('InGroup') + ->will($this->returnCallback(function($uid, $gid) { + switch($uid) { + case 'user1' : return false; + case 'user2' : return true; + case 'user3' : return false; + case 'user33': return true; + case 'user333': return true; + default: + return null; + } + })); /** * @var \OC\User\Manager $userManager */ $userManager = $this->getMock('\OC\User\Manager'); $userBackend = $this->getMock('\OC_User_Backend'); + $userManager->expects($this->once()) ->method('search') ->with('user3') - ->will($this->returnValue(array('user3' => $user3, 'user33' => $user4))); + ->will($this->returnValue(array('user3' => new User('user3', $userBackend), + 'user33' => new User('user33', $userBackend), + 'user333' => new User('user333', $userBackend)))); $userManager->expects($this->any()) ->method('get') @@ -386,6 +450,7 @@ class Manager extends \PHPUnit_Framework_TestCase { case 'user2' : return new User('user2', $userBackend); case 'user3' : return new User('user3', $userBackend); case 'user33': return new User('user33', $userBackend); + case 'user333': return new User('user333', $userBackend); default: return null; } @@ -394,8 +459,209 @@ class Manager extends \PHPUnit_Framework_TestCase { $manager = new \OC\Group\Manager($userManager); $manager->addBackend($backend); - $users = $manager->displayNamesInGroup('testgroup', 'user3'); + $users = $manager->displayNamesInGroup('testgroup', 'user3', 1); + $this->assertEquals(1, count($users)); + $this->assertFalse(isset($users['user1'])); + $this->assertFalse(isset($users['user2'])); + $this->assertFalse(isset($users['user3'])); + $this->assertTrue(isset($users['user33'])); + $this->assertFalse(isset($users['user333'])); + } + + public function testDisplayNamesInGroupWithOneUserBackendWithLimitAndOffsetSpecified() { + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \OC_Group_Backend $backend1 + */ + $backend = $this->getMock('\OC_Group_Database'); + $backend->expects($this->exactly(1)) + ->method('groupExists') + ->with('testgroup') + ->will($this->returnValue(true)); + + $backend->expects($this->any()) + ->method('InGroup') + ->will($this->returnCallback(function($uid, $gid) { + switch($uid) { + case 'user1' : return false; + case 'user2' : return true; + case 'user3' : return false; + case 'user33': return true; + case 'user333': return true; + default: + return null; + } + })); + + /** + * @var \OC\User\Manager $userManager + */ + $userManager = $this->getMock('\OC\User\Manager'); + $userBackend = $this->getMock('\OC_User_Backend'); + + $userManager->expects($this->once()) + ->method('search') + ->with('user3') + ->will($this->returnValue(array('user3' => new User('user3', $userBackend), + 'user33' => new User('user33', $userBackend), + 'user333' => new User('user333', $userBackend)))); + + $userManager->expects($this->any()) + ->method('get') + ->will($this->returnCallback(function($uid) use ($userBackend) { + switch($uid) { + case 'user1' : return new User('user1', $userBackend); + case 'user2' : return new User('user2', $userBackend); + case 'user3' : return new User('user3', $userBackend); + case 'user33': return new User('user33', $userBackend); + case 'user333': return new User('user333', $userBackend); + default: + return null; + } + })); + + $manager = new \OC\Group\Manager($userManager); + $manager->addBackend($backend); + + $users = $manager->displayNamesInGroup('testgroup', 'user3', 1, 1); + $this->assertEquals(1, count($users)); + $this->assertFalse(isset($users['user1'])); + $this->assertFalse(isset($users['user2'])); + $this->assertFalse(isset($users['user3'])); + $this->assertFalse(isset($users['user33'])); + $this->assertTrue(isset($users['user333'])); + } + + public function testDisplayNamesInGroupWithOneUserBackendAndSearchEmpty() { + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \OC_Group_Backend $backend1 + */ + $backend = $this->getMock('\OC_Group_Database'); + $backend->expects($this->exactly(1)) + ->method('groupExists') + ->with('testgroup') + ->will($this->returnValue(true)); + + $backend->expects($this->once()) + ->method('usersInGroup') + ->with('testgroup', '', -1, 0) + ->will($this->returnValue(array('user2', 'user33'))); + + /** + * @var \OC\User\Manager $userManager + */ + $userManager = $this->getMock('\OC\User\Manager'); + $userBackend = $this->getMock('\OC_User_Backend'); + + $userManager->expects($this->any()) + ->method('get') + ->will($this->returnCallback(function($uid) use ($userBackend) { + switch($uid) { + case 'user1' : return new User('user1', $userBackend); + case 'user2' : return new User('user2', $userBackend); + case 'user3' : return new User('user3', $userBackend); + case 'user33': return new User('user33', $userBackend); + default: + return null; + } + })); + + $manager = new \OC\Group\Manager($userManager); + $manager->addBackend($backend); + + $users = $manager->displayNamesInGroup('testgroup', ''); + $this->assertEquals(2, count($users)); + $this->assertFalse(isset($users['user1'])); + $this->assertTrue(isset($users['user2'])); + $this->assertFalse(isset($users['user3'])); + $this->assertTrue(isset($users['user33'])); + } + + public function testDisplayNamesInGroupWithOneUserBackendAndSearchEmptyAndLimitSpecified() { + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \OC_Group_Backend $backend1 + */ + $backend = $this->getMock('\OC_Group_Database'); + $backend->expects($this->exactly(1)) + ->method('groupExists') + ->with('testgroup') + ->will($this->returnValue(true)); + + $backend->expects($this->once()) + ->method('usersInGroup') + ->with('testgroup', '', 1, 0) + ->will($this->returnValue(array('user2'))); + /** + * @var \OC\User\Manager $userManager + */ + $userManager = $this->getMock('\OC\User\Manager'); + $userBackend = $this->getMock('\OC_User_Backend'); + + $userManager->expects($this->any()) + ->method('get') + ->will($this->returnCallback(function($uid) use ($userBackend) { + switch($uid) { + case 'user1' : return new User('user1', $userBackend); + case 'user2' : return new User('user2', $userBackend); + case 'user3' : return new User('user3', $userBackend); + case 'user33': return new User('user33', $userBackend); + default: + return null; + } + })); + + $manager = new \OC\Group\Manager($userManager); + $manager->addBackend($backend); + + $users = $manager->displayNamesInGroup('testgroup', '', 1); + $this->assertEquals(1, count($users)); + $this->assertFalse(isset($users['user1'])); + $this->assertTrue(isset($users['user2'])); + $this->assertFalse(isset($users['user3'])); + $this->assertFalse(isset($users['user33'])); + } + + public function testDisplayNamesInGroupWithOneUserBackendAndSearchEmptyAndLimitAndOffsetSpecified() { + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \OC_Group_Backend $backend1 + */ + $backend = $this->getMock('\OC_Group_Database'); + $backend->expects($this->exactly(1)) + ->method('groupExists') + ->with('testgroup') + ->will($this->returnValue(true)); + + $backend->expects($this->once()) + ->method('usersInGroup') + ->with('testgroup', '', 1, 1) + ->will($this->returnValue(array('user33'))); + + /** + * @var \OC\User\Manager $userManager + */ + $userManager = $this->getMock('\OC\User\Manager'); + $userBackend = $this->getMock('\OC_User_Backend'); + + $userManager->expects($this->any()) + ->method('get') + ->will($this->returnCallback(function($uid) use ($userBackend) { + switch($uid) { + case 'user1' : return new User('user1', $userBackend); + case 'user2' : return new User('user2', $userBackend); + case 'user3' : return new User('user3', $userBackend); + case 'user33': return new User('user33', $userBackend); + default: + return null; + } + })); + + $manager = new \OC\Group\Manager($userManager); + $manager->addBackend($backend); + + $users = $manager->displayNamesInGroup('testgroup', '', 1, 1); $this->assertEquals(1, count($users)); + $this->assertFalse(isset($users['user1'])); + $this->assertFalse(isset($users['user2'])); + $this->assertFalse(isset($users['user3'])); $this->assertTrue(isset($users['user33'])); } -- cgit v1.2.3 From 1366133d2bba33391b25a57ad0182b317fe3ecb6 Mon Sep 17 00:00:00 2001 From: voxsim Date: Mon, 15 Sep 2014 18:37:54 +0200 Subject: add more logic in displayNamesInGroup for big user bases --- lib/private/group/manager.php | 21 ++++++++++++++++----- tests/lib/group/manager.php | 44 ++++++++++++++++++++++++++++++++----------- 2 files changed, 49 insertions(+), 16 deletions(-) (limited to 'tests/lib/group/manager.php') diff --git a/lib/private/group/manager.php b/lib/private/group/manager.php index 982a3ceec46..e3744ab7698 100644 --- a/lib/private/group/manager.php +++ b/lib/private/group/manager.php @@ -214,12 +214,23 @@ class Manager extends PublicEmitter { if(!empty($search)) { // only user backends have the capability to do a complex search for users - $filteredUsers = $this->userManager->search($search); - foreach($filteredUsers as $filteredUser) { - if($group->inGroup($filteredUser)) { - $groupUsers []= $filteredUser; - } + $searchOffset = 0; + if($limit === -1) { + $searchLimit = $group->count(''); + } else { + $searchLimit = $limit * 2; } + + do { + $filteredUsers = $this->userManager->search($search, $searchLimit, $searchOffset); + foreach($filteredUsers as $filteredUser) { + if($group->inGroup($filteredUser)) { + $groupUsers []= $filteredUser; + } + } + $searchOffset += $searchLimit; + } while(sizeof($groupUsers) < $searchLimit+$offset && sizeof($filteredUsers) > 0 && sizeof($filteredUsers) === $searchLimit); + if($limit === -1) { $groupUsers = array_slice($groupUsers, $offset); } else { diff --git a/tests/lib/group/manager.php b/tests/lib/group/manager.php index d4a1a737837..70d9783946a 100644 --- a/tests/lib/group/manager.php +++ b/tests/lib/group/manager.php @@ -369,17 +369,31 @@ class Manager extends \PHPUnit_Framework_TestCase { } })); + $backend->expects($this->once()) + ->method('implementsActions') + ->will($this->returnValue(true)); + + $backend->expects($this->once()) + ->method('countUsersInGroup') + ->with('testgroup', '') + ->will($this->returnValue(2)); + /** * @var \OC\User\Manager $userManager */ $userManager = $this->getMock('\OC\User\Manager'); $userBackend = $this->getMock('\OC_User_Backend'); - $userManager->expects($this->once()) + $userManager->expects($this->any()) ->method('search') ->with('user3') - ->will($this->returnValue(array('user3' => new User('user3', $userBackend), - 'user33' => new User('user33', $userBackend)))); + ->will($this->returnCallback(function($search, $limit, $offset) use ($userBackend) { + switch($offset) { + case 0 : return array('user3' => new User('user3', $userBackend), + 'user33' => new User('user33', $userBackend)); + case 2 : return array(); + } + })); $userManager->expects($this->any()) ->method('get') @@ -435,12 +449,16 @@ class Manager extends \PHPUnit_Framework_TestCase { $userManager = $this->getMock('\OC\User\Manager'); $userBackend = $this->getMock('\OC_User_Backend'); - $userManager->expects($this->once()) + $userManager->expects($this->any()) ->method('search') ->with('user3') - ->will($this->returnValue(array('user3' => new User('user3', $userBackend), - 'user33' => new User('user33', $userBackend), - 'user333' => new User('user333', $userBackend)))); + ->will($this->returnCallback(function($search, $limit, $offset) use ($userBackend) { + switch($offset) { + case 0 : return array('user3' => new User('user3', $userBackend), + 'user33' => new User('user33', $userBackend)); + case 2 : return array('user333' => new User('user333', $userBackend)); + } + })); $userManager->expects($this->any()) ->method('get') @@ -498,12 +516,16 @@ class Manager extends \PHPUnit_Framework_TestCase { $userManager = $this->getMock('\OC\User\Manager'); $userBackend = $this->getMock('\OC_User_Backend'); - $userManager->expects($this->once()) + $userManager->expects($this->any()) ->method('search') ->with('user3') - ->will($this->returnValue(array('user3' => new User('user3', $userBackend), - 'user33' => new User('user33', $userBackend), - 'user333' => new User('user333', $userBackend)))); + ->will($this->returnCallback(function($search, $limit, $offset) use ($userBackend) { + switch($offset) { + case 0 : return array('user3' => new User('user3', $userBackend), + 'user33' => new User('user33', $userBackend)); + case 2 : return array('user333' => new User('user333', $userBackend)); + } + })); $userManager->expects($this->any()) ->method('get') -- cgit v1.2.3