Add group and user management on user and group repositories + unit tests user_management
authorymh <ymh.work@gmail.com>
Tue, 17 Dec 2013 22:41:20 +0100
branchuser_management
changeset 237 0e6c826a046e
parent 236 73150fdbcafc
child 238 ffe523338543
Add group and user management on user and group repositories + unit tests
.classpath
server/pom.xml
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/models/Edge.java
server/src/main/java/org/iri_research/renkan/models/Group.java
server/src/main/java/org/iri_research/renkan/models/Project.java
server/src/main/java/org/iri_research/renkan/models/RosterUser.java
server/src/main/java/org/iri_research/renkan/models/Space.java
server/src/main/java/org/iri_research/renkan/models/User.java
server/src/main/java/org/iri_research/renkan/repositories/GroupsRepository.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/UsersRepository.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/templates/fragment/userForm.html
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/.classpath	Wed Dec 11 11:36:08 2013 +0100
+++ b/.classpath	Tue Dec 17 22:41:20 2013 +0100
@@ -203,5 +203,6 @@
 	<classpathentry kind="var" path="M2_REPO/com/fasterxml/jackson/datatype/jackson-datatype-joda/2.2.3/jackson-datatype-joda-2.2.3.jar"/>
 	<classpathentry kind="var" path="M2_REPO/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.2.3/jackson-jaxrs-json-provider-2.2.3.jar"/>
 	<classpathentry kind="var" path="M2_REPO/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.2.3/jackson-jaxrs-base-2.2.3.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-collections4/4.0/commons-collections4-4.0.jar"/>
 	<classpathentry kind="output" path="server/target/classes"/>
 </classpath>
--- a/server/pom.xml	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/pom.xml	Tue Dec 17 22:41:20 2013 +0100
@@ -442,6 +442,11 @@
             <artifactId>java-uuid-generator</artifactId>
             <version>${fasterxml-java-uuid-generator-version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.0</version>
+        </dependency>
     </dependencies>
     <organization>
         <name>IRI</name>
--- a/server/src/main/java/org/iri_research/renkan/forms/GroupForm.java	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/src/main/java/org/iri_research/renkan/forms/GroupForm.java	Tue Dec 17 22:41:20 2013 +0100
@@ -1,5 +1,8 @@
 package org.iri_research.renkan.forms;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.iri_research.renkan.Constants;
 import org.iri_research.renkan.models.Group;
 import org.iri_research.renkan.repositories.GroupsRepository;
@@ -9,6 +12,7 @@
 public class GroupForm extends RenkanForm<String, Group> {
 
     private String avatar;
+    private List<String> users;
 
     private GroupsRepository groupsRepository;
     
@@ -21,6 +25,10 @@
         super(model);
         if (model != null) {
             this.avatar = model.getAvatar();
+            this.setUsers(new ArrayList<String>());
+            if(model.getUsers() != null) {
+                this.getUsers().addAll(model.getUsers());
+            }
         }
     }
 
@@ -49,7 +57,9 @@
             this.model.setId(Constants.UUID_GENERATOR.generate().toString());
         }
         this.model.setAvatar(this.avatar);
-
+        if(this.getUsers() != null) {
+            this.groupsRepository.setUsersList(model, this.getUsers());
+        }
     }
 
     public void setAvatar(String avatar) {
@@ -61,6 +71,14 @@
     public void setGroupsRepository(GroupsRepository groupsRepository) {
         this.groupsRepository = groupsRepository;
     }
+    
+    public List<String> getUsers() {
+        return users;
+    }
+
+    public void setUsers(List<String> users) {
+        this.users = users;
+    }
 
 
 }
--- a/server/src/main/java/org/iri_research/renkan/forms/UserForm.java	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/src/main/java/org/iri_research/renkan/forms/UserForm.java	Tue Dec 17 22:41:20 2013 +0100
@@ -18,7 +18,7 @@
     private String avatar;
 
     @DateTimeFormat(iso = ISO.DATE)
-    private LocalDate credentialExpirationDate;
+    private LocalDate credentialsExpirationDate;
     @DateTimeFormat(iso = ISO.DATE)
     private LocalDate expirationDate;
 
@@ -47,7 +47,7 @@
         super(model);
         if (model != null) {
             this.avatar = model.getAvatar();
-            this.credentialExpirationDate = model.getCredentialExpirationDate();
+            this.credentialsExpirationDate = model.getCredentialsExpirationDate();
             this.email = model.getEmail();
             this.expirationDate = model.getExpirationDate();
             this.enabled = model.isEnabled();
@@ -60,8 +60,8 @@
         return avatar;
     }
 
-    public LocalDate getCredentialExpirationDate() {
-        return credentialExpirationDate;
+    public LocalDate getCredentialsExpirationDate() {
+        return credentialsExpirationDate;
     }
 
     public String getEmail() {
@@ -109,7 +109,7 @@
         }
         this.model.setAvatar(this.avatar);
         this.model.setEmail(this.email);
-        this.model.setCredentialExpirationDate(this.credentialExpirationDate);
+        this.model.setCredentialsExpirationDate(this.credentialsExpirationDate);
         this.model.setExpirationDate(this.expirationDate);
         this.model.setEnabled(this.enabled);
         this.model.setLocked(this.locked);
@@ -124,8 +124,8 @@
         this.avatar = avatar;
     }
 
-    public void setCredentialExpirationDate(LocalDate credentialExpirationDate) {
-        this.credentialExpirationDate = credentialExpirationDate;
+    public void setCredentialsExpirationDate(LocalDate credentialsExpirationDate) {
+        this.credentialsExpirationDate = credentialsExpirationDate;
     }
 
     public void setEmail(String email) {
--- a/server/src/main/java/org/iri_research/renkan/models/Edge.java	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/src/main/java/org/iri_research/renkan/models/Edge.java	Tue Dec 17 22:41:20 2013 +0100
@@ -87,7 +87,6 @@
 
     @Override
     protected String getRawKeyPart() {
-        // TODO Auto-generated method stub
         return this.createdBy;
     }
 
--- a/server/src/main/java/org/iri_research/renkan/models/Group.java	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/src/main/java/org/iri_research/renkan/models/Group.java	Tue Dec 17 22:41:20 2013 +0100
@@ -1,11 +1,15 @@
 package org.iri_research.renkan.models;
 
+import java.util.Set;
+import java.util.TreeSet;
+
 import org.springframework.data.mongodb.core.mapping.Document;
 
 @Document(collection = "groups")
 public class Group extends AbstractRenkanModel<String> {
 
     private String avatar;
+    private Set<String> users = new TreeSet<>();
     
     public Group() {
     }
@@ -29,8 +33,34 @@
 
     @Override
     protected String getRawKeyPart() {
-        // TODO Auto-generated method stub
-        return "";
+        return this.id;
+    }
+    
+    public Set<String> getUsers() {
+        if(this.users == null) {
+            this.users = new TreeSet<>();
+        }
+        return this.users;
+    }
+
+
+    public boolean addUser(User user) {
+        return this.addUser(user.getId());
+    }
+    
+    public boolean addUser(String userId) {
+        return this.getUsers().add(userId);
+    }
+    
+    public boolean removeUser(User user) {
+        return this.removeUser(user.getId());
+    }
+    
+    public boolean removeUser(String userId) {
+        if(this.getUsers() != null) {
+            return this.getUsers().remove(userId);
+        }
+        return false;
     }
 
 }
--- a/server/src/main/java/org/iri_research/renkan/models/Project.java	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/src/main/java/org/iri_research/renkan/models/Project.java	Tue Dec 17 22:41:20 2013 +0100
@@ -256,7 +256,7 @@
 
     @Override
     protected String getRawKeyPart() {
-        return Long.toString(this.getCreated().getMillis());
+        return this.getId() + Long.toString(this.getCreated().getMillis());
     }
 
 }
--- a/server/src/main/java/org/iri_research/renkan/models/RosterUser.java	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/src/main/java/org/iri_research/renkan/models/RosterUser.java	Tue Dec 17 22:41:20 2013 +0100
@@ -50,7 +50,7 @@
 
     @Override
     protected String getRawKeyPart() {
-        return "";
+        return this.id;
     }
 
 }
--- a/server/src/main/java/org/iri_research/renkan/models/Space.java	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/src/main/java/org/iri_research/renkan/models/Space.java	Tue Dec 17 22:41:20 2013 +0100
@@ -76,7 +76,7 @@
 
     @Override
     protected String getRawKeyPart() {
-        return Long.toString(this.getCreated().getMillis());
+        return this.id+Long.toString(this.getCreated().getMillis());
     }
 
 }
\ No newline at end of file
--- a/server/src/main/java/org/iri_research/renkan/models/User.java	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/src/main/java/org/iri_research/renkan/models/User.java	Tue Dec 17 22:41:20 2013 +0100
@@ -2,7 +2,10 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
 
 import org.iri_research.renkan.Constants;
 import org.joda.time.LocalDate;
@@ -17,6 +20,21 @@
 
 @Document(collection = "users")
 public class User extends AbstractRenkanModel<String> implements UserDetails {
+    
+    public static class UserComparator implements Comparator<User> {
+
+        @Override
+        public int compare(User u1, User u2) {
+            if(u1 == null || u1.getId() == null) {
+                return (u2==null || u2.getId() == null)? 0 : Integer.MIN_VALUE;
+            }
+            else {
+                return u2==null?Integer.MAX_VALUE:u1.getId().compareTo(u2.getId());
+            }
+            
+        }
+        
+    }
 
     private static final long serialVersionUID = 6972038893086220548L;
     
@@ -24,7 +42,7 @@
     private String avatar;
     @Field("credentials_expiration_date")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
-    private LocalDate credentialExpirationDate;
+    private LocalDate credentialsExpirationDate;
     private String email;
     private boolean enabled;
     @Field("expiration_date")
@@ -34,6 +52,8 @@
     private String password;
     @Field("authorities")
     private List<String> userAuthorities;
+    
+    private Set<String> groups = new TreeSet<>();
 
     public User() {
     }
@@ -66,8 +86,8 @@
         return this.color;
     }
 
-    public LocalDate getCredentialExpirationDate() {
-        return credentialExpirationDate;
+    public LocalDate getCredentialsExpirationDate() {
+        return credentialsExpirationDate;
     }
 
     public String getEmail() {
@@ -86,7 +106,7 @@
 
     @Override
     protected String getRawKeyPart() {
-        return "";
+        return this.id;
     }
 
     public List<String> getUserAuthorities() {
@@ -112,8 +132,8 @@
 
     @Override
     public boolean isCredentialsNonExpired() {
-        return this.credentialExpirationDate == null
-                || this.credentialExpirationDate.isAfter(LocalDate.now());
+        return this.credentialsExpirationDate == null
+                || this.credentialsExpirationDate.isAfter(LocalDate.now());
     }
 
     @Override
@@ -129,8 +149,8 @@
         this.avatar = avatar;
     }
 
-    public void setCredentialExpirationDate(LocalDate credentialExpirationDate) {
-        this.credentialExpirationDate = credentialExpirationDate;
+    public void setCredentialsExpirationDate(LocalDate credentialsExpirationDate) {
+        this.credentialsExpirationDate = credentialsExpirationDate;
     }
 
     public void setEmail(String email) {
@@ -157,4 +177,28 @@
         this.userAuthorities = userAuthorities;
     }
 
+    public Set<String> getGroups() {
+        if(this.groups == null) {
+            this.groups = new TreeSet<>();
+        }
+        return groups;
+    }
+    
+    
+    public boolean addGroup(Group g) {
+        return this.addGroup(g.getId());
+    }
+
+    public boolean addGroup(String groupId) {
+        return this.getGroups().add(groupId);
+    }
+
+    public boolean removeGroup(Group g) {
+        return this.removeGroup(g.getId());
+    }
+    
+    public boolean removeGroup(String groupId) {
+        return (this.groups == null)?false:this.groups.remove(groupId);
+    }
+
 }
--- a/server/src/main/java/org/iri_research/renkan/repositories/GroupsRepository.java	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/src/main/java/org/iri_research/renkan/repositories/GroupsRepository.java	Tue Dec 17 22:41:20 2013 +0100
@@ -6,7 +6,7 @@
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 
-public interface GroupsRepository extends IRenkanRepository<Group, String> {
+public interface GroupsRepository extends IRenkanRepository<Group, String>, GroupsRepositoryCustom {
 
     public List<Group> findByTitle(String title);
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/java/org/iri_research/renkan/repositories/GroupsRepositoryCustom.java	Tue Dec 17 22:41:20 2013 +0100
@@ -0,0 +1,9 @@
+package org.iri_research.renkan.repositories;
+
+import java.util.List;
+
+import org.iri_research.renkan.models.Group;
+
+public interface GroupsRepositoryCustom {
+    public void setUsersList(Group group, List<String> userIds);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/java/org/iri_research/renkan/repositories/GroupsRepositoryImpl.java	Tue Dec 17 22:41:20 2013 +0100
@@ -0,0 +1,50 @@
+package org.iri_research.renkan.repositories;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.collections4.IteratorUtils;
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.models.User;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class GroupsRepositoryImpl implements GroupsRepositoryCustom {
+
+    @Autowired
+    private UsersRepository usersRepository;
+    
+    @Autowired
+    private GroupsRepository groupsRepository;
+    
+    @Override
+    // TODO: implement a transaction mecanism...
+    public void setUsersList(Group group, List<String> userIds) {
+        
+        // takes previous user list
+        List<String> oldUsers = new ArrayList<>(group.getUsers());
+        
+        // calculate difference between two list
+        List<String> userIdDel =  new ArrayList<>(oldUsers);
+        userIdDel.removeAll(userIds);
+        
+        List<String> userIdAdd = new ArrayList<>(userIds);
+        userIdAdd.removeAll(oldUsers);
+        
+        List<User> userAdd = IteratorUtils.toList(this.usersRepository.findAll(userIdAdd).iterator());
+        for (User user : userAdd) {
+            user.addGroup(group.getId());
+        }
+        this.usersRepository.save(userAdd);
+        List<User> userDel = IteratorUtils.toList(this.usersRepository.findAll(userIdDel).iterator());
+        for (User user : userDel) {
+            user.removeGroup(group.getId());
+        }
+        this.usersRepository.save(userDel);
+        
+        group.getUsers().clear();
+        group.getUsers().addAll(userIds);
+        
+        this.groupsRepository.save(group);
+    }
+
+}
--- a/server/src/main/java/org/iri_research/renkan/repositories/UsersRepository.java	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/src/main/java/org/iri_research/renkan/repositories/UsersRepository.java	Tue Dec 17 22:41:20 2013 +0100
@@ -6,7 +6,7 @@
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 
-public interface UsersRepository extends IRenkanRepository<User, String> {
+public interface UsersRepository extends IRenkanRepository<User, String>, UsersRepositoryCustom {
 
     public List<User> findByTitle(String title);
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/java/org/iri_research/renkan/repositories/UsersRepositoryCustom.java	Tue Dec 17 22:41:20 2013 +0100
@@ -0,0 +1,9 @@
+package org.iri_research.renkan.repositories;
+
+import java.util.List;
+
+import org.iri_research.renkan.models.User;
+
+public interface UsersRepositoryCustom {
+    public void setGroupsList(User user, List<String> groupIds);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/java/org/iri_research/renkan/repositories/UsersRepositoryImpl.java	Tue Dec 17 22:41:20 2013 +0100
@@ -0,0 +1,50 @@
+package org.iri_research.renkan.repositories;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.collections4.IteratorUtils;
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.models.User;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class UsersRepositoryImpl implements UsersRepositoryCustom {
+
+    @Autowired
+    private UsersRepository usersRepository;
+    
+    @Autowired
+    private GroupsRepository groupsRepository;
+    
+    @Override
+    // TODO: implement a transaction mecanism...
+    public void setGroupsList(User user, List<String> groupIds) {
+        
+        // takes previous user list
+        List<String> oldGroups = new ArrayList<>(user.getGroups());
+        
+        // calculate difference between two list
+        List<String> groupIdDel =  new ArrayList<>(oldGroups);
+        groupIdDel.removeAll(groupIds);
+        
+        List<String> groupIdAdd = new ArrayList<>(groupIds);
+        groupIdAdd.removeAll(oldGroups);
+        
+        List<Group> groupAdd = IteratorUtils.toList(this.groupsRepository.findAll(groupIdAdd).iterator());
+        for (Group group : groupAdd) {
+            group.addUser(user);
+        }
+        this.groupsRepository.save(groupAdd);
+        List<Group> groupDel = IteratorUtils.toList(this.groupsRepository.findAll(groupIdDel).iterator());
+        for (Group group : groupDel) {
+            group.removeUser(user);
+        }
+        this.groupsRepository.save(groupDel);
+        
+        user.getGroups().clear();
+        user.getGroups().addAll(groupIds);
+        
+        this.usersRepository.save(user);
+    }
+
+}
--- a/server/src/main/webapp/WEB-INF/templates/fragment/userForm.html	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/src/main/webapp/WEB-INF/templates/fragment/userForm.html	Tue Dec 17 22:41:20 2013 +0100
@@ -108,9 +108,9 @@
          <div th:if="${#fields.hasErrors('passwordConfirm')}" th:errors="*{passwordConfirm}" class="form-error"></div>
        </div>       
        <div>
-         <label for="credentialExpirationDate" th:text="#{renkanAdmin.form.credentialExpirationDate}">Credential expiration date: </label>
-         <input type="hidden" name="credentialExpirationDate" th:field="*{credentialExpirationDate}"/>
-         <input type="text" id="credentialExpirationDate-disp" class="datepicker" value="01/01/1970" th:value="${user.credentialExpirationDate != null}?${user.credentialExpirationDate.toString(#messages.msg('date.date.format'))}:''"/>
+         <label for="credentialsExpirationDate" th:text="#{renkanAdmin.form.credentialsExpirationDate}">Credential expiration date: </label>
+         <input type="hidden" name="credentialsExpirationDate" th:field="*{credentialsExpirationDate}"/>
+         <input type="text" id="credentialsExpirationDate-disp" class="datepicker" value="01/01/1970" th:value="${user.credentialsExpirationDate != null}?${user.credentialsExpirationDate.toString(#messages.msg('date.date.format'))}:''"/>
           
        </div>
        <div>
--- a/server/src/test/java/org/iri_research/renkan/test/controller/GroupsAdminControllerTest.java	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/src/test/java/org/iri_research/renkan/test/controller/GroupsAdminControllerTest.java	Tue Dec 17 22:41:20 2013 +0100
@@ -103,7 +103,7 @@
             user.setEnabled(true);
             user.setAvatar("A pretty picture");
             user.setExpirationDate(new LocalDate());
-            user.setCredentialExpirationDate(new LocalDate());
+            user.setCredentialsExpirationDate(new LocalDate());
             user.setEmail(String.format("user%d@mail.com", i));
             user = usersRepository.save(user);
             this.usersUuids.add(uuid);
@@ -294,7 +294,7 @@
                 .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
                 .param("color", "#ffffff")
                 .param("expirationDate","2007-11-24")
-                .param("credentialExpirationDate","2009-11-29")
+                .param("credentialsExpirationDate","2009-11-29")
                 .param("password", "test")
                 .param("passwordConfirm", "test2");
 
--- a/server/src/test/java/org/iri_research/renkan/test/controller/UsersAdminControllerTest.java	Wed Dec 11 11:36:08 2013 +0100
+++ b/server/src/test/java/org/iri_research/renkan/test/controller/UsersAdminControllerTest.java	Tue Dec 17 22:41:20 2013 +0100
@@ -91,7 +91,7 @@
             user.setEnabled(true);
             user.setAvatar("A pretty picture");
             user.setExpirationDate(new LocalDate());
-            user.setCredentialExpirationDate(new LocalDate());
+            user.setCredentialsExpirationDate(new LocalDate());
             user.setEmail(String.format("user%d@mail.com", i));
             user = usersRepository.save(user);
             this.usersUuids.add(uuid);
@@ -177,7 +177,7 @@
                     .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
                     .param("color", "#ffffff")
                     .param("expirationDate","2007-11-24")
-                    .param("credentialExpirationDate","2009-11-29")
+                    .param("credentialsExpirationDate","2009-11-29")
                     .param("password", "test")
                     .param("passwordConfirm", "test");
 
@@ -222,7 +222,7 @@
                 .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
                 .param("color", "#ffffff")
                 .param("expirationDate","2007-11-24")
-                .param("credentialExpirationDate","2009-11-29")
+                .param("credentialsExpirationDate","2009-11-29")
                 .param("password", "test")
                 .param("passwordConfirm", "test");
 
@@ -254,7 +254,7 @@
                 .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
                 .param("color", "#ffffff")
                 .param("expirationDate","2007-11-24")
-                .param("credentialExpirationDate","2009-11-29")
+                .param("credentialsExpirationDate","2009-11-29")
                 .param("password", "test")
                 .param("passwordConfirm", "test");
 
@@ -281,7 +281,7 @@
                 .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
                 .param("color", "#ffffff")
                 .param("expirationDate","2007-11-24")
-                .param("credentialExpirationDate","2009-11-29")
+                .param("credentialsExpirationDate","2009-11-29")
                 .param("password", "test")
                 .param("passwordConfirm", "test2");
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/test/java/org/iri_research/renkan/test/repositories/GroupsRepositoryTest.java	Tue Dec 17 22:41:20 2013 +0100
@@ -0,0 +1,367 @@
+package org.iri_research.renkan.test.repositories;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.GroupsRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.joda.time.LocalDate;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("repositories-context.xml")
+public class GroupsRepositoryTest {
+
+    private final static int USER_NB = 3;
+    private final static int GROUP_NB = 3;
+
+    private Logger logger = LoggerFactory.getLogger(GroupsRepositoryTest.class);
+
+    @Autowired
+    private UsersRepository usersRepository;
+    @Autowired
+    private GroupsRepository groupsRepository;
+
+    
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    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);
+
+    
+    @Before
+    public void setup() {
+
+        logger.debug("Setup");
+        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+        usersRepository.deleteAll();
+        for(int i=0; i < USER_NB; i++) {
+            String uuid = UUID.randomUUID().toString();
+            User user = new User(uuid, "user" + i, "User nb " + i, "http://www.iri.centrepompidou.fr", "#ababab");
+            user.setLocked(false);
+            user.setEnabled(true);
+            user.setAvatar("A pretty picture");
+            user.setExpirationDate(new LocalDate());
+            user.setCredentialsExpirationDate(new LocalDate());
+            user.setEmail(String.format("user%d@mail.com", i));
+            user = usersRepository.save(user);
+            this.usersUuids.add(uuid);
+            this.usersList.put(uuid, user);
+            try {
+                Thread.sleep(1);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+        
+        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();
+            }
+
+        }
+
+
+    }
+
+    @Test
+    public void testGroupFieldMapping() {
+        // query json directly with mongodb driver
+        // check field values
+        DBCollection coll = mongoTemplate.getCollection(mongoTemplate
+                .getCollectionName(Group.class));
+
+        for (DBObject obj : coll.find()) {
+            Assert.assertTrue("mongo object must have _id field",
+                    obj.containsField("_id"));
+
+            String id = obj.get("_id").toString();
+
+            Group group = this.groupsList.get(id);
+
+            Assert.assertTrue("mongo object must have title field",
+                    obj.containsField("title"));
+            Assert.assertEquals("Titles must be the same",
+                    group.getTitle(), obj.get("title"));
+
+            Assert.assertTrue("mongo object must have description field",
+                    obj.containsField("description"));
+            Assert.assertEquals("description must be the same",
+                    group.getDescription(), obj.get("description"));
+
+            Assert.assertTrue("mongo object must have color field",
+                    obj.containsField("color"));
+            Assert.assertEquals("Color must be the same", group.getColor(), obj.get("color"));
+
+            Assert.assertTrue("mongo object must have uri field",
+                    obj.containsField("uri"));
+            Assert.assertEquals("Uri must be the same", group.getUri(), obj.get("uri"));
+            
+            Assert.assertTrue("mongo object must have avatar field",
+                    obj.containsField("avatar"));
+            Assert.assertEquals("Avater must be the same", group.getAvatar(), obj.get("avatar"));
+
+        }
+    }
+    
+    @Test
+    public void testSetUsersList() {
+
+        Group group = this.groupsList.get(this.groupsUuids.get(0));
+        
+        List<String> userIds = this.usersUuids;
+        
+        this.groupsRepository.setUsersList(group, userIds);
+        
+        //reload user
+        group = this.groupsRepository.findOne(group.getId());
+        
+        Assert.assertEquals("group user list is big enough", userIds.size(), group.getUsers().size());
+        Assert.assertTrue("Group user list contains all users", group.getUsers().containsAll(userIds));
+
+        for (User u : this.usersRepository.findAll(userIds)) {
+            Assert.assertEquals(String.format("user list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
+            Assert.assertTrue(String.format("user list for group %s must contains user %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+        }
+    }
+    
+
+    @Test
+    public void testAddUsersList() {
+        Group group = this.groupsList.get(this.groupsUuids.get(1));
+        
+        List<String> userIds = this.usersUuids.subList(0, 1);
+        this.groupsRepository.setUsersList(group, userIds);
+        
+        group = this.groupsRepository.findOne(group.getId());
+        
+        Assert.assertEquals("group users is big enough", userIds.size(), group.getUsers().size());
+        Assert.assertTrue("User list contains all user", group.getUsers().containsAll(userIds));
+        
+        User user = this.usersRepository.findOne(userIds.get(0));
+        Assert.assertEquals(String.format("group list for user %s must be size 1", user.getId()), 1, user.getGroups().size());
+        Assert.assertTrue(String.format("group list for user %s must contains group %s", user.getId(), group.getId()), user.getGroups().contains(group.getId()));
+        
+        this.groupsRepository.setUsersList(group, this.usersUuids);
+        
+        //reload group
+        group = this.groupsRepository.findOne(group.getId());
+        
+        Assert.assertEquals("group user list is big enough", this.usersUuids.size(), group.getUsers().size());
+        Assert.assertTrue("User list contains all user", group.getUsers().containsAll(this.usersUuids));
+
+        for (User u : this.usersRepository.findAll(this.usersUuids)) {
+            Assert.assertEquals(String.format("group list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
+            Assert.assertTrue(String.format("group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+        }
+
+    }
+    
+    @Test
+    public void testRemoveUsersList() {
+        Group group = this.groupsList.get(this.groupsUuids.get(2));
+        
+        this.groupsRepository.setUsersList(group, this.usersUuids);
+        
+        //reload group
+        group = this.groupsRepository.findOne(group.getId());
+        
+        Assert.assertEquals("Group user list is big enough", this.usersUuids.size(), group.getUsers().size());
+        Assert.assertTrue("User list contains all user", group.getUsers().containsAll(this.usersUuids));
+        
+        for(User user : this.usersRepository.findAll(this.usersUuids)) {
+            Assert.assertEquals(String.format("group list for user %s must be size 1", user.getId()), 1, user.getGroups().size());
+            Assert.assertTrue(String.format("group list for user %s must contains group %s", user.getId(), group.getId()), user.getGroups().contains(group.getId()));
+        }
+        
+        this.groupsRepository.setUsersList(group, this.usersUuids.subList(USER_NB-1, USER_NB));
+        
+        //reload group
+        group = this.groupsRepository.findOne(group.getId());
+        
+        Assert.assertEquals("group user list is big enough", 1, group.getUsers().size());
+        Assert.assertTrue("User list contains all user", group.getUsers().contains(this.usersUuids.get(USER_NB-1)));
+
+        User u = this.usersRepository.findOne(this.usersUuids.get(USER_NB-1));
+        Assert.assertEquals(String.format("group list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
+        Assert.assertTrue(String.format("group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+        
+        for(User otherUser: this.usersRepository.findAll(this.usersUuids.subList(0, USER_NB-2))) {
+            Assert.assertEquals(String.format("group list for user %s must be size 0", otherUser.getId()), 0, otherUser.getGroups().size());
+        }
+
+    }
+
+
+    @Test
+    public void testAddUsersListExisting() {
+        
+       // get first group
+        Group group = this.groupsList.get(this.groupsUuids.get(0));
+        
+        List<String> userIds = this.usersUuids;
+        
+        // set all users for first group
+        this.groupsRepository.setUsersList(group, userIds);
+        
+        //reload group
+        group = this.groupsRepository.findOne(group.getId());
+        
+        //check that group has all users
+        Assert.assertEquals("Group user list is big enough", userIds.size(), group.getUsers().size());
+        Assert.assertTrue("User list contains all user", group.getUsers().containsAll(userIds));
+
+        // and that users have all new group
+        for (User u : this.usersRepository.findAll(userIds)) {
+            Assert.assertEquals(String.format("Group list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
+            Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+        }
+
+        
+        // get second group
+        group = this.groupsList.get(this.groupsUuids.get(1));
+        
+        //first set one user
+        List<String> secondUserIds = this.usersUuids.subList(0, 1);
+        this.groupsRepository.setUsersList(group, secondUserIds);
+        
+        // reload group
+        group = this.groupsRepository.findOne(group.getId());
+        
+        // check that second group has all users
+        Assert.assertEquals("Group user list is big enough", secondUserIds.size(), group.getUsers().size());
+        Assert.assertTrue("User list contains all users", group.getUsers().containsAll(secondUserIds));
+        
+        // check that group has new and old user
+        User user = this.usersRepository.findOne(secondUserIds.get(0));
+        Assert.assertEquals(String.format("Group list for user %s must be size 2", user.getId()), 2, user.getGroups().size());
+        Assert.assertTrue(String.format("Group list for user %s must contains group %s", user.getId(), group.getId()), user.getGroups().contains(group.getId()));
+        Assert.assertTrue(String.format("Group list for user %s must contains group %s", user.getId(), groupsUuids.get(0)), user.getGroups().contains(groupsUuids.get(0)));
+        
+        // set all new users list for second group
+        this.groupsRepository.setUsersList(group, this.usersUuids);
+        
+        //reload group
+        group = this.groupsRepository.findOne(group.getId());
+        
+        //check that group 2 has all users 
+        Assert.assertEquals("Group user list is big enough", this.usersUuids.size(), group.getUsers().size());
+        Assert.assertTrue("User list contains all user", group.getUsers().containsAll(this.usersUuids));
+
+        // check that all users had group 1 and group 2
+        for (User u : this.usersRepository.findAll(this.usersUuids)) {
+            Assert.assertEquals(String.format("Group list for user %s must be size 1", u.getId()), 2, u.getGroups().size());
+            Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+            Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), groupsUuids.get(0)), u.getGroups().contains(groupsUuids.get(0)));
+        }
+
+    }
+
+    
+    @Test
+    public void testRemoveGroupListExisting() {
+        
+        // get first group
+        Group group = this.groupsList.get(this.groupsUuids.get(0));
+        
+        List<String> userIds = this.usersUuids;
+        
+        // set all users for first group
+        this.groupsRepository.setUsersList(group, userIds);
+        
+        //reload group
+        group = this.groupsRepository.findOne(group.getId());
+        
+        //check that group has all users
+        Assert.assertEquals("Group users list is big enough", userIds.size(), group.getUsers().size());
+        Assert.assertTrue("User list contains all user", group.getUsers().containsAll(userIds));
+
+        // and that users have all new group
+        for (User u : this.usersRepository.findAll(userIds)) {
+            Assert.assertEquals(String.format("Group list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
+            Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+        }
+
+        // get 3rd group
+        group = this.groupsList.get(this.groupsUuids.get(2));
+        
+        // set all users for 3rd group
+        this.groupsRepository.setUsersList(group, this.usersUuids);
+        
+        //reload 3rd group
+        group = this.groupsRepository.findOne(group.getId());
+        
+        //check that all users are set for 3rd group
+        Assert.assertEquals("Group users list is big enough", this.usersUuids.size(), group.getUsers().size());
+        Assert.assertTrue("User list contains all users", group.getUsers().containsAll(this.usersUuids));
+        
+        //check that all users has 3rd group and 1st group
+        for(User user : this.usersRepository.findAll(this.usersUuids)) {
+            Assert.assertEquals(String.format("Group list for user %s must be size 2", user.getId()), 2, user.getGroups().size());
+            Assert.assertTrue(String.format("Group list for user %s must contains group %s", user.getId(), group.getId()), user.getGroups().contains(group.getId()));
+            Assert.assertTrue(String.format("Group list for user %s must contains group %s", user.getId(), this.groupsUuids.get(0)), user.getGroups().contains(this.groupsUuids.get(0)));
+        }
+        
+        //set new user list for 3rd group
+        this.groupsRepository.setUsersList(group, this.usersUuids.subList(USER_NB-1, USER_NB));
+        
+        //reload 3rd group
+        group = this.groupsRepository.findOne(group.getId());
+        
+        //check that 3rd group has only one user (last user)
+        Assert.assertEquals("Group users list is big enough", 1, group.getUsers().size());
+        Assert.assertTrue("User list contains all users", group.getUsers().contains(this.usersUuids.get(USER_NB-1)));
+
+        // check that last user has 3rd and 1rst group
+        User u = this.usersRepository.findOne(this.usersUuids.get(USER_NB-1));
+        Assert.assertEquals(String.format("Group list for user %s must be size 1", u.getId()), 2, u.getGroups().size());
+        Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+        Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), this.groupsUuids.get(0)), u.getGroups().contains(this.groupsUuids.get(0)));
+        
+        // check that other users has only 1rst group 
+        for(User otherUser: this.usersRepository.findAll(this.usersUuids.subList(0, USER_NB-2))) {
+            Assert.assertEquals(String.format("Group list for user %s must be size 0", otherUser.getId()), 1, otherUser.getGroups().size());
+            Assert.assertTrue(String.format("Group list for user %s must contains group %s", otherUser.getId(), this.groupsUuids.get(0)), otherUser.getGroups().contains(this.groupsUuids.get(0)));
+        }
+
+    }
+    
+
+    @After
+    public void teardown() {
+        this.usersRepository.deleteAll();
+        this.groupsRepository.deleteAll();
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/test/java/org/iri_research/renkan/test/repositories/UsersRepositoryTest.java	Tue Dec 17 22:41:20 2013 +0100
@@ -0,0 +1,381 @@
+package org.iri_research.renkan.test.repositories;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.GroupsRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.joda.time.LocalDate;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("repositories-context.xml")
+public class UsersRepositoryTest {
+
+    private final static int USER_NB = 3;
+    private final static int GROUP_NB = 3;
+
+    private Logger logger = LoggerFactory.getLogger(UsersRepositoryTest.class);
+
+    @Autowired
+    private UsersRepository usersRepository;
+    @Autowired
+    private GroupsRepository groupsRepository;
+
+    
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    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);
+
+    
+    @Before
+    public void setup() {
+
+        logger.debug("Setup");
+        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+        usersRepository.deleteAll();
+        for(int i=0; i < USER_NB; i++) {
+            String uuid = UUID.randomUUID().toString();
+            User user = new User(uuid, "user" + i, "User nb " + i, "http://www.iri.centrepompidou.fr", "#ababab");
+            user.setLocked(false);
+            user.setEnabled(true);
+            user.setAvatar("A pretty picture");
+            user.setExpirationDate(new LocalDate());
+            user.setCredentialsExpirationDate(new LocalDate());
+            user.setEmail(String.format("user%d@mail.com", i));
+            user = usersRepository.save(user);
+            this.usersUuids.add(uuid);
+            this.usersList.put(uuid, user);
+            try {
+                Thread.sleep(1);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+        
+        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();
+            }
+
+        }
+
+
+    }
+
+    @Test
+    public void testUserFieldMapping() {
+        // query json directly with mongodb driver
+        // check field values
+        DBCollection coll = mongoTemplate.getCollection(mongoTemplate
+                .getCollectionName(User.class));
+
+        for (DBObject obj : coll.find()) {
+            Assert.assertTrue("mongo object must have _id field",
+                    obj.containsField("_id"));
+
+            String id = obj.get("_id").toString();
+
+            User user = this.usersList.get(id);
+
+            Assert.assertTrue("mongo object must have title field",
+                    obj.containsField("title"));
+            Assert.assertEquals("Titles must be the same",
+                    user.getTitle(), obj.get("title"));
+
+            Assert.assertTrue("mongo object must have description field",
+                    obj.containsField("description"));
+            Assert.assertEquals("description must be the same",
+                    user.getDescription(), obj.get("description"));
+
+            Assert.assertTrue("mongo object must have color field",
+                    obj.containsField("color"));
+            Assert.assertEquals("Color must be the same", user.getColor(), obj.get("color"));
+
+            Assert.assertTrue("mongo object must have uri field",
+                    obj.containsField("uri"));
+            Assert.assertEquals("Uri must be the same", user.getUri(), obj.get("uri"));
+
+            Assert.assertTrue("mongo object must have locked field",
+                    obj.containsField("locked"));
+            Assert.assertEquals("Locked must be the same", user.isLocked(), obj.get("locked"));
+
+            Assert.assertTrue("mongo object must have activated field",
+                    obj.containsField("enabled"));
+            Assert.assertEquals("Enabled must be the same", user.isEnabled(), obj.get("enabled"));
+
+            Assert.assertTrue("mongo object must have expiration_date field",
+                    obj.containsField("expiration_date"));
+            Assert.assertEquals("expiration_date must be the same", user.getExpirationDate(), new LocalDate(obj.get("expiration_date")));
+
+            Assert.assertTrue("mongo object must have credentials_expiration_date field",
+                    obj.containsField("credentials_expiration_date"));
+            Assert.assertEquals("credentials_expiration_date by must be the same", user.getCredentialsExpirationDate(), new LocalDate(obj.get("credentials_expiration_date")));
+
+            Assert.assertTrue("mongo object must have email field",
+                    obj.containsField("email"));
+            Assert.assertEquals("Email must be the same", user.getEmail(), obj.get("email"));
+
+            
+        }
+    }
+    
+    @Test
+    public void testSetGroupsList() {
+
+        User user = this.usersList.get(this.usersUuids.get(0));
+        
+        List<String> groupIds = this.groupsUuids;
+        
+        this.usersRepository.setGroupsList(user, groupIds);
+        
+        //reload user
+        user = this.usersRepository.findOne(user.getId());
+        
+        Assert.assertEquals("user group is big enough", groupIds.size(), user.getGroups().size());
+        Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(groupIds));
+
+        for (Group g : this.groupsRepository.findAll(groupIds)) {
+            Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
+            Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+        }
+    }
+    
+
+    @Test
+    public void testAddGroupsList() {
+        User user = this.usersList.get(this.usersUuids.get(1));
+        
+        List<String> groupIds = this.groupsUuids.subList(0, 1);
+        this.usersRepository.setGroupsList(user, groupIds);
+        
+        user = this.usersRepository.findOne(user.getId());
+        
+        Assert.assertEquals("user group is big enough", groupIds.size(), user.getGroups().size());
+        Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(groupIds));
+        
+        Group group = this.groupsRepository.findOne(groupIds.get(0));
+        Assert.assertEquals(String.format("user list for group %s must be size 1", group.getId()), 1, group.getUsers().size());
+        Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), user.getId()), group.getUsers().contains(user.getId()));
+        
+        this.usersRepository.setGroupsList(user, this.groupsUuids);
+        
+        //reload user
+        user = this.usersRepository.findOne(user.getId());
+        
+        Assert.assertEquals("user group is big enough", this.groupsUuids.size(), user.getGroups().size());
+        Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(this.groupsUuids));
+
+        for (Group g : this.groupsRepository.findAll(this.groupsUuids)) {
+            Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
+            Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+        }
+
+    }
+    
+    @Test
+    public void testRemoveGroupsList() {
+        User user = this.usersList.get(this.usersUuids.get(2));
+        
+        this.usersRepository.setGroupsList(user, this.groupsUuids);
+        
+        user = this.usersRepository.findOne(user.getId());
+        
+        Assert.assertEquals("user group is big enough", this.groupsUuids.size(), user.getGroups().size());
+        Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(this.groupsUuids));
+        
+        for(Group group : this.groupsRepository.findAll(this.groupsUuids)) {
+            Assert.assertEquals(String.format("user list for group %s must be size 1", group.getId()), 1, group.getUsers().size());
+            Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), user.getId()), group.getUsers().contains(user.getId()));
+        }
+        
+        this.usersRepository.setGroupsList(user, this.groupsUuids.subList(GROUP_NB-1, GROUP_NB));
+        
+        //reload user
+        user = this.usersRepository.findOne(user.getId());
+        
+        Assert.assertEquals("user group is big enough", 1, user.getGroups().size());
+        Assert.assertTrue("Group list contains all group", user.getGroups().contains(this.groupsUuids.get(GROUP_NB-1)));
+
+        Group g = this.groupsRepository.findOne(this.groupsUuids.get(GROUP_NB-1));
+        Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
+        Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+        
+        for(Group otherGroup: this.groupsRepository.findAll(this.groupsUuids.subList(0, GROUP_NB-2))) {
+            Assert.assertEquals(String.format("user list for group %s must be size 0", otherGroup.getId()), 0, otherGroup.getUsers().size());
+        }
+
+    }
+    
+    @Test
+    public void testAddGroupsListExisting() {
+        
+       // get first user
+        User user = this.usersList.get(this.usersUuids.get(0));
+        
+        List<String> groupIds = this.groupsUuids;
+        
+        // set all groups for first user
+        this.usersRepository.setGroupsList(user, groupIds);
+        
+        //reload user
+        user = this.usersRepository.findOne(user.getId());
+        
+        //check that user has all group
+        Assert.assertEquals("user group is big enough", groupIds.size(), user.getGroups().size());
+        Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(groupIds));
+
+        // and that groups have all new user
+        for (Group g : this.groupsRepository.findAll(groupIds)) {
+            Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
+            Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+        }
+
+        
+        // get second user
+        user = this.usersList.get(this.usersUuids.get(1));
+        
+        //first set one group
+        List<String> secondGroupIds = this.groupsUuids.subList(0, 1);
+        this.usersRepository.setGroupsList(user, secondGroupIds);
+        
+        // relaod user
+        user = this.usersRepository.findOne(user.getId());
+        
+        // check that second user has all groups
+        Assert.assertEquals("user group is big enough", secondGroupIds.size(), user.getGroups().size());
+        Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(secondGroupIds));
+        
+        // check that group has new and old user
+        Group group = this.groupsRepository.findOne(secondGroupIds.get(0));
+        Assert.assertEquals(String.format("user list for group %s must be size 2", group.getId()), 2, group.getUsers().size());
+        Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), user.getId()), group.getUsers().contains(user.getId()));
+        Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), usersUuids.get(0)), group.getUsers().contains(usersUuids.get(0)));
+        
+        // set all new group list for second user
+        this.usersRepository.setGroupsList(user, this.groupsUuids);
+        
+        //reload user
+        user = this.usersRepository.findOne(user.getId());
+        
+        //check that user 2 has all groups 
+        Assert.assertEquals("user group is big enough", this.groupsUuids.size(), user.getGroups().size());
+        Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(this.groupsUuids));
+
+        // check that all groups had user 1 and user 2
+        for (Group g : this.groupsRepository.findAll(this.groupsUuids)) {
+            Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 2, g.getUsers().size());
+            Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+            Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), usersUuids.get(0)), g.getUsers().contains(usersUuids.get(0)));
+        }
+
+    }
+
+    @Test
+    public void testRemoveGroupsListExisting() {
+        
+       // get first user
+        User user = this.usersList.get(this.usersUuids.get(0));
+        
+        List<String> groupIds = this.groupsUuids;
+        
+        // set all groups for first user
+        this.usersRepository.setGroupsList(user, groupIds);
+        
+        //reload user
+        user = this.usersRepository.findOne(user.getId());
+        
+        //check that user has all group
+        Assert.assertEquals("user group is big enough", groupIds.size(), user.getGroups().size());
+        Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(groupIds));
+
+        // and that groups have all new user
+        for (Group g : this.groupsRepository.findAll(groupIds)) {
+            Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
+            Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+        }
+
+        // get 3rd user
+        user = this.usersList.get(this.usersUuids.get(2));
+        
+        // set all group for 3rd user
+        this.usersRepository.setGroupsList(user, this.groupsUuids);
+        
+        //reload 3rd user
+        user = this.usersRepository.findOne(user.getId());
+        
+        //check taht all group are set for 3rd user
+        Assert.assertEquals("user group is big enough", this.groupsUuids.size(), user.getGroups().size());
+        Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(this.groupsUuids));
+        
+        //check that all group has 3rd user and 1st user
+        for(Group group : this.groupsRepository.findAll(this.groupsUuids)) {
+            Assert.assertEquals(String.format("user list for group %s must be size 2", group.getId()), 2, group.getUsers().size());
+            Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), user.getId()), group.getUsers().contains(user.getId()));
+            Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), this.usersUuids.get(0)), group.getUsers().contains(this.usersUuids.get(0)));
+        }
+        
+        //set new group list for 3rd user
+        this.usersRepository.setGroupsList(user, this.groupsUuids.subList(GROUP_NB-1, GROUP_NB));
+        
+        //reload 3rd user
+        user = this.usersRepository.findOne(user.getId());
+        
+        //check that 3rd user has only one group (last group)
+        Assert.assertEquals("user group is big enough", 1, user.getGroups().size());
+        Assert.assertTrue("Group list contains all group", user.getGroups().contains(this.groupsUuids.get(GROUP_NB-1)));
+
+        // check that last group has 3rd and 1rst user
+        Group g = this.groupsRepository.findOne(this.groupsUuids.get(GROUP_NB-1));
+        Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 2, g.getUsers().size());
+        Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+        Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), this.usersUuids.get(0)), g.getUsers().contains(this.usersUuids.get(0)));
+        
+        // check that other groups has only 1rst user 
+        for(Group otherGroup: this.groupsRepository.findAll(this.groupsUuids.subList(0, GROUP_NB-2))) {
+            Assert.assertEquals(String.format("user list for group %s must be size 0", otherGroup.getId()), 1, otherGroup.getUsers().size());
+            Assert.assertTrue(String.format("user list for group %s must contains user %s", otherGroup.getId(), this.usersUuids.get(0)), otherGroup.getUsers().contains(this.usersUuids.get(0)));
+        }
+
+    }
+    
+
+    @After
+    public void teardown() {
+        this.usersRepository.deleteAll();
+        this.groupsRepository.deleteAll();
+    }
+
+}