add user and group list in group and user edit pages user_management
authorymh <ymh.work@gmail.com>
Tue, 14 Jan 2014 18:02:42 +0100
branchuser_management
changeset 239 67c2b0fb9b19
parent 238 ffe523338543
child 240 18a43ba77ad0
child 241 99e9f8baf4bf
add user and group list in group and user edit pages
server/src/main/java/org/iri_research/renkan/controller/admin/GroupsAdminController.java
server/src/main/java/org/iri_research/renkan/controller/admin/UsersAdminController.java
server/src/main/java/org/iri_research/renkan/forms/GroupForm.java
server/src/main/java/org/iri_research/renkan/forms/UserForm.java
server/src/main/java/org/iri_research/renkan/repositories/GroupsRepositoryCustom.java
server/src/main/java/org/iri_research/renkan/repositories/GroupsRepositoryImpl.java
server/src/main/java/org/iri_research/renkan/repositories/UsersRepositoryCustom.java
server/src/main/java/org/iri_research/renkan/repositories/UsersRepositoryImpl.java
server/src/main/webapp/WEB-INF/i18n/messages.properties
server/src/main/webapp/WEB-INF/i18n/messages_en.properties
server/src/main/webapp/WEB-INF/i18n/messages_fr.properties
server/src/main/webapp/WEB-INF/templates/admin/groupsList.html
server/src/main/webapp/WEB-INF/templates/fragment/groupForm.html
server/src/main/webapp/WEB-INF/templates/fragment/userForm.html
server/src/main/webapp/static/css/index.css
server/src/test/java/org/iri_research/renkan/test/controller/GroupsAdminControllerTest.java
server/src/test/java/org/iri_research/renkan/test/controller/UsersAdminControllerTest.java
server/src/test/java/org/iri_research/renkan/test/repositories/GroupsRepositoryTest.java
server/src/test/java/org/iri_research/renkan/test/repositories/UsersRepositoryTest.java
--- a/server/src/main/java/org/iri_research/renkan/controller/admin/GroupsAdminController.java	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/java/org/iri_research/renkan/controller/admin/GroupsAdminController.java	Tue Jan 14 18:02:42 2014 +0100
@@ -16,6 +16,7 @@
 import org.iri_research.renkan.forms.GroupFormValidator;
 import org.iri_research.renkan.models.Group;
 import org.iri_research.renkan.repositories.GroupsRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.propertyeditors.StringTrimmerEditor;
@@ -46,6 +47,9 @@
     @Inject
     private GroupsRepository groupsRepository;
 
+    @Inject
+    private UsersRepository usersRepository;
+
 
     @InitBinder(value = { "group" })
     protected void initBinder(WebDataBinder binder) {
@@ -94,6 +98,7 @@
         groupForm = new GroupForm(group);
 
         model.addAttribute("group", groupForm);
+        model.addAttribute("allUsers", this.usersRepository.findAll());
 
         return "admin/groupEdit";
     }
--- a/server/src/main/java/org/iri_research/renkan/controller/admin/UsersAdminController.java	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/java/org/iri_research/renkan/controller/admin/UsersAdminController.java	Tue Jan 14 18:02:42 2014 +0100
@@ -18,6 +18,7 @@
 import org.iri_research.renkan.forms.UserForm;
 import org.iri_research.renkan.forms.UserFormValidator;
 import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.GroupsRepository;
 import org.iri_research.renkan.repositories.ProjectsRepository;
 import org.iri_research.renkan.repositories.UsersRepository;
 import org.slf4j.Logger;
@@ -54,6 +55,9 @@
     @Inject
     private ProjectsRepository projectsRepository;
     
+    @Inject
+    private GroupsRepository groupsRepository;
+
     @Resource(name="renkanPasswordEncoder")
     private PasswordEncoder passwordEncoder;
     
@@ -105,6 +109,7 @@
         userForm = new UserForm(user);
 
         model.addAttribute("user", userForm);
+        model.addAttribute("allGroups", this.groupsRepository.findAll());
 
         return "admin/userEdit";
     }
--- a/server/src/main/java/org/iri_research/renkan/forms/GroupForm.java	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/java/org/iri_research/renkan/forms/GroupForm.java	Tue Jan 14 18:02:42 2014 +0100
@@ -1,7 +1,7 @@
 package org.iri_research.renkan.forms;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.iri_research.renkan.Constants;
 import org.iri_research.renkan.models.Group;
@@ -12,7 +12,7 @@
 public class GroupForm extends RenkanForm<String, Group> {
 
     private String avatar;
-    private List<String> users;
+    private Set<String> users;
 
     private GroupsRepository groupsRepository;
     
@@ -25,7 +25,7 @@
         super(model);
         if (model != null) {
             this.avatar = model.getAvatar();
-            this.setUsers(new ArrayList<String>());
+            this.setUsers(new HashSet<>(model.getUsers()));
             if(model.getUsers() != null) {
                 this.getUsers().addAll(model.getUsers());
             }
@@ -72,11 +72,11 @@
         this.groupsRepository = groupsRepository;
     }
     
-    public List<String> getUsers() {
+    public Set<String> getUsers() {
         return users;
     }
 
-    public void setUsers(List<String> users) {
+    public void setUsers(Set<String> users) {
         this.users = users;
     }
 
--- a/server/src/main/java/org/iri_research/renkan/forms/UserForm.java	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/java/org/iri_research/renkan/forms/UserForm.java	Tue Jan 14 18:02:42 2014 +0100
@@ -1,7 +1,9 @@
 package org.iri_research.renkan.forms;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.iri_research.renkan.Constants;
 import org.iri_research.renkan.models.User;
@@ -28,6 +30,7 @@
     private boolean locked;
     private String password;
     private String passwordConfirm;
+    private Set<String> groups;
     private List<String> userAuthorities;
 
     private UsersRepository usersRepository;
@@ -53,6 +56,7 @@
             this.enabled = model.isEnabled();
             this.locked = model.isLocked();
             this.userAuthorities = model.getUserAuthorities()!=null?new ArrayList<String>(model.getUserAuthorities()):new ArrayList<String>();
+            this.setGroups(new HashSet<>(model.getGroups()));
         }
     }
 
@@ -114,6 +118,9 @@
         this.model.setEnabled(this.enabled);
         this.model.setLocked(this.locked);
         this.model.setUserAuthorities((this.userAuthorities!=null && !this.userAuthorities.isEmpty())?new ArrayList<String>(this.userAuthorities):null);
+        if(this.getGroups() != null) {
+            this.usersRepository.setGroupsList(this.model, this.getGroups());
+        }
         if(this.password != null && this.password.length() > 0) {
             this.model.setPassword(this.passwordEncoder.encode(this.password));
         }
@@ -165,4 +172,12 @@
         this.userAuthorities = userAuthorities;
     }
 
+    public Set<String> getGroups() {
+        return groups;
+    }
+
+    public void setGroups(Set<String> groups) {
+        this.groups = groups;
+    }
+
 }
--- a/server/src/main/java/org/iri_research/renkan/repositories/GroupsRepositoryCustom.java	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/java/org/iri_research/renkan/repositories/GroupsRepositoryCustom.java	Tue Jan 14 18:02:42 2014 +0100
@@ -1,9 +1,17 @@
 package org.iri_research.renkan.repositories;
 
-import java.util.List;
+import java.util.Collection;
+import java.util.Map;
 
 import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.models.User;
 
 public interface GroupsRepositoryCustom {
-    public void setUsersList(Group group, List<String> userIds);
+    /**
+     * Set the list of user for the group
+     * @param group: the group.
+     * @param userIds: the collection of user ids. This parameter must not be null.
+     */
+    public void setUsersList(Group group, Collection<String> userIds);
+    public Map<String, User> getUsersMap(Group group);
 }
--- a/server/src/main/java/org/iri_research/renkan/repositories/GroupsRepositoryImpl.java	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/java/org/iri_research/renkan/repositories/GroupsRepositoryImpl.java	Tue Jan 14 18:02:42 2014 +0100
@@ -1,7 +1,10 @@
 package org.iri_research.renkan.repositories;
 
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.collections4.IteratorUtils;
 import org.iri_research.renkan.models.Group;
@@ -18,7 +21,9 @@
     
     @Override
     // TODO: implement a transaction mecanism...
-    public void setUsersList(Group group, List<String> userIds) {
+    public void setUsersList(Group group, Collection<String> userIds) {
+        
+        assert userIds != null : "list of user ids must not be null";
         
         // takes previous user list
         List<String> oldUsers = new ArrayList<>(group.getUsers());
@@ -47,4 +52,15 @@
         this.groupsRepository.save(group);
     }
 
+    @Override
+    public Map<String, User> getUsersMap(Group group) {
+        HashMap<String, User> res = new HashMap<>(group.getUsers().size());
+        
+        for (User user : this.usersRepository.findAll(group.getUsers())) {
+            res.put(user.getId(), user);
+        }
+        
+        return res;
+    }
+
 }
--- a/server/src/main/java/org/iri_research/renkan/repositories/UsersRepositoryCustom.java	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/java/org/iri_research/renkan/repositories/UsersRepositoryCustom.java	Tue Jan 14 18:02:42 2014 +0100
@@ -1,9 +1,17 @@
 package org.iri_research.renkan.repositories;
 
-import java.util.List;
+import java.util.Collection;
+import java.util.Map;
 
+import org.iri_research.renkan.models.Group;
 import org.iri_research.renkan.models.User;
 
 public interface UsersRepositoryCustom {
-    public void setGroupsList(User user, List<String> groupIds);
+    /**
+     * Set the users group list.
+     * @param user : the user
+     * @param groupIds : the list of group ids. this parameter must not be null.
+     */
+    public void setGroupsList(User user, Collection<String> groupIds);    
+    public Map<String, Group> getGroupsMap(User user);
 }
--- a/server/src/main/java/org/iri_research/renkan/repositories/UsersRepositoryImpl.java	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/java/org/iri_research/renkan/repositories/UsersRepositoryImpl.java	Tue Jan 14 18:02:42 2014 +0100
@@ -1,7 +1,10 @@
 package org.iri_research.renkan.repositories;
 
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.collections4.IteratorUtils;
 import org.iri_research.renkan.models.Group;
@@ -18,7 +21,9 @@
     
     @Override
     // TODO: implement a transaction mecanism...
-    public void setGroupsList(User user, List<String> groupIds) {
+    public void setGroupsList(User user, Collection<String> groupIds) {
+        
+        assert groupIds != null : "list of group ids must not be null";
         
         // takes previous user list
         List<String> oldGroups = new ArrayList<>(user.getGroups());
@@ -47,4 +52,15 @@
         this.usersRepository.save(user);
     }
 
+    @Override
+    public Map<String, Group> getGroupsMap(User user) {
+        HashMap<String, Group> res = new HashMap<>(user.getGroups().size());
+        
+        for (Group group : this.groupsRepository.findAll(user.getGroups())) {
+            res.put(group.getId(), group);
+        }
+        
+        return res;
+    }
+
 }
--- a/server/src/main/webapp/WEB-INF/i18n/messages.properties	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/webapp/WEB-INF/i18n/messages.properties	Tue Jan 14 18:02:42 2014 +0100
@@ -70,7 +70,7 @@
 renkanAdmin.form.space.compact = Compact
 
 renkanAdmin.form.avatar = Avatar
-renkanAdmin.form.credentialExpirationDate = Cred. exp. date
+renkanAdmin.form.credentialsExpirationDate = Cred. exp. date
 renkanAdmin.form.expirationDate = Exp. date
 renkanAdmin.form.email = Email
 renkanAdmin.form.enabled = Enabled
@@ -78,6 +78,8 @@
 renkanAdmin.form.password = Password
 renkanAdmin.form.passwordConfirm = Confirm password
 renkanAdmin.form.roles = Roles
+renkanAdmin.form.groups = Groups
+renkanAdmin.form.users = Users
 renkanAdmin.form.user.submit = Ok
 
 renkan.error.title.empty = Title must not be empty or null
--- a/server/src/main/webapp/WEB-INF/i18n/messages_en.properties	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/webapp/WEB-INF/i18n/messages_en.properties	Tue Jan 14 18:02:42 2014 +0100
@@ -79,7 +79,7 @@
 renkanAdmin.user_confirm_delete = Do you want to delete the user with username "{0}" ?
 
 renkanAdmin.form.avatar = Avatar
-renkanAdmin.form.credentialExpirationDate = Cred. exp. date
+renkanAdmin.form.credentialsExpirationDate = Cred. exp. date
 renkanAdmin.form.expirationDate = Exp. date
 renkanAdmin.form.email = Email
 renkanAdmin.form.enabled = Enabled
@@ -87,6 +87,8 @@
 renkanAdmin.form.password = Password
 renkanAdmin.form.passwordConfirm = Confirm password
 renkanAdmin.form.roles = Roles
+renkanAdmin.form.groups = Groups
+renkanAdmin.form.users = Users
 renkanAdmin.form.user.submit = Ok
 
 
--- a/server/src/main/webapp/WEB-INF/i18n/messages_fr.properties	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/webapp/WEB-INF/i18n/messages_fr.properties	Tue Jan 14 18:02:42 2014 +0100
@@ -77,7 +77,7 @@
 renkanAdmin.user_confirm_delete = Do you want to delete the user with username "{0}" ?
 
 renkanAdmin.form.avatar = Avatar
-renkanAdmin.form.credentialExpirationDate = Date exp. mdp.
+renkanAdmin.form.credentialsExpirationDate = Date exp. mdp.
 renkanAdmin.form.expirationDate = Date exp.
 renkanAdmin.form.email = Email
 renkanAdmin.form.enabled = Actif
@@ -85,6 +85,8 @@
 renkanAdmin.form.password = Mot de passe
 renkanAdmin.form.passwordConfirm = Conf. mot de passe
 renkanAdmin.form.roles = RĂ´les
+renkanAdmin.form.groups = Groupes
+renkanAdmin.form.users = Utilisateurs
 renkanAdmin.form.user.submit = Ok
 
 
--- a/server/src/main/webapp/WEB-INF/templates/admin/groupsList.html	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/webapp/WEB-INF/templates/admin/groupsList.html	Tue Jan 14 18:02:42 2014 +0100
@@ -21,7 +21,7 @@
             <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
             <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
         </header>
-        <h2 th:text="#{renkanAdmin.object_list(#{renkanAdmin.user_objects_name})}">List of objects</h2>
+        <h2 th:text="#{renkanAdmin.object_list(#{renkanAdmin.group_objects_name})}">List of objects</h2>
         <div th:include="fragment/paginationFragment :: paginationFragment" class="pagination-container">
           <div>               
             <a href="#?p.page=1">&lt;&lt;</a>
--- a/server/src/main/webapp/WEB-INF/templates/fragment/groupForm.html	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/webapp/WEB-INF/templates/fragment/groupForm.html	Tue Jan 14 18:02:42 2014 +0100
@@ -65,6 +65,13 @@
          <label for="avatar" th:text="#{renkanAdmin.form.avatar}">Avatar: </label> 
          <input type="text" th:field="*{avatar}" /> 
        </div>
+<!-- todo: only user managing the group can see that -->
+       <div>
+           <label for="users" th:text="#{renkanAdmin.form.users}">Groups: </label>
+           <select th:field="*{users}" multiple="multiple">
+               <option th:each="user: ${allUsers}" th:value="${user.id}" th:text="${user.title}">USER</option>
+           </select>
+       </div>
        <div class="submit"> 
          <button type="submit" name="save" th:text="#{renkanAdmin.form.user.submit}">Save</button>
          <!--button type="button" name="cancel" th:text="#{renkanAdmin.form.user.cancel}" th:onclick="location">Cancel</button-->
--- a/server/src/main/webapp/WEB-INF/templates/fragment/userForm.html	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/webapp/WEB-INF/templates/fragment/userForm.html	Tue Jan 14 18:02:42 2014 +0100
@@ -130,6 +130,13 @@
          <label for="locked" th:text="#{renkanAdmin.form.locked}">Locked: </label> 
          <input type="checkbox" th:field="*{locked}" /> 
        </div>
+<!-- todo: only user of admin group can see that -->
+       <div>
+           <label for="groups" th:text="#{renkanAdmin.form.groups}">Groups: </label>
+           <select th:field="*{groups}" multiple="multiple">
+               <option th:each="group: ${allGroups}" th:value="${group.id}" th:text="${group.title}">GROUP</option>
+           </select>
+       </div>
        <div>
            <label for="userAuthorities" th:text="#{renkanAdmin.form.roles}">Roles: </label>
            <select th:field="*{userAuthorities}" multiple="multiple">
--- a/server/src/main/webapp/static/css/index.css	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/main/webapp/static/css/index.css	Tue Jan 14 18:02:42 2014 +0100
@@ -269,7 +269,7 @@
   float: left;
 }
 
-.form-fields input, .form-fields textarea {
+.form-fields input, .form-fields textarea, .form-fields select {
   width:200px;
 }
 
--- a/server/src/test/java/org/iri_research/renkan/test/controller/GroupsAdminControllerTest.java	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/test/java/org/iri_research/renkan/test/controller/GroupsAdminControllerTest.java	Tue Jan 14 18:02:42 2014 +0100
@@ -447,5 +447,38 @@
                 this.groupsRepository.count());
 
     }
+    
+    @Test
+    public void testUpdateUserGroups() throws Exception {
+        
+        MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+                .post("/admin/groups/save");
+        post = post.param("id", this.groupsUuids.get(0));
+        post = post.param("title", "New name");
+        post = post.param("description", "New description");
+        post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+        post = post.param("color", "#ffffff");
+        post = post.param("users", this.usersUuids.toArray(new String[GroupsAdminControllerTest.GROUP_NB]));
+
+        this.mvc.perform(post)
+                .andExpect(MockMvcResultMatchers.status().isSeeOther())
+                .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/groups"));
+
+        Group group = this.groupsRepository.findOne(this.groupsUuids.get(0));
+
+        Assert.assertNotNull("Should find group", group);
+        Assert.assertEquals("Title equals", "New name", group.getTitle());
+        Assert.assertEquals("Description equals", "New description",
+                group.getDescription());
+        Assert.assertEquals("Uri equals",
+                "http://ldt.iri.centrepompidou.fr/new/uri", group.getUri());
+        Assert.assertEquals("Color equals", "#ffffff", group.getColor());
+
+        Assert.assertNotNull("Users must be set", group.getUsers());
+        Assert.assertEquals("all users must be set", USER_NB, group.getUsers().size());
+        Assert.assertTrue("users list must contains all users", this.usersUuids.containsAll(group.getUsers()));
+        
+    }
+
 
 }
--- a/server/src/test/java/org/iri_research/renkan/test/controller/UsersAdminControllerTest.java	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/test/java/org/iri_research/renkan/test/controller/UsersAdminControllerTest.java	Tue Jan 14 18:02:42 2014 +0100
@@ -9,9 +9,11 @@
 import java.util.UUID;
 
 import org.apache.commons.codec.binary.Hex;
+import org.iri_research.renkan.models.Group;
 import org.iri_research.renkan.models.Project;
 import org.iri_research.renkan.models.Space;
 import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.GroupsRepository;
 import org.iri_research.renkan.repositories.ProjectsRepository;
 import org.iri_research.renkan.repositories.SpacesRepository;
 import org.iri_research.renkan.repositories.UsersRepository;
@@ -49,6 +51,7 @@
 
     private final static int SPACE_NB = 3;
     private final static int USER_NB = 3;
+    private final static int GROUP_NB = 4;
 
     private Logger logger = LoggerFactory.getLogger(UsersAdminControllerTest.class);
 
@@ -58,7 +61,10 @@
     private ProjectsRepository projectsRepository;
     @Autowired
     private UsersRepository usersRepository;
-    
+    @Autowired
+    private GroupsRepository groupsRepository;
+
+
     @Autowired
     private PasswordEncoder renkanPasswordEncoder;
 
@@ -70,6 +76,8 @@
     private Map<String, User> usersList = new HashMap<String, User>(USER_NB);
     private List<String> usersUuids = new ArrayList<>(USER_NB);
     
+    private Map<String, Group> groupsList = new HashMap<String, Group>(GROUP_NB);
+    private List<String> groupsUuids = new ArrayList<>(GROUP_NB);
 
     @Autowired
     private WebApplicationContext context;
@@ -98,6 +106,21 @@
             this.usersList.put(uuid, user);
         }
         
+        for(int i=0; i < GROUP_NB; i++) {
+            String uuid = UUID.randomUUID().toString();
+            Group group = new Group(uuid, "group" + i, "Group nb " + i, "http://www.iri.centrepompidou.fr/group/"+uuid, "#ababab");
+            group.setAvatar("A pretty group picture " + i);
+            group = groupsRepository.save(group);
+            this.groupsUuids.add(uuid);
+            this.groupsList.put(uuid, group);
+            try {
+                Thread.sleep(1);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+        }
+        
         ArrayList<Project> pl = new ArrayList<Project>();
         for (int i = 0; i < SPACE_NB; i++) {
             DateTime creationDate = new DateTime();
@@ -490,5 +513,37 @@
                 this.usersRepository.count());
 
     }
+    
+    @Test
+    public void testUpdateUserGroups() throws Exception {
+        
+        MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+                .post("/admin/users/save");
+        post = post.param("id", this.usersUuids.get(0));
+        post = post.param("title", "New name");
+        post = post.param("description", "New description");
+        post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+        post = post.param("color", "#ffffff");
+        post = post.param("groups", this.groupsUuids.toArray(new String[UsersAdminControllerTest.GROUP_NB]));
+
+        this.mvc.perform(post)
+                .andExpect(MockMvcResultMatchers.status().isSeeOther())
+                .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/users"));
+
+        User user = this.usersRepository.findOne(this.usersUuids.get(0));
+
+        Assert.assertNotNull("Should find user", user);
+        Assert.assertEquals("Title equals", "New name", user.getTitle());
+        Assert.assertEquals("Description equals", "New description",
+                user.getDescription());
+        Assert.assertEquals("Uri equals",
+                "http://ldt.iri.centrepompidou.fr/new/uri", user.getUri());
+        Assert.assertEquals("Color equals", "#ffffff", user.getColor());
+
+        Assert.assertNotNull("Groups must be set", user.getGroups());
+        Assert.assertEquals("all users must be set", GROUP_NB, user.getGroups().size());
+        Assert.assertTrue("users list must contains all users", this.groupsUuids.containsAll(user.getGroups()));
+
+    }
 
 }
--- a/server/src/test/java/org/iri_research/renkan/test/repositories/GroupsRepositoryTest.java	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/test/java/org/iri_research/renkan/test/repositories/GroupsRepositoryTest.java	Tue Jan 14 18:02:42 2014 +0100
@@ -4,6 +4,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.TimeZone;
 import java.util.UUID;
 
@@ -356,6 +357,29 @@
         }
 
     }
+
+    @Test
+    public void testGetUsersMap() {
+        
+        Group group = this.groupsList.get(this.groupsUuids.get(0));
+        
+        List<String> userIds = this.usersUuids;
+        
+        this.groupsRepository.setUsersList(group, userIds);
+        
+        
+        Map<String, User> usersMap = this.groupsRepository.getUsersMap(group);
+        
+        Assert.assertEquals ("user map should have same length than users list", this.usersUuids.size(), usersMap.size());
+        Assert.assertTrue("user map should contains all uuids", this.usersUuids.containsAll(usersMap.keySet()));
+        for (Entry<String, User> entry : usersMap.entrySet()) {
+            User user = entry.getValue();
+            String userId = entry.getKey();
+            Assert.assertTrue("user id in user uuid", this.usersUuids.contains(userId));
+            Assert.assertEquals("key id and value user id must be the same", userId, user.getId());
+        }
+
+    }
     
 
     @After
--- a/server/src/test/java/org/iri_research/renkan/test/repositories/UsersRepositoryTest.java	Mon Jan 06 10:06:50 2014 +0100
+++ b/server/src/test/java/org/iri_research/renkan/test/repositories/UsersRepositoryTest.java	Tue Jan 14 18:02:42 2014 +0100
@@ -6,6 +6,7 @@
 import java.util.Map;
 import java.util.TimeZone;
 import java.util.UUID;
+import java.util.Map.Entry;
 
 import org.iri_research.renkan.models.Group;
 import org.iri_research.renkan.models.User;
@@ -371,6 +372,26 @@
 
     }
     
+    @Test
+    public void testGetUsersMap() {
+        
+        User user = this.usersList.get(this.usersUuids.get(0));
+        
+        List<String> groupdIds = this.groupsUuids;
+        
+        this.usersRepository.setGroupsList(user, groupdIds);
+        
+        
+        Map<String, Group> groupsMap = this.usersRepository.getGroupsMap(user);
+        
+        Assert.assertEquals ("Group map should have same length than groups list", this.groupsUuids.size(), groupsMap.size());
+        Assert.assertTrue("Group map should contains all uuids", this.groupsUuids.containsAll(groupsMap.keySet()));
+        for (Entry<String, Group> entry : groupsMap.entrySet()) {
+            Assert.assertTrue("user id in user uuid", this.groupsUuids.contains(entry.getKey()));
+            Assert.assertEquals("key id and value user id must be the same", entry.getKey(), entry.getValue().getId());
+        }
+    }
+    
 
     @After
     public void teardown() {