$groups = array();
foreach ($this->backends as $backend) {
$groupIds = $backend->getGroups($search, $limit, $offset);
- if (!is_null($limit)) {
- $limit -= count($groupIds);
- }
- if (!is_null($offset)) {
- $offset -= count($groupIds);
- }
foreach ($groupIds as $groupId) {
- $groups[$groupId] = $this->getGroupObject($groupId);
+ $groups[$groupId] = $this->get($groupId);
}
if (!is_null($limit) and $limit <= 0) {
return array_values($groups);
* @return \OC\Group\Group[]
*/
public function getUserGroups($user) {
+ $uid = $user->getUID();
+ if (isset($this->cachedUserGroups[$uid])) {
+ return $this->cachedUserGroups[$uid];
+ }
$groups = array();
foreach ($this->backends as $backend) {
- $groupIds = $backend->getUserGroups($user->getUID());
+ $groupIds = $backend->getUserGroups($uid);
foreach ($groupIds as $groupId) {
- $groups[$groupId] = $this->getGroupObject($groupId);
+ $groups[$groupId] = $this->get($groupId);
}
}
- return array_values($groups);
+ $this->cachedUserGroups[$uid] = array_values($groups);
+ return $this->cachedUserGroups[$uid];
}
+
+ /**
+ * @brief get a list of all display names in a group
+ * @param string $gid
+ * @param string $search
+ * @param int $limit
+ * @param int $offset
+ * @return array with display names (value) and user ids (key)
+ */
+ public function displayNamesInGroup($gid, $search = '', $limit = -1, $offset = 0) {
+ $group = $this->get($gid);
+ if(is_null($group)) {
+ return array();
+ }
+ // only user backends have the capability to do a complex search for users
+ $groupUsers = $group->searchUsers('', $limit, $offset);
+ $search = trim($search);
+ if(!empty($search)) {
+ //TODO: for OC 7 earliest: user backend should get a method to check selected users against a pattern
+ $filteredUsers = $this->userManager->search($search);
+ $testUsers = true;
+ } else {
+ $filteredUsers = array();
+ $testUsers = false;
+ }
+
+ $matchingUsers = array();
+ foreach($groupUsers as $user) {
+ if(!$testUsers || isset($filteredUsers[$user->getUID()])) {
+ $matchingUsers[$user->getUID()] = $user->getDisplayName();
+ }
+ }
+ return $matchingUsers;
+ }
}
$this->assertEquals('group2', $group2->getGID());
}
+ public function testDisplayNamesInGroupMultipleUserBackends() {
+ $user1 = new User('user1', null);
+ $user2 = new User('user2', null);
+ $user3 = new User('user3', null);
+ $user4 = new User('user33', null);
+
+ /**
+ * @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');
+ $userManager->expects($this->once())
+ ->method('search')
+ ->with('user3')
+ ->will($this->returnValue(array('user3' => $user3, 'user33' => $user4)));
+
+ $userManager->expects($this->any())
+ ->method('get')
+ ->will($this->returnCallback(function($uid) {
+ switch($uid) {
+ case 'user1' : return new User('user1', null);
+ case 'user2' : return new User('user2', null);
+ case 'user3' : return new User('user3', null);
+ case 'user33': return new User('user33', null);
+ default:
+ return null;
+ }
+ }));
+
+ $manager = new \OC\Group\Manager($userManager);
+ $manager->addBackend($backend);
+
+ $users = $manager->displayNamesInGroup('testgroup', 'user3');
+ $this->assertEquals(1, count($users));
+ $this->assertTrue(isset($users['user33']));
+ }
++
+ public function testGetUserGroupsWithAddUser() {
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject | \OC_Group_Backend $backend
+ */
+ $backend = $this->getMock('\OC_Group_Database');
+ $expectedGroups = array();
+ $backend->expects($this->any())
+ ->method('getUserGroups')
+ ->with('user1')
+ ->will($this->returnCallback(function () use (&$expectedGroups) {
+ return $expectedGroups;
+ }));
+ $backend->expects($this->any())
+ ->method('groupExists')
+ ->with('group1')
+ ->will($this->returnValue(true));
+ $backend->expects($this->once())
+ ->method('implementsActions')
+ ->will($this->returnValue(true));
+
+ /**
+ * @var \OC\User\Manager $userManager
+ */
+ $userManager = $this->getMock('\OC\User\Manager');
+ $manager = new \OC\Group\Manager($userManager);
+ $manager->addBackend($backend);
+
+ // prime cache
+ $user1 = new User('user1', null);
+ $groups = $manager->getUserGroups($user1);
+ $this->assertEquals(array(), $groups);
+
+ // add user
+ $group = $manager->get('group1');
+ $group->addUser($user1);
+ $expectedGroups = array('group1');
+
+ // check result
+ $groups = $manager->getUserGroups($user1);
+ $this->assertEquals(1, count($groups));
+ $group1 = $groups[0];
+ $this->assertEquals('group1', $group1->getGID());
+ }
+
+ public function testGetUserGroupsWithRemoveUser() {
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject | \OC_Group_Backend $backend
+ */
+ $backend = $this->getMock('\OC_Group_Database');
+ $expectedGroups = array('group1');
+ $backend->expects($this->any())
+ ->method('getUserGroups')
+ ->with('user1')
+ ->will($this->returnCallback(function () use (&$expectedGroups) {
+ return $expectedGroups;
+ }));
+ $backend->expects($this->any())
+ ->method('groupExists')
+ ->with('group1')
+ ->will($this->returnValue(true));
+ $backend->expects($this->once())
+ ->method('implementsActions')
+ ->will($this->returnValue(true));
+ $backend->expects($this->once())
+ ->method('inGroup')
+ ->will($this->returnValue(true));
+ $backend->expects($this->once())
+ ->method('removeFromGroup')
+ ->will($this->returnValue(true));
+
+ /**
+ * @var \OC\User\Manager $userManager
+ */
+ $userManager = $this->getMock('\OC\User\Manager');
+ $manager = new \OC\Group\Manager($userManager);
+ $manager->addBackend($backend);
+
+ // prime cache
+ $user1 = new User('user1', null);
+ $groups = $manager->getUserGroups($user1);
+ $this->assertEquals(1, count($groups));
+ $group1 = $groups[0];
+ $this->assertEquals('group1', $group1->getGID());
+
+ // remove user
+ $group = $manager->get('group1');
+ $group->removeUser($user1);
+ $expectedGroups = array();
+
+ // check result
+ $groups = $manager->getUserGroups($user1);
+ $this->assertEquals(array(), $groups);
+ }
}