# HG changeset patch # User ymh # Date 1384504481 -3600 # Node ID b7000ff4989b1bed33373b2acb927faae0673966 # Parent e65766f81b15a9875cf326bc9749388ded18d09e - Use Joda DateTime instead of java.utils.Date - use correct version of jackson diff -r e65766f81b15 -r b7000ff4989b .classpath --- a/.classpath Thu Nov 07 10:42:18 2013 +0100 +++ b/.classpath Fri Nov 15 09:34:41 2013 +0100 @@ -199,7 +199,9 @@ - + + + diff -r e65766f81b15 -r b7000ff4989b server/README.md --- a/server/README.md Thu Nov 07 10:42:18 2013 +0100 +++ b/server/README.md Fri Nov 15 09:34:41 2013 +0100 @@ -6,4 +6,4 @@ - cf pom.xml for dependencies Commandes maven: -mvn -DskipTests -Djava.awt.headless=true clean jetty:run-war +mvn -DskipTests -Djava.awt.headless=true -Duser.timezone="UTC" clean jetty:run-war diff -r e65766f81b15 -r b7000ff4989b server/pom.xml --- a/server/pom.xml Thu Nov 07 10:42:18 2013 +0100 +++ b/server/pom.xml Fri Nov 15 09:34:41 2013 +0100 @@ -247,37 +247,15 @@ jersey-server ${jersey-version} - + org.glassfish.jersey.ext jersey-spring3 ${jersey-version} - org.glassfish.jersey.test-framework.providers @@ -394,6 +372,11 @@ ${jackson-version} + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${jackson-version} + + commons-codec commons-codec ${commons-codec-version} diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/controller/admin/UsersAdminController.java --- a/server/src/main/java/org/iri_research/renkan/controller/admin/UsersAdminController.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/controller/admin/UsersAdminController.java Fri Nov 15 09:34:41 2013 +0100 @@ -2,12 +2,9 @@ import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; -import java.text.SimpleDateFormat; import java.util.Arrays; -import java.util.Date; import java.util.Locale; import java.util.Map; -import java.util.TimeZone; import javax.annotation.Resource; import javax.inject.Inject; @@ -25,7 +22,6 @@ import org.iri_research.renkan.repositories.UsersRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.beans.propertyeditors.StringTrimmerEditor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -68,12 +64,6 @@ @InitBinder public void initDateBinder(final WebDataBinder dataBinder, final Locale locale) { - final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - sdf.setLenient(false); - sdf.setTimeZone(TimeZone.getTimeZone("GMT")); - CustomDateEditor cde = new CustomDateEditor(sdf, true); - dataBinder.registerCustomEditor(Date.class, cde); - dataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); } diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/coweb/RenkanSessionModerator.java --- a/server/src/main/java/org/iri_research/renkan/coweb/RenkanSessionModerator.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/coweb/RenkanSessionModerator.java Fri Nov 15 09:34:41 2013 +0100 @@ -16,6 +16,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.joda.JodaModule; public class RenkanSessionModerator extends DefaultSessionModerator { @@ -225,6 +226,7 @@ Map res = super.getLateJoinState(); ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new JodaModule()); for (String clientId : RenkanSessionModeratorState.INSTANCE .getUsersActivationMap().keySet()) { diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/coweb/event/AbstractSyncEventManager.java --- a/server/src/main/java/org/iri_research/renkan/coweb/event/AbstractSyncEventManager.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/coweb/event/AbstractSyncEventManager.java Fri Nov 15 09:34:41 2013 +0100 @@ -1,7 +1,6 @@ package org.iri_research.renkan.coweb.event; import java.io.Serializable; -import java.util.Date; import java.util.List; import java.util.Map; @@ -15,6 +14,7 @@ import org.iri_research.renkan.repositories.IRenkanRepository; import org.iri_research.renkan.repositories.ProjectSyncsRepository; import org.iri_research.renkan.repositories.ProjectsRepository; +import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -88,7 +88,7 @@ return; } - p.setUpdated(new Date()); + p.setUpdated(new DateTime()); this.projectsRepository.save(p); user_id = (String) values.get("_user_id"); diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/forms/SpaceForm.java --- a/server/src/main/java/org/iri_research/renkan/forms/SpaceForm.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/forms/SpaceForm.java Fri Nov 15 09:34:41 2013 +0100 @@ -1,11 +1,10 @@ package org.iri_research.renkan.forms; -import java.util.Date; - import org.iri_research.renkan.Constants; import org.iri_research.renkan.models.Space; import org.iri_research.renkan.repositories.IRenkanRepository; import org.iri_research.renkan.repositories.SpacesRepository; +import org.joda.time.DateTime; public class SpaceForm extends RenkanForm { @@ -44,7 +43,7 @@ protected void saveToModel() { if (this.getId() == null || this.getId().length() == 0) { this.model.setId(Constants.UUID_GENERATOR.generate().toString()); - this.model.setCreated(new Date()); + this.model.setCreated(new DateTime()); } this.model.setBinConfig(binConfig); this.model.setImage(image); diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/forms/SpaceFormValidator.java --- a/server/src/main/java/org/iri_research/renkan/forms/SpaceFormValidator.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/forms/SpaceFormValidator.java Fri Nov 15 09:34:41 2013 +0100 @@ -11,6 +11,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.joda.JodaModule; @Component public class SpaceFormValidator implements Validator { @@ -32,6 +33,8 @@ if (space.getBinConfig() != null && space.getBinConfig().length() > 0) { boolean valid = false; ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new JodaModule()); + try { mapper.readTree(space.getBinConfig()); valid = true; diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/forms/UserForm.java --- a/server/src/main/java/org/iri_research/renkan/forms/UserForm.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/forms/UserForm.java Fri Nov 15 09:34:41 2013 +0100 @@ -1,22 +1,26 @@ package org.iri_research.renkan.forms; import java.util.ArrayList; -import java.util.Date; import java.util.List; import org.iri_research.renkan.Constants; import org.iri_research.renkan.models.User; import org.iri_research.renkan.repositories.IRenkanRepository; import org.iri_research.renkan.repositories.UsersRepository; +import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.format.annotation.DateTimeFormat.ISO; import org.springframework.security.crypto.password.PasswordEncoder; public class UserForm extends RenkanForm { private String avatar; - private Date credentialExpirationDate; - private Date expirationDate; + @DateTimeFormat(iso = ISO.DATE) + private DateTime credentialExpirationDate; + @DateTimeFormat(iso = ISO.DATE) + private DateTime expirationDate; private String email; @@ -56,7 +60,7 @@ return avatar; } - public Date getCredentialExpirationDate() { + public DateTime getCredentialExpirationDate() { return credentialExpirationDate; } @@ -64,7 +68,7 @@ return email; } - public Date getExpirationDate() { + public DateTime getExpirationDate() { return expirationDate; } @@ -120,7 +124,7 @@ this.avatar = avatar; } - public void setCredentialExpirationDate(Date credentialExpirationDate) { + public void setCredentialExpirationDate(DateTime credentialExpirationDate) { this.credentialExpirationDate = credentialExpirationDate; } @@ -132,7 +136,7 @@ this.enabled = enabled; } - public void setExpirationDate(Date expirationDate) { + public void setExpirationDate(DateTime expirationDate) { this.expirationDate = expirationDate; } diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/forms/UserFormValidator.java --- a/server/src/main/java/org/iri_research/renkan/forms/UserFormValidator.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/forms/UserFormValidator.java Fri Nov 15 09:34:41 2013 +0100 @@ -39,7 +39,7 @@ errors.rejectValue("password", "renkan.error.password.missing"); } - if(!Constants.USER_ROLES_ALL.containsAll(userForm.getUserAuthorities())) { + if(userForm.getUserAuthorities() != null && !Constants.USER_ROLES_ALL.containsAll(userForm.getUserAuthorities())) { errors.rejectValue("userAuthorities", "renkan.error.authorities.bad_value", "Bad role value"); } } diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/models/Project.java --- a/server/src/main/java/org/iri_research/renkan/models/Project.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/models/Project.java Fri Nov 15 09:34:41 2013 +0100 @@ -4,7 +4,6 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -16,6 +15,7 @@ import org.iri_research.renkan.Constants.EditMode; import org.iri_research.renkan.RenkanException; import org.iri_research.renkan.utils.ColorGenerator; +import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -36,9 +36,9 @@ private int revCounter = 1; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT") - private Date created; + private DateTime created; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT") - private Date updated; + private DateTime updated; // Space @Field("space_id") @@ -58,7 +58,7 @@ public Project(Project project) { this(project.spaceId, Constants.UUID_GENERATOR.generate().toString(), - project.title, project.description, project.uri, new Date()); + project.title, project.description, project.uri, new DateTime()); Map nodeCloneMap = new HashMap( project.nodes.size()); @@ -78,20 +78,20 @@ } public Project(String spaceId, String id, String title, String description, - String uri, Date created, int revCounter) { + String uri, DateTime created, int revCounter) { super(id, title, description, uri, null); this.revCounter = revCounter; this.spaceId = spaceId; this.created = created; if (this.created == null) { - this.created = new Date(); + this.created = new DateTime(); } - this.setUpdated(new Date()); + this.setUpdated(new DateTime()); } @Autowired(required = true) public Project(String spaceId, String id, String title, String description, - String uri, Date created) { + String uri, DateTime created) { this(spaceId, id, title, description, uri, created, 1); } @@ -116,11 +116,11 @@ } @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT") - public Date getCreated() { + public DateTime getCreated() { return created; } - public void setCreated(Date date) { + public void setCreated(DateTime date) { this.created = date; } @@ -136,7 +136,7 @@ key.append('|'); key.append(this.getSpaceId()); key.append('|'); - key.append(this.getCreated().getTime()); + key.append(this.getCreated().getMillis()); key.append('|'); key.append(editMode.toString()); return key.toString(); @@ -186,11 +186,11 @@ } @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT") - public Date getUpdated() { + public DateTime getUpdated() { return updated; } - public void setUpdated(Date updated) { + public void setUpdated(DateTime updated) { this.updated = updated; } @@ -256,7 +256,7 @@ @Override protected String getRawKeyPart() { - return Long.toString(this.getCreated().getTime()); + return Long.toString(this.getCreated().getMillis()); } } diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/models/ProjectRevision.java --- a/server/src/main/java/org/iri_research/renkan/models/ProjectRevision.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/models/ProjectRevision.java Fri Nov 15 09:34:41 2013 +0100 @@ -5,6 +5,7 @@ import java.util.List; import org.bson.types.ObjectId; +import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.mongodb.core.mapping.DBRef; @@ -25,7 +26,7 @@ private Project project; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT") - private Date created; + private DateTime created; // Nodes private List nodes = new ArrayList(); @@ -49,7 +50,7 @@ this.project = project; this.revision = revision; if (created == null) { - this.created = new Date(System.currentTimeMillis()); + this.created = new DateTime(System.currentTimeMillis()); } } @@ -70,13 +71,13 @@ } @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT") - public Date getCreated() { + public DateTime getCreated() { return created; } @Override protected String getRawKeyPart() { - return Long.toString(this.getCreated().getTime()); + return Long.toString(this.getCreated().getMillis()); } } diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/models/ProjectSync.java --- a/server/src/main/java/org/iri_research/renkan/models/ProjectSync.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/models/ProjectSync.java Fri Nov 15 09:34:41 2013 +0100 @@ -1,8 +1,7 @@ package org.iri_research.renkan.models; -import java.util.Date; - import org.bson.types.ObjectId; +import org.joda.time.DateTime; import org.springframework.data.mongodb.core.mapping.DBRef; import org.springframework.data.mongodb.core.mapping.Document; @@ -21,12 +20,12 @@ private int revision; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT") - private Date created; + private DateTime created; private String user; public ProjectSync(ObjectId id, String data, Project project, int revision, - Date created, String user) { + DateTime created, String user) { this.id = id; this.data = data; this.project = project; @@ -34,7 +33,7 @@ this.created = created; this.user = user; if (this.created == null) { - this.created = new Date(System.currentTimeMillis()); + this.created = new DateTime(System.currentTimeMillis()); } } diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/models/Space.java --- a/server/src/main/java/org/iri_research/renkan/models/Space.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/models/Space.java Fri Nov 15 09:34:41 2013 +0100 @@ -1,7 +1,6 @@ package org.iri_research.renkan.models; -import java.util.Date; - +import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @@ -15,7 +14,7 @@ @Autowired public Space(String id, String title, String description, String binConfig, String uri, String color, String createdBy, String image, - Date created) { + DateTime created) { super(id, title, description, uri, color); this.binConfig = binConfig; @@ -23,7 +22,7 @@ this.setImage(image); this.created = created; if (this.created == null) { - this.created = new Date(); + this.created = new DateTime(); } } @@ -40,7 +39,7 @@ private String image; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT") - private Date created; + private DateTime created; public String getImage() { return image; @@ -52,11 +51,11 @@ } @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT") - public Date getCreated() { + public DateTime getCreated() { return created; } - public void setCreated(Date date) { + public void setCreated(DateTime date) { this.created = date; } @@ -77,7 +76,7 @@ @Override protected String getRawKeyPart() { - return Long.toString(this.getCreated().getTime()); + return Long.toString(this.getCreated().getMillis()); } } \ No newline at end of file diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/models/User.java --- a/server/src/main/java/org/iri_research/renkan/models/User.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/models/User.java Fri Nov 15 09:34:41 2013 +0100 @@ -2,10 +2,10 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.Date; import java.util.List; import org.iri_research.renkan.Constants; +import org.joda.time.DateTime; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; import org.springframework.security.core.GrantedAuthority; @@ -24,12 +24,12 @@ private String avatar; @Field("credentials_expiration_date") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT") - private Date credentialExpirationDate; + private DateTime credentialExpirationDate; private String email; private boolean enabled; @Field("expiration_date") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT") - private Date expirationDate; + private DateTime expirationDate; private boolean locked; private String password; @Field("authorities") @@ -66,7 +66,7 @@ return this.color; } - public Date getCredentialExpirationDate() { + public DateTime getCredentialExpirationDate() { return credentialExpirationDate; } @@ -74,7 +74,7 @@ return email; } - public Date getExpirationDate() { + public DateTime getExpirationDate() { return expirationDate; } @@ -102,7 +102,7 @@ @Override public boolean isAccountNonExpired() { return this.expirationDate == null - || this.expirationDate.after(new Date()); + || this.expirationDate.isAfterNow(); } @Override @@ -113,7 +113,7 @@ @Override public boolean isCredentialsNonExpired() { return this.credentialExpirationDate == null - || this.credentialExpirationDate.after(new Date()); + || this.credentialExpirationDate.isAfterNow(); } @Override @@ -129,7 +129,7 @@ this.avatar = avatar; } - public void setCredentialExpirationDate(Date credentialExpirationDate) { + public void setCredentialExpirationDate(DateTime credentialExpirationDate) { this.credentialExpirationDate = credentialExpirationDate; } @@ -141,7 +141,7 @@ this.enabled = enabled; } - public void setExpirationDate(Date expirationDate) { + public void setExpirationDate(DateTime expirationDate) { this.expirationDate = expirationDate; } diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/repositories/ProjectSyncsRepositoryImpl.java --- a/server/src/main/java/org/iri_research/renkan/repositories/ProjectSyncsRepositoryImpl.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/repositories/ProjectSyncsRepositoryImpl.java Fri Nov 15 09:34:41 2013 +0100 @@ -1,10 +1,9 @@ package org.iri_research.renkan.repositories; -import java.util.Date; - import org.iri_research.renkan.RenkanException; import org.iri_research.renkan.models.Project; import org.iri_research.renkan.models.ProjectSync; +import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -24,7 +23,7 @@ ProjectSync ps = new ProjectSync(null, data, project, this.projectRepository.getRevCounter(project.getId()), - new Date(System.currentTimeMillis()), user); + new DateTime(), user); return ps; } diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/rest/ObjectMapperProvider.java --- a/server/src/main/java/org/iri_research/renkan/rest/ObjectMapperProvider.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/rest/ObjectMapperProvider.java Fri Nov 15 09:34:41 2013 +0100 @@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.joda.JodaModule; @Component @Provider @@ -17,6 +18,7 @@ ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + objectMapper.registerModule(new JodaModule()); return objectMapper; } diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/rest/ProjectsResource.java --- a/server/src/main/java/org/iri_research/renkan/rest/ProjectsResource.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/rest/ProjectsResource.java Fri Nov 15 09:34:41 2013 +0100 @@ -1,7 +1,6 @@ package org.iri_research.renkan.rest; import java.util.Arrays; -import java.util.Date; import java.util.List; import javax.inject.Singleton; @@ -11,6 +10,7 @@ import org.iri_research.renkan.models.Project; import org.iri_research.renkan.repositories.IRenkanRepository; import org.iri_research.renkan.repositories.ProjectsRepository; +import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -40,9 +40,9 @@ @Override protected void prepareObject(Project obj) { if (obj.getCreated() == null) { - obj.setCreated(new Date()); + obj.setCreated(new DateTime()); } - obj.setUpdated(new Date()); + obj.setUpdated(new DateTime()); } @Override diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/rest/RenkanResource.java --- a/server/src/main/java/org/iri_research/renkan/rest/RenkanResource.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/rest/RenkanResource.java Fri Nov 15 09:34:41 2013 +0100 @@ -28,6 +28,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.joda.JodaModule; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; import com.mongodb.DBCursor; @@ -205,6 +206,7 @@ } ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + mapper.registerModule(new JodaModule()); return mapper.writeValueAsString(res); } diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/rest/RestApplication.java --- a/server/src/main/java/org/iri_research/renkan/rest/RestApplication.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/rest/RestApplication.java Fri Nov 15 09:34:41 2013 +0100 @@ -4,10 +4,25 @@ import org.glassfish.jersey.server.spring.SpringLifecycleListener; import org.glassfish.jersey.server.spring.scope.RequestContextFilter; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.joda.JodaModule; +import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; + public class RestApplication extends ResourceConfig { public RestApplication() { + this.packages("org.iri_research.renkan.rest"); this.register(SpringLifecycleListener.class); this.register(RequestContextFilter.class); + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, + false); + objectMapper.registerModule(new JodaModule()); + JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider(objectMapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS); + + this.register(provider); + } } diff -r e65766f81b15 -r b7000ff4989b server/src/main/java/org/iri_research/renkan/rest/SpacesResource.java --- a/server/src/main/java/org/iri_research/renkan/rest/SpacesResource.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/rest/SpacesResource.java Fri Nov 15 09:34:41 2013 +0100 @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Date; import java.util.List; import javax.inject.Singleton; @@ -12,6 +11,7 @@ import org.iri_research.renkan.models.Space; import org.iri_research.renkan.repositories.IRenkanRepository; import org.iri_research.renkan.repositories.SpacesRepository; +import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -44,7 +44,7 @@ @Override protected void prepareObject(Space obj) { if (obj.getCreated() == null) { - obj.setCreated(new Date()); + obj.setCreated(new DateTime()); } } diff -r e65766f81b15 -r b7000ff4989b server/src/main/webapp/WEB-INF/applicationContext.xml --- a/server/src/main/webapp/WEB-INF/applicationContext.xml Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/main/webapp/WEB-INF/applicationContext.xml Fri Nov 15 09:34:41 2013 +0100 @@ -90,7 +90,7 @@ - + diff -r e65766f81b15 -r b7000ff4989b server/src/test/java/org/iri_research/renkan/test/controller/AdminControllerTest.java --- a/server/src/test/java/org/iri_research/renkan/test/controller/AdminControllerTest.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/test/java/org/iri_research/renkan/test/controller/AdminControllerTest.java Fri Nov 15 09:34:41 2013 +0100 @@ -1,27 +1,24 @@ package org.iri_research.renkan.test.controller; -import java.security.SecureRandom; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TimeZone; import java.util.UUID; -import org.apache.commons.codec.binary.Hex; import org.iri_research.renkan.models.Project; import org.iri_research.renkan.models.Space; import org.iri_research.renkan.repositories.ProjectsRepository; import org.iri_research.renkan.repositories.SpacesRepository; +import org.joda.time.DateTime; 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.http.HttpStatus; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; @@ -31,9 +28,7 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.util.NestedServletException; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @@ -63,12 +58,13 @@ public void setup() { logger.debug("Setup"); + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); spacesRepository.deleteAll(); projectsRepository.deleteAll(); ArrayList pl = new ArrayList(); for (int i = 0; i < SPACE_NB; i++) { - Date creationDate = new Date(); + DateTime creationDate = new DateTime(); String uuid = UUID.randomUUID().toString(); spacesUuids.add(uuid); Space testSpace = new Space(uuid, "test " + i, "Test space " + 1, @@ -115,452 +111,4 @@ } - @Test - public void testSpacePostUpdate() throws Exception { - - MockHttpServletRequestBuilder post = MockMvcRequestBuilders - .post("/admin/spaces/save"); - post = post.param("id", this.spacesUuids.get(0)); - post = post.param("title", "New title"); - 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("binConfig", "{}"); - - this.mvc.perform(post) - .andExpect(MockMvcResultMatchers.status().isSeeOther()) - .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces")); - - Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0)); - - Assert.assertNotNull("Should find space", sp); - Assert.assertEquals("Title equals", "New title", sp.getTitle()); - Assert.assertEquals("Description equals", "New description", - sp.getDescription()); - Assert.assertEquals("Uri equals", - "http://ldt.iri.centrepompidou.fr/new/uri", sp.getUri()); - Assert.assertEquals("Color equals", "#ffffff", sp.getColor()); - Assert.assertEquals("BinConfig equals", "{}", sp.getBinConfig()); - - } - - @Test - public void testSpacePostCreate() throws Exception { - - MockHttpServletRequestBuilder post = MockMvcRequestBuilders - .post("/admin/spaces/save"); - post = post.param("title", "New title"); - 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("binConfig", "{}"); - - this.mvc.perform(post) - .andExpect(MockMvcResultMatchers.status().isSeeOther()) - .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces")); - - Assert.assertEquals("Must have one more space", SPACE_NB + 1, - this.spacesRepository.count()); - - for (Space sp : this.spacesRepository.findAll()) { - if (this.spacesList.containsKey(sp.getId())) { - continue; - } else { - Assert.assertNotNull("Should find space", sp); - Assert.assertEquals("Title equals", "New title", sp.getTitle()); - Assert.assertEquals("Description equals", "New description", - sp.getDescription()); - Assert.assertEquals("Uri equals", - "http://ldt.iri.centrepompidou.fr/new/uri", sp.getUri()); - Assert.assertEquals("Color equals", "#ffffff", sp.getColor()); - Assert.assertEquals("BinConfig equals", "{}", sp.getBinConfig()); - Assert.assertTrue( - "id sould match uuid regex", - sp.getId() - .matches( - "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}")); - Assert.assertNotNull("Date created should be not null", - sp.getCreated()); - } - } - } - - @Test - public void testSpacePostUpdateEmptyTitle() throws Exception { - - MockHttpServletRequestBuilder post = MockMvcRequestBuilders - .post("/admin/spaces/save"); - post = post.param("id", this.spacesUuids.get(0)); - post = post.param("title", ""); - 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("binConfig", "{}"); - - this.mvc.perform(post) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) - .andExpect(MockMvcResultMatchers.model().hasErrors()) - .andExpect(MockMvcResultMatchers.model().errorCount(1)) - .andExpect( - MockMvcResultMatchers.model().attributeHasErrors( - "space")) - .andExpect( - MockMvcResultMatchers.model().attributeHasFieldErrors( - "space", "title")); - - Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0)); - - Assert.assertNotNull("Should find space", sp); - Assert.assertEquals("Title equals", "test 0", sp.getTitle()); - - } - - @Test - public void testSpacePostCreateEmptyTitle() throws Exception { - - MockHttpServletRequestBuilder post = MockMvcRequestBuilders - .post("/admin/spaces/save"); - post = post.param("title", ""); - 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("binConfig", "{}"); - - this.mvc.perform(post) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) - .andExpect(MockMvcResultMatchers.model().hasErrors()) - .andExpect(MockMvcResultMatchers.model().errorCount(1)) - .andExpect( - MockMvcResultMatchers.model().attributeHasErrors( - "space")) - .andExpect( - MockMvcResultMatchers.model().attributeHasFieldErrors( - "space", "title")); - - Assert.assertEquals("Must not have one more space", SPACE_NB, - this.spacesRepository.count()); - - } - - @Test - public void testSpacePostUpdateBadJson() throws Exception { - - MockHttpServletRequestBuilder post = MockMvcRequestBuilders - .post("/admin/spaces/save"); - post = post.param("id", this.spacesUuids.get(0)); - post = post.param("title", "New Title"); - 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("binConfig", "{"); - - this.mvc.perform(post) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) - .andExpect(MockMvcResultMatchers.model().hasErrors()) - .andExpect(MockMvcResultMatchers.model().errorCount(1)) - .andExpect( - MockMvcResultMatchers.model().attributeHasErrors( - "space")) - .andExpect( - MockMvcResultMatchers.model().attributeHasFieldErrors( - "space", "binConfig")); - - Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0)); - - Assert.assertNotNull("Should find space", sp); - Assert.assertEquals("Bin config equals", "{}", sp.getBinConfig()); - - } - - @Test - public void testSpacePostCreateBadJson() throws Exception { - - MockHttpServletRequestBuilder post = MockMvcRequestBuilders - .post("/admin/spaces/save"); - post = post.param("title", "New Title"); - 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("binConfig", "}"); - - this.mvc.perform(post) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) - .andExpect(MockMvcResultMatchers.model().hasErrors()) - .andExpect(MockMvcResultMatchers.model().errorCount(1)) - .andExpect( - MockMvcResultMatchers.model().attributeHasErrors( - "space")) - .andExpect( - MockMvcResultMatchers.model().attributeHasFieldErrors( - "space", "binConfig")); - - Assert.assertEquals("Must not have one more space", SPACE_NB, - this.spacesRepository.count()); - - } - - @Test - public void testSpacePostUpdateAllErrors() throws Exception { - - MockHttpServletRequestBuilder post = MockMvcRequestBuilders - .post("/admin/spaces/save"); - post = post.param("id", this.spacesUuids.get(0)); - post = post.param("title", ""); - 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("binConfig", "{"); - - this.mvc.perform(post) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) - .andExpect(MockMvcResultMatchers.model().hasErrors()) - .andExpect(MockMvcResultMatchers.model().errorCount(2)) - .andExpect( - MockMvcResultMatchers.model().attributeHasErrors( - "space")) - .andExpect( - MockMvcResultMatchers.model().attributeHasFieldErrors( - "space", "title")) - .andExpect( - MockMvcResultMatchers.model().attributeHasFieldErrors( - "space", "binConfig")); - - Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0)); - - Assert.assertNotNull("Should find space", sp); - Assert.assertEquals("Bin config equals", "{}", sp.getBinConfig()); - Assert.assertEquals("title equals", "test 0", sp.getTitle()); - - } - - @Test - public void testSpacePostCreateAllErrors() throws Exception { - - MockHttpServletRequestBuilder post = MockMvcRequestBuilders - .post("/admin/spaces/save"); - post = post.param("title", ""); - 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("binConfig", "}"); - - this.mvc.perform(post) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) - .andExpect(MockMvcResultMatchers.model().hasErrors()) - .andExpect(MockMvcResultMatchers.model().errorCount(2)) - .andExpect( - MockMvcResultMatchers.model().attributeHasErrors( - "space")) - .andExpect( - MockMvcResultMatchers.model().attributeHasFieldErrors( - "space", "title")) - .andExpect( - MockMvcResultMatchers.model().attributeHasFieldErrors( - "space", "binConfig")); - - Assert.assertEquals("Must not have one more space", SPACE_NB, - this.spacesRepository.count()); - - } - - @Test - public void testDeleteSpace() throws Exception { - - MockHttpServletRequestBuilder get = MockMvcRequestBuilders - .get("/admin/spaces/delete/" - + this.spacesUuids.get(SPACE_NB - 1)); - - MvcResult res = this.mvc - .perform(get) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect( - MockMvcResultMatchers.view().name( - "admin/spaceDeleteConfirm")) - .andExpect( - MockMvcResultMatchers.model().attributeExists( - "spaceObj", "key", "salt")).andReturn(); - - Map model = res.getModelAndView().getModel(); - - Space space = (Space) model.get("spaceObj"); - Assert.assertNotNull("Space is not null", space); - Assert.assertEquals("Must be first space id", - this.spacesUuids.get(SPACE_NB - 1), space.getId()); - - String key = (String) model.get("key"); - Assert.assertNotNull("key is not null", key); - - String salt = (String) model.get("salt"); - Assert.assertNotNull("salt is not null", salt); - - Assert.assertTrue("Key must be checked", space.checkKey(key, salt)); - - } - - @Test - public void testDeleteFakeSpace() throws Exception { - - MockHttpServletRequestBuilder get = MockMvcRequestBuilders - .get("/admin/spaces/delete/" + UUID.randomUUID().toString()); - - try { - this.mvc.perform(get).andExpect( - MockMvcResultMatchers.status().isNotFound()); - } catch (NestedServletException e) { - Assert.assertNotNull("Nested exception must not be null", - e.getCause()); - Assert.assertEquals( - "Inner exception must be a HttpClientErrorException", - HttpClientErrorException.class, e.getCause().getClass()); - Assert.assertEquals("Exception error status must be not found", - HttpStatus.NOT_FOUND, - ((HttpClientErrorException) e.getCause()).getStatusCode()); - } - - } - - @Test - public void testDeleteSpaceProject() throws Exception { - - MockHttpServletRequestBuilder get = MockMvcRequestBuilders - .get("/admin/spaces/delete/" + this.spacesUuids.get(0)); - - try { - this.mvc.perform(get).andExpect( - MockMvcResultMatchers.status().isBadRequest()); - } catch (NestedServletException e) { - Assert.assertNotNull("Nested exception must not be null", - e.getCause()); - Assert.assertEquals( - "Inner exception must be a HttpClientErrorException", - HttpClientErrorException.class, e.getCause().getClass()); - Assert.assertEquals("Exception error status must be not found", - HttpStatus.BAD_REQUEST, - ((HttpClientErrorException) e.getCause()).getStatusCode()); - } - - } - - @Test - public void testDoDeleteSpaceNoKey() throws Exception { - MockHttpServletRequestBuilder post = MockMvcRequestBuilders - .post("/admin/spaces/delete/" - + this.spacesUuids.get(SPACE_NB - 1)); - - try { - this.mvc.perform(post).andExpect( - MockMvcResultMatchers.status().isBadRequest()); - } catch (NestedServletException e) { - Assert.assertNotNull("Nested exception must not be null", - e.getCause()); - Assert.assertEquals( - "Inner exception must be a HttpClientErrorException", - HttpClientErrorException.class, e.getCause().getClass()); - Assert.assertEquals("Exception error status must be not found", - HttpStatus.BAD_REQUEST, - ((HttpClientErrorException) e.getCause()).getStatusCode()); - } - - Assert.assertEquals("Must have same nb of space", SPACE_NB, - this.spacesRepository.count()); - - } - - @Test - public void testDoDeleteSpace() throws Exception { - - Space space = this.spacesList.get(this.spacesUuids.get(SPACE_NB - 1)); - - SecureRandom rand = SecureRandom.getInstance("SHA1PRNG"); - rand.setSeed(System.currentTimeMillis()); - byte[] rawSalt = new byte[50]; - rand.nextBytes(rawSalt); - String salt = Hex.encodeHexString(rawSalt); - String key = space.getKey(salt); - - MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String - .format("/admin/spaces/delete/%s?key=%s&salt=%s", - this.spacesUuids.get(SPACE_NB - 1), key, salt)); - - this.mvc.perform(post) - .andExpect(MockMvcResultMatchers.status().isSeeOther()) - .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces")); - - Assert.assertEquals("Must have one less space", SPACE_NB - 1, - this.spacesRepository.count()); - - space = this.spacesRepository.findOne(this.spacesUuids - .get(SPACE_NB - 1)); - - Assert.assertNull("Space " + this.spacesUuids.get(SPACE_NB - 1) - + " deleted", space); - - } - - @Test - public void testDoDeleteSpaceFake() throws Exception { - - Space space = this.spacesList.get(this.spacesUuids.get(SPACE_NB - 1)); - - SecureRandom rand = SecureRandom.getInstance("SHA1PRNG"); - rand.setSeed(System.currentTimeMillis()); - byte[] rawSalt = new byte[50]; - rand.nextBytes(rawSalt); - String salt = Hex.encodeHexString(rawSalt); - String key = space.getKey(salt); - - MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String - .format("/admin/spaces/delete/%s?key=%s&salt=%s", - UUID.randomUUID(), key, salt)); - - this.mvc.perform(post) - .andExpect(MockMvcResultMatchers.status().isSeeOther()) - .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces")); - - Assert.assertEquals("Must have the same nb of space", SPACE_NB, - this.spacesRepository.count()); - - } - - @Test - public void testDoDeleteSpaceProject() throws Exception { - - Space space = this.spacesList.get(this.spacesUuids.get(0)); - - SecureRandom rand = SecureRandom.getInstance("SHA1PRNG"); - rand.setSeed(System.currentTimeMillis()); - byte[] rawSalt = new byte[50]; - rand.nextBytes(rawSalt); - String salt = Hex.encodeHexString(rawSalt); - String key = space.getKey(salt); - - MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String - .format("/admin/spaces/delete/%s?key=%s&salt=%s", - this.spacesUuids.get(0), key, salt)); - - try { - this.mvc.perform(post).andExpect( - MockMvcResultMatchers.status().isBadRequest()); - } catch (NestedServletException e) { - Assert.assertNotNull("Nested exception must not be null", - e.getCause()); - Assert.assertEquals( - "Inner exception must be a HttpClientErrorException", - HttpClientErrorException.class, e.getCause().getClass()); - Assert.assertEquals("Exception error status must be not found", - HttpStatus.BAD_REQUEST, - ((HttpClientErrorException) e.getCause()).getStatusCode()); - } - - Assert.assertEquals("Must have the same nb of space", SPACE_NB, - this.spacesRepository.count()); - - } - } diff -r e65766f81b15 -r b7000ff4989b server/src/test/java/org/iri_research/renkan/test/controller/SpacesAdminControllerTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/test/java/org/iri_research/renkan/test/controller/SpacesAdminControllerTest.java Fri Nov 15 09:34:41 2013 +0100 @@ -0,0 +1,557 @@ +package org.iri_research.renkan.test.controller; + +import java.security.SecureRandom; +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.apache.commons.codec.binary.Hex; +import org.iri_research.renkan.models.Project; +import org.iri_research.renkan.models.Space; +import org.iri_research.renkan.repositories.ProjectsRepository; +import org.iri_research.renkan.repositories.SpacesRepository; +import org.joda.time.DateTime; +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.http.HttpStatus; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.util.NestedServletException; + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(locations = { "controller-context.xml", + "file:src/main/webapp/WEB-INF/spring-servlet.xml" }) +public class SpacesAdminControllerTest { + + private final static int SPACE_NB = 3; + + private Logger logger = LoggerFactory.getLogger(SpacesAdminControllerTest.class); + + @Autowired + private SpacesRepository spacesRepository; + @Autowired + private ProjectsRepository projectsRepository; + + private Map spacesList = new HashMap(SPACE_NB); + private List spacesUuids = new ArrayList<>(SPACE_NB); + + private ArrayList testProjects = new ArrayList(); + + @Autowired + private WebApplicationContext context; + private MockMvc mvc; + + @Before + public void setup() { + + logger.debug("Setup"); + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + spacesRepository.deleteAll(); + projectsRepository.deleteAll(); + + ArrayList pl = new ArrayList(); + for (int i = 0; i < SPACE_NB; i++) { + DateTime creationDate = new DateTime(); + String uuid = UUID.randomUUID().toString(); + spacesUuids.add(uuid); + Space testSpace = new Space(uuid, "test " + i, "Test space " + 1, + "{}", "http://ldt.iri.centrepompidou.fr", "#ababab", + "test_user", "http://ldt.iri.centrepompidou.fr", + creationDate); + testSpace = spacesRepository.save(testSpace); + this.spacesList.put(uuid, testSpace); + for (int j = 0; j < SPACE_NB - 1 - i; j++) { + pl.add(new Project(testSpace.getId(), UUID.randomUUID() + .toString(), "test" + ((SPACE_NB - 1) * i + j + 1), + "desc" + ((SPACE_NB - 1) * i + j + 1), + "http://localhost:8080/rest/projects/id" + + ((SPACE_NB - 1) * i + j + 1), creationDate)); + } + try { + Thread.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + for (Project p : projectsRepository.save(pl)) { + this.testProjects.add(p); + } + + this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build(); + } + + @After + public void teardown() { + spacesRepository.deleteAll(); + projectsRepository.deleteAll(); + } + + @Test + public void testSpacePostUpdate() throws Exception { + + MockHttpServletRequestBuilder post = MockMvcRequestBuilders + .post("/admin/spaces/save"); + post = post.param("id", this.spacesUuids.get(0)); + post = post.param("title", "New title"); + 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("binConfig", "{}"); + + this.mvc.perform(post) + .andExpect(MockMvcResultMatchers.status().isSeeOther()) + .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces")); + + Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0)); + + Assert.assertNotNull("Should find space", sp); + Assert.assertEquals("Title equals", "New title", sp.getTitle()); + Assert.assertEquals("Description equals", "New description", + sp.getDescription()); + Assert.assertEquals("Uri equals", + "http://ldt.iri.centrepompidou.fr/new/uri", sp.getUri()); + Assert.assertEquals("Color equals", "#ffffff", sp.getColor()); + Assert.assertEquals("BinConfig equals", "{}", sp.getBinConfig()); + + } + + @Test + public void testSpacePostCreate() throws Exception { + + MockHttpServletRequestBuilder post = MockMvcRequestBuilders + .post("/admin/spaces/save"); + post = post.param("title", "New title"); + 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("binConfig", "{}"); + + this.mvc.perform(post) + .andExpect(MockMvcResultMatchers.status().isSeeOther()) + .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces")); + + Assert.assertEquals("Must have one more space", SPACE_NB + 1, + this.spacesRepository.count()); + + for (Space sp : this.spacesRepository.findAll()) { + if (this.spacesList.containsKey(sp.getId())) { + continue; + } else { + Assert.assertNotNull("Should find space", sp); + Assert.assertEquals("Title equals", "New title", sp.getTitle()); + Assert.assertEquals("Description equals", "New description", + sp.getDescription()); + Assert.assertEquals("Uri equals", + "http://ldt.iri.centrepompidou.fr/new/uri", sp.getUri()); + Assert.assertEquals("Color equals", "#ffffff", sp.getColor()); + Assert.assertEquals("BinConfig equals", "{}", sp.getBinConfig()); + Assert.assertTrue( + "id sould match uuid regex", + sp.getId() + .matches( + "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}")); + Assert.assertNotNull("Date created should be not null", + sp.getCreated()); + } + } + } + + @Test + public void testSpacePostUpdateEmptyTitle() throws Exception { + + MockHttpServletRequestBuilder post = MockMvcRequestBuilders + .post("/admin/spaces/save"); + post = post.param("id", this.spacesUuids.get(0)); + post = post.param("title", ""); + 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("binConfig", "{}"); + + this.mvc.perform(post) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) + .andExpect(MockMvcResultMatchers.model().hasErrors()) + .andExpect(MockMvcResultMatchers.model().errorCount(1)) + .andExpect( + MockMvcResultMatchers.model().attributeHasErrors( + "space")) + .andExpect( + MockMvcResultMatchers.model().attributeHasFieldErrors( + "space", "title")); + + Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0)); + + Assert.assertNotNull("Should find space", sp); + Assert.assertEquals("Title equals", "test 0", sp.getTitle()); + + } + + @Test + public void testSpacePostCreateEmptyTitle() throws Exception { + + MockHttpServletRequestBuilder post = MockMvcRequestBuilders + .post("/admin/spaces/save"); + post = post.param("title", ""); + 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("binConfig", "{}"); + + this.mvc.perform(post) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) + .andExpect(MockMvcResultMatchers.model().hasErrors()) + .andExpect(MockMvcResultMatchers.model().errorCount(1)) + .andExpect( + MockMvcResultMatchers.model().attributeHasErrors( + "space")) + .andExpect( + MockMvcResultMatchers.model().attributeHasFieldErrors( + "space", "title")); + + Assert.assertEquals("Must not have one more space", SPACE_NB, + this.spacesRepository.count()); + + } + + @Test + public void testSpacePostUpdateBadJson() throws Exception { + + MockHttpServletRequestBuilder post = MockMvcRequestBuilders + .post("/admin/spaces/save"); + post = post.param("id", this.spacesUuids.get(0)); + post = post.param("title", "New Title"); + 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("binConfig", "{"); + + this.mvc.perform(post) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) + .andExpect(MockMvcResultMatchers.model().hasErrors()) + .andExpect(MockMvcResultMatchers.model().errorCount(1)) + .andExpect( + MockMvcResultMatchers.model().attributeHasErrors( + "space")) + .andExpect( + MockMvcResultMatchers.model().attributeHasFieldErrors( + "space", "binConfig")); + + Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0)); + + Assert.assertNotNull("Should find space", sp); + Assert.assertEquals("Bin config equals", "{}", sp.getBinConfig()); + + } + + @Test + public void testSpacePostCreateBadJson() throws Exception { + + MockHttpServletRequestBuilder post = MockMvcRequestBuilders + .post("/admin/spaces/save"); + post = post.param("title", "New Title"); + 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("binConfig", "}"); + + this.mvc.perform(post) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) + .andExpect(MockMvcResultMatchers.model().hasErrors()) + .andExpect(MockMvcResultMatchers.model().errorCount(1)) + .andExpect( + MockMvcResultMatchers.model().attributeHasErrors( + "space")) + .andExpect( + MockMvcResultMatchers.model().attributeHasFieldErrors( + "space", "binConfig")); + + Assert.assertEquals("Must not have one more space", SPACE_NB, + this.spacesRepository.count()); + + } + + @Test + public void testSpacePostUpdateAllErrors() throws Exception { + + MockHttpServletRequestBuilder post = MockMvcRequestBuilders + .post("/admin/spaces/save"); + post = post.param("id", this.spacesUuids.get(0)); + post = post.param("title", ""); + 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("binConfig", "{"); + + this.mvc.perform(post) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) + .andExpect(MockMvcResultMatchers.model().hasErrors()) + .andExpect(MockMvcResultMatchers.model().errorCount(2)) + .andExpect( + MockMvcResultMatchers.model().attributeHasErrors( + "space")) + .andExpect( + MockMvcResultMatchers.model().attributeHasFieldErrors( + "space", "title")) + .andExpect( + MockMvcResultMatchers.model().attributeHasFieldErrors( + "space", "binConfig")); + + Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0)); + + Assert.assertNotNull("Should find space", sp); + Assert.assertEquals("Bin config equals", "{}", sp.getBinConfig()); + Assert.assertEquals("title equals", "test 0", sp.getTitle()); + + } + + @Test + public void testSpacePostCreateAllErrors() throws Exception { + + MockHttpServletRequestBuilder post = MockMvcRequestBuilders + .post("/admin/spaces/save"); + post = post.param("title", ""); + 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("binConfig", "}"); + + this.mvc.perform(post) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) + .andExpect(MockMvcResultMatchers.model().hasErrors()) + .andExpect(MockMvcResultMatchers.model().errorCount(2)) + .andExpect( + MockMvcResultMatchers.model().attributeHasErrors( + "space")) + .andExpect( + MockMvcResultMatchers.model().attributeHasFieldErrors( + "space", "title")) + .andExpect( + MockMvcResultMatchers.model().attributeHasFieldErrors( + "space", "binConfig")); + + Assert.assertEquals("Must not have one more space", SPACE_NB, + this.spacesRepository.count()); + + } + + @Test + public void testDeleteSpace() throws Exception { + + MockHttpServletRequestBuilder get = MockMvcRequestBuilders + .get("/admin/spaces/delete/" + + this.spacesUuids.get(SPACE_NB - 1)); + + MvcResult res = this.mvc + .perform(get) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect( + MockMvcResultMatchers.view().name( + "admin/spaceDeleteConfirm")) + .andExpect( + MockMvcResultMatchers.model().attributeExists( + "spaceObj", "key", "salt")).andReturn(); + + Map model = res.getModelAndView().getModel(); + + Space space = (Space) model.get("spaceObj"); + Assert.assertNotNull("Space is not null", space); + Assert.assertEquals("Must be first space id", + this.spacesUuids.get(SPACE_NB - 1), space.getId()); + + String key = (String) model.get("key"); + Assert.assertNotNull("key is not null", key); + + String salt = (String) model.get("salt"); + Assert.assertNotNull("salt is not null", salt); + + Assert.assertTrue("Key must be checked", space.checkKey(key, salt)); + + } + + @Test + public void testDeleteFakeSpace() throws Exception { + + MockHttpServletRequestBuilder get = MockMvcRequestBuilders + .get("/admin/spaces/delete/" + UUID.randomUUID().toString()); + + try { + this.mvc.perform(get).andExpect( + MockMvcResultMatchers.status().isNotFound()); + } catch (NestedServletException e) { + Assert.assertNotNull("Nested exception must not be null", + e.getCause()); + Assert.assertEquals( + "Inner exception must be a HttpClientErrorException", + HttpClientErrorException.class, e.getCause().getClass()); + Assert.assertEquals("Exception error status must be not found", + HttpStatus.NOT_FOUND, + ((HttpClientErrorException) e.getCause()).getStatusCode()); + } + + } + + @Test + public void testDeleteSpaceProject() throws Exception { + + MockHttpServletRequestBuilder get = MockMvcRequestBuilders + .get("/admin/spaces/delete/" + this.spacesUuids.get(0)); + + try { + this.mvc.perform(get).andExpect( + MockMvcResultMatchers.status().isBadRequest()); + } catch (NestedServletException e) { + Assert.assertNotNull("Nested exception must not be null", + e.getCause()); + Assert.assertEquals( + "Inner exception must be a HttpClientErrorException", + HttpClientErrorException.class, e.getCause().getClass()); + Assert.assertEquals("Exception error status must be not found", + HttpStatus.BAD_REQUEST, + ((HttpClientErrorException) e.getCause()).getStatusCode()); + } + + } + + @Test + public void testDoDeleteSpaceNoKey() throws Exception { + MockHttpServletRequestBuilder post = MockMvcRequestBuilders + .post("/admin/spaces/delete/" + + this.spacesUuids.get(SPACE_NB - 1)); + + try { + this.mvc.perform(post).andExpect( + MockMvcResultMatchers.status().isBadRequest()); + } catch (NestedServletException e) { + Assert.assertNotNull("Nested exception must not be null", + e.getCause()); + Assert.assertEquals( + "Inner exception must be a HttpClientErrorException", + HttpClientErrorException.class, e.getCause().getClass()); + Assert.assertEquals("Exception error status must be not found", + HttpStatus.BAD_REQUEST, + ((HttpClientErrorException) e.getCause()).getStatusCode()); + } + + Assert.assertEquals("Must have same nb of space", SPACE_NB, + this.spacesRepository.count()); + + } + + @Test + public void testDoDeleteSpace() throws Exception { + + Space space = this.spacesList.get(this.spacesUuids.get(SPACE_NB - 1)); + + SecureRandom rand = SecureRandom.getInstance("SHA1PRNG"); + rand.setSeed(System.currentTimeMillis()); + byte[] rawSalt = new byte[50]; + rand.nextBytes(rawSalt); + String salt = Hex.encodeHexString(rawSalt); + String key = space.getKey(salt); + + MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String + .format("/admin/spaces/delete/%s?key=%s&salt=%s", + this.spacesUuids.get(SPACE_NB - 1), key, salt)); + + this.mvc.perform(post) + .andExpect(MockMvcResultMatchers.status().isSeeOther()) + .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces")); + + Assert.assertEquals("Must have one less space", SPACE_NB - 1, + this.spacesRepository.count()); + + space = this.spacesRepository.findOne(this.spacesUuids + .get(SPACE_NB - 1)); + + Assert.assertNull("Space " + this.spacesUuids.get(SPACE_NB - 1) + + " deleted", space); + + } + + @Test + public void testDoDeleteSpaceFake() throws Exception { + + Space space = this.spacesList.get(this.spacesUuids.get(SPACE_NB - 1)); + + SecureRandom rand = SecureRandom.getInstance("SHA1PRNG"); + rand.setSeed(System.currentTimeMillis()); + byte[] rawSalt = new byte[50]; + rand.nextBytes(rawSalt); + String salt = Hex.encodeHexString(rawSalt); + String key = space.getKey(salt); + + MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String + .format("/admin/spaces/delete/%s?key=%s&salt=%s", + UUID.randomUUID(), key, salt)); + + this.mvc.perform(post) + .andExpect(MockMvcResultMatchers.status().isSeeOther()) + .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces")); + + Assert.assertEquals("Must have the same nb of space", SPACE_NB, + this.spacesRepository.count()); + + } + + @Test + public void testDoDeleteSpaceProject() throws Exception { + + Space space = this.spacesList.get(this.spacesUuids.get(0)); + + SecureRandom rand = SecureRandom.getInstance("SHA1PRNG"); + rand.setSeed(System.currentTimeMillis()); + byte[] rawSalt = new byte[50]; + rand.nextBytes(rawSalt); + String salt = Hex.encodeHexString(rawSalt); + String key = space.getKey(salt); + + MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String + .format("/admin/spaces/delete/%s?key=%s&salt=%s", + this.spacesUuids.get(0), key, salt)); + + try { + this.mvc.perform(post).andExpect( + MockMvcResultMatchers.status().isBadRequest()); + } catch (NestedServletException e) { + Assert.assertNotNull("Nested exception must not be null", + e.getCause()); + Assert.assertEquals( + "Inner exception must be a HttpClientErrorException", + HttpClientErrorException.class, e.getCause().getClass()); + Assert.assertEquals("Exception error status must be not found", + HttpStatus.BAD_REQUEST, + ((HttpClientErrorException) e.getCause()).getStatusCode()); + } + + Assert.assertEquals("Must have the same nb of space", SPACE_NB, + this.spacesRepository.count()); + + } + +} diff -r e65766f81b15 -r b7000ff4989b server/src/test/java/org/iri_research/renkan/test/controller/UsersAdminControllerTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/test/java/org/iri_research/renkan/test/controller/UsersAdminControllerTest.java Fri Nov 15 09:34:41 2013 +0100 @@ -0,0 +1,584 @@ +package org.iri_research.renkan.test.controller; + +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.Project; +import org.iri_research.renkan.models.Space; +import org.iri_research.renkan.models.User; +import org.iri_research.renkan.repositories.ProjectsRepository; +import org.iri_research.renkan.repositories.SpacesRepository; +import org.iri_research.renkan.repositories.UsersRepository; +import org.joda.time.DateTime; +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.security.crypto.password.PasswordEncoder; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(locations = { "controller-context.xml", + "file:src/main/webapp/WEB-INF/spring-servlet.xml" }) +public class UsersAdminControllerTest { + + private final static int SPACE_NB = 3; + private final static int USER_NB = 3; + + private Logger logger = LoggerFactory.getLogger(UsersAdminControllerTest.class); + + @Autowired + private SpacesRepository spacesRepository; + @Autowired + private ProjectsRepository projectsRepository; + @Autowired + private UsersRepository usersRepository; + + @Autowired + private PasswordEncoder renkanPasswordEncoder; + + private Map spacesList = new HashMap(SPACE_NB); + private List spacesUuids = new ArrayList<>(SPACE_NB); + + private ArrayList testProjects = new ArrayList(); + + private Map usersList = new HashMap(USER_NB); + private List usersUuids = new ArrayList<>(USER_NB); + + + @Autowired + private WebApplicationContext context; + private MockMvc mvc; + + @Before + public void setup() { + + logger.debug("Setup"); + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + spacesRepository.deleteAll(); + projectsRepository.deleteAll(); + usersRepository.deleteAll(); + + for(int i=0; i < USER_NB; i++) { + String uuid = UUID.randomUUID().toString(); + User user = new User(uuid, "user" + i, "User nb 1", "http://www.iri.centrepompidou.fr", "#ababab"); + user.setLocked(false); + user.setEnabled(true); + user.setAvatar("A pretty picture"); + user.setExpirationDate(new DateTime()); + user.setCredentialExpirationDate(new DateTime()); + user.setEmail(String.format("user%d@mail.com", i)); + user = usersRepository.save(user); + this.usersUuids.add(uuid); + this.usersList.put(uuid, user); + } + + ArrayList pl = new ArrayList(); + for (int i = 0; i < SPACE_NB; i++) { + DateTime creationDate = new DateTime(); + String uuid = UUID.randomUUID().toString(); + spacesUuids.add(uuid); + Space testSpace = new Space(uuid, "test " + i, "Test space " + 1, + "{}", "http://ldt.iri.centrepompidou.fr", "#ababab", + "test_user", "http://ldt.iri.centrepompidou.fr", + creationDate); + testSpace = spacesRepository.save(testSpace); + this.spacesList.put(uuid, testSpace); + for (int j = 0; j < SPACE_NB - 1 - i; j++) { + Project p = new Project(testSpace.getId(), UUID.randomUUID() + .toString(), "test" + ((SPACE_NB - 1) * i + j + 1), + "desc" + ((SPACE_NB - 1) * i + j + 1), + "http://localhost:8080/rest/projects/id" + + ((SPACE_NB - 1) * i + j + 1), creationDate); + p.addUser(this.usersList.get(this.usersUuids.get(0))); + pl.add(p); + } + try { + Thread.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + for (Project p : projectsRepository.save(pl)) { + this.testProjects.add(p); + } + + + + this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build(); + } + + @After + public void teardown() { + spacesRepository.deleteAll(); + projectsRepository.deleteAll(); + } + + @Test + public void testUserPostUpdate() 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"); + + 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 space", 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()); + } + + @Test + public void testUserPostCreate() throws Exception { + + MockHttpServletRequestBuilder post = MockMvcRequestBuilders + .post("/admin/users/save") + .param("title", "New name") + .param("description", "New description") + .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri") + .param("color", "#ffffff") + .param("expirationDate","2007-11-24") + .param("credentialExpirationDate","2009-11-29") + .param("password", "test") + .param("passwordConfirm", "test"); + + this.mvc.perform(post) + .andExpect(MockMvcResultMatchers.status().isSeeOther()) + .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/users")); + + Assert.assertEquals("Must have one more space", USER_NB + 1, + this.usersRepository.count()); + + for (User user : this.usersRepository.findAll()) { + if (this.usersList.containsKey(user.getId())) { + continue; + } + else { + Assert.assertNotNull("Should find space", 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.assertTrue( + "id sould match uuid regex", + user.getId() + .matches( + "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}")); + Assert.assertTrue("password must match \"test\"", renkanPasswordEncoder.matches("test", user.getPassword())); + Assert.assertEquals(new DateTime(2007, 11, 24, 0, 0, 0, 0), user.getExpirationDate()); + } + } + } +// +// @Test +// public void testSpacePostUpdateEmptyTitle() throws Exception { +// +// MockHttpServletRequestBuilder post = MockMvcRequestBuilders +// .post("/admin/spaces/save"); +// post = post.param("id", this.spacesUuids.get(0)); +// post = post.param("title", ""); +// 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("binConfig", "{}"); +// +// this.mvc.perform(post) +// .andExpect(MockMvcResultMatchers.status().isOk()) +// .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) +// .andExpect(MockMvcResultMatchers.model().hasErrors()) +// .andExpect(MockMvcResultMatchers.model().errorCount(1)) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasErrors( +// "space")) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasFieldErrors( +// "space", "title")); +// +// Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0)); +// +// Assert.assertNotNull("Should find space", sp); +// Assert.assertEquals("Title equals", "test 0", sp.getTitle()); +// +// } +// +// @Test +// public void testSpacePostCreateEmptyTitle() throws Exception { +// +// MockHttpServletRequestBuilder post = MockMvcRequestBuilders +// .post("/admin/spaces/save"); +// post = post.param("title", ""); +// 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("binConfig", "{}"); +// +// this.mvc.perform(post) +// .andExpect(MockMvcResultMatchers.status().isOk()) +// .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) +// .andExpect(MockMvcResultMatchers.model().hasErrors()) +// .andExpect(MockMvcResultMatchers.model().errorCount(1)) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasErrors( +// "space")) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasFieldErrors( +// "space", "title")); +// +// Assert.assertEquals("Must not have one more space", SPACE_NB, +// this.spacesRepository.count()); +// +// } +// +// @Test +// public void testSpacePostUpdateBadJson() throws Exception { +// +// MockHttpServletRequestBuilder post = MockMvcRequestBuilders +// .post("/admin/spaces/save"); +// post = post.param("id", this.spacesUuids.get(0)); +// post = post.param("title", "New Title"); +// 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("binConfig", "{"); +// +// this.mvc.perform(post) +// .andExpect(MockMvcResultMatchers.status().isOk()) +// .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) +// .andExpect(MockMvcResultMatchers.model().hasErrors()) +// .andExpect(MockMvcResultMatchers.model().errorCount(1)) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasErrors( +// "space")) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasFieldErrors( +// "space", "binConfig")); +// +// Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0)); +// +// Assert.assertNotNull("Should find space", sp); +// Assert.assertEquals("Bin config equals", "{}", sp.getBinConfig()); +// +// } +// +// @Test +// public void testSpacePostCreateBadJson() throws Exception { +// +// MockHttpServletRequestBuilder post = MockMvcRequestBuilders +// .post("/admin/spaces/save"); +// post = post.param("title", "New Title"); +// 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("binConfig", "}"); +// +// this.mvc.perform(post) +// .andExpect(MockMvcResultMatchers.status().isOk()) +// .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) +// .andExpect(MockMvcResultMatchers.model().hasErrors()) +// .andExpect(MockMvcResultMatchers.model().errorCount(1)) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasErrors( +// "space")) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasFieldErrors( +// "space", "binConfig")); +// +// Assert.assertEquals("Must not have one more space", SPACE_NB, +// this.spacesRepository.count()); +// +// } +// +// @Test +// public void testSpacePostUpdateAllErrors() throws Exception { +// +// MockHttpServletRequestBuilder post = MockMvcRequestBuilders +// .post("/admin/spaces/save"); +// post = post.param("id", this.spacesUuids.get(0)); +// post = post.param("title", ""); +// 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("binConfig", "{"); +// +// this.mvc.perform(post) +// .andExpect(MockMvcResultMatchers.status().isOk()) +// .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) +// .andExpect(MockMvcResultMatchers.model().hasErrors()) +// .andExpect(MockMvcResultMatchers.model().errorCount(2)) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasErrors( +// "space")) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasFieldErrors( +// "space", "title")) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasFieldErrors( +// "space", "binConfig")); +// +// Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0)); +// +// Assert.assertNotNull("Should find space", sp); +// Assert.assertEquals("Bin config equals", "{}", sp.getBinConfig()); +// Assert.assertEquals("title equals", "test 0", sp.getTitle()); +// +// } +// +// @Test +// public void testSpacePostCreateAllErrors() throws Exception { +// +// MockHttpServletRequestBuilder post = MockMvcRequestBuilders +// .post("/admin/spaces/save"); +// post = post.param("title", ""); +// 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("binConfig", "}"); +// +// this.mvc.perform(post) +// .andExpect(MockMvcResultMatchers.status().isOk()) +// .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit")) +// .andExpect(MockMvcResultMatchers.model().hasErrors()) +// .andExpect(MockMvcResultMatchers.model().errorCount(2)) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasErrors( +// "space")) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasFieldErrors( +// "space", "title")) +// .andExpect( +// MockMvcResultMatchers.model().attributeHasFieldErrors( +// "space", "binConfig")); +// +// Assert.assertEquals("Must not have one more space", SPACE_NB, +// this.spacesRepository.count()); +// +// } +// +// @Test +// public void testDeleteSpace() throws Exception { +// +// MockHttpServletRequestBuilder get = MockMvcRequestBuilders +// .get("/admin/spaces/delete/" +// + this.spacesUuids.get(SPACE_NB - 1)); +// +// MvcResult res = this.mvc +// .perform(get) +// .andExpect(MockMvcResultMatchers.status().isOk()) +// .andExpect( +// MockMvcResultMatchers.view().name( +// "admin/spaceDeleteConfirm")) +// .andExpect( +// MockMvcResultMatchers.model().attributeExists( +// "spaceObj", "key", "salt")).andReturn(); +// +// Map model = res.getModelAndView().getModel(); +// +// Space space = (Space) model.get("spaceObj"); +// Assert.assertNotNull("Space is not null", space); +// Assert.assertEquals("Must be first space id", +// this.spacesUuids.get(SPACE_NB - 1), space.getId()); +// +// String key = (String) model.get("key"); +// Assert.assertNotNull("key is not null", key); +// +// String salt = (String) model.get("salt"); +// Assert.assertNotNull("salt is not null", salt); +// +// Assert.assertTrue("Key must be checked", space.checkKey(key, salt)); +// +// } +// +// @Test +// public void testDeleteFakeSpace() throws Exception { +// +// MockHttpServletRequestBuilder get = MockMvcRequestBuilders +// .get("/admin/spaces/delete/" + UUID.randomUUID().toString()); +// +// try { +// this.mvc.perform(get).andExpect( +// MockMvcResultMatchers.status().isNotFound()); +// } catch (NestedServletException e) { +// Assert.assertNotNull("Nested exception must not be null", +// e.getCause()); +// Assert.assertEquals( +// "Inner exception must be a HttpClientErrorException", +// HttpClientErrorException.class, e.getCause().getClass()); +// Assert.assertEquals("Exception error status must be not found", +// HttpStatus.NOT_FOUND, +// ((HttpClientErrorException) e.getCause()).getStatusCode()); +// } +// +// } +// +// @Test +// public void testDeleteSpaceProject() throws Exception { +// +// MockHttpServletRequestBuilder get = MockMvcRequestBuilders +// .get("/admin/spaces/delete/" + this.spacesUuids.get(0)); +// +// try { +// this.mvc.perform(get).andExpect( +// MockMvcResultMatchers.status().isBadRequest()); +// } catch (NestedServletException e) { +// Assert.assertNotNull("Nested exception must not be null", +// e.getCause()); +// Assert.assertEquals( +// "Inner exception must be a HttpClientErrorException", +// HttpClientErrorException.class, e.getCause().getClass()); +// Assert.assertEquals("Exception error status must be not found", +// HttpStatus.BAD_REQUEST, +// ((HttpClientErrorException) e.getCause()).getStatusCode()); +// } +// +// } +// +// @Test +// public void testDoDeleteSpaceNoKey() throws Exception { +// MockHttpServletRequestBuilder post = MockMvcRequestBuilders +// .post("/admin/spaces/delete/" +// + this.spacesUuids.get(SPACE_NB - 1)); +// +// try { +// this.mvc.perform(post).andExpect( +// MockMvcResultMatchers.status().isBadRequest()); +// } catch (NestedServletException e) { +// Assert.assertNotNull("Nested exception must not be null", +// e.getCause()); +// Assert.assertEquals( +// "Inner exception must be a HttpClientErrorException", +// HttpClientErrorException.class, e.getCause().getClass()); +// Assert.assertEquals("Exception error status must be not found", +// HttpStatus.BAD_REQUEST, +// ((HttpClientErrorException) e.getCause()).getStatusCode()); +// } +// +// Assert.assertEquals("Must have same nb of space", SPACE_NB, +// this.spacesRepository.count()); +// +// } +// +// @Test +// public void testDoDeleteSpace() throws Exception { +// +// Space space = this.spacesList.get(this.spacesUuids.get(SPACE_NB - 1)); +// +// SecureRandom rand = SecureRandom.getInstance("SHA1PRNG"); +// rand.setSeed(System.currentTimeMillis()); +// byte[] rawSalt = new byte[50]; +// rand.nextBytes(rawSalt); +// String salt = Hex.encodeHexString(rawSalt); +// String key = space.getKey(salt); +// +// MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String +// .format("/admin/spaces/delete/%s?key=%s&salt=%s", +// this.spacesUuids.get(SPACE_NB - 1), key, salt)); +// +// this.mvc.perform(post) +// .andExpect(MockMvcResultMatchers.status().isSeeOther()) +// .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces")); +// +// Assert.assertEquals("Must have one less space", SPACE_NB - 1, +// this.spacesRepository.count()); +// +// space = this.spacesRepository.findOne(this.spacesUuids +// .get(SPACE_NB - 1)); +// +// Assert.assertNull("Space " + this.spacesUuids.get(SPACE_NB - 1) +// + " deleted", space); +// +// } +// +// @Test +// public void testDoDeleteSpaceFake() throws Exception { +// +// Space space = this.spacesList.get(this.spacesUuids.get(SPACE_NB - 1)); +// +// SecureRandom rand = SecureRandom.getInstance("SHA1PRNG"); +// rand.setSeed(System.currentTimeMillis()); +// byte[] rawSalt = new byte[50]; +// rand.nextBytes(rawSalt); +// String salt = Hex.encodeHexString(rawSalt); +// String key = space.getKey(salt); +// +// MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String +// .format("/admin/spaces/delete/%s?key=%s&salt=%s", +// UUID.randomUUID(), key, salt)); +// +// this.mvc.perform(post) +// .andExpect(MockMvcResultMatchers.status().isSeeOther()) +// .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces")); +// +// Assert.assertEquals("Must have the same nb of space", SPACE_NB, +// this.spacesRepository.count()); +// +// } +// +// @Test +// public void testDoDeleteSpaceProject() throws Exception { +// +// Space space = this.spacesList.get(this.spacesUuids.get(0)); +// +// SecureRandom rand = SecureRandom.getInstance("SHA1PRNG"); +// rand.setSeed(System.currentTimeMillis()); +// byte[] rawSalt = new byte[50]; +// rand.nextBytes(rawSalt); +// String salt = Hex.encodeHexString(rawSalt); +// String key = space.getKey(salt); +// +// MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String +// .format("/admin/spaces/delete/%s?key=%s&salt=%s", +// this.spacesUuids.get(0), key, salt)); +// +// try { +// this.mvc.perform(post).andExpect( +// MockMvcResultMatchers.status().isBadRequest()); +// } catch (NestedServletException e) { +// Assert.assertNotNull("Nested exception must not be null", +// e.getCause()); +// Assert.assertEquals( +// "Inner exception must be a HttpClientErrorException", +// HttpClientErrorException.class, e.getCause().getClass()); +// Assert.assertEquals("Exception error status must be not found", +// HttpStatus.BAD_REQUEST, +// ((HttpClientErrorException) e.getCause()).getStatusCode()); +// } +// +// Assert.assertEquals("Must have the same nb of space", SPACE_NB, +// this.spacesRepository.count()); +// +// } + +} diff -r e65766f81b15 -r b7000ff4989b server/src/test/java/org/iri_research/renkan/test/repositories/ProjectSyncsRepositoryTest.java --- a/server/src/test/java/org/iri_research/renkan/test/repositories/ProjectSyncsRepositoryTest.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/test/java/org/iri_research/renkan/test/repositories/ProjectSyncsRepositoryTest.java Fri Nov 15 09:34:41 2013 +0100 @@ -1,7 +1,7 @@ package org.iri_research.renkan.test.repositories; import java.util.ArrayList; -import java.util.Date; +import java.util.TimeZone; import java.util.UUID; import org.iri_research.renkan.RenkanException; @@ -11,6 +11,7 @@ import org.iri_research.renkan.repositories.ProjectSyncsRepository; import org.iri_research.renkan.repositories.ProjectsRepository; import org.iri_research.renkan.repositories.SpacesRepository; +import org.joda.time.DateTime; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -47,14 +48,15 @@ public void setup() { logger.debug("Setup"); + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); Space testSpace = new Space(UUID.randomUUID().toString(), "test", "Test space", null, null, null, "test_user", null, null); testSpace = spacesRepository.save(testSpace); ArrayList pl = new ArrayList(); pl.add(new Project(testSpace.getId(), null, "test1", "desc1", - "http://localhost:8080/rest/projects/id1", new Date())); + "http://localhost:8080/rest/projects/id1", new DateTime())); pl.add(new Project(testSpace.getId(), null, "test2", "desc2", - "http://localhost:8080/rest/projects/id2", new Date())); + "http://localhost:8080/rest/projects/id2", new DateTime())); logger.debug("Setup : new Project "); for (Project p : projectRepository.save(pl)) { this.testProjects.add(p); diff -r e65766f81b15 -r b7000ff4989b server/src/test/java/org/iri_research/renkan/test/repositories/ProjectsRepositoryTest.java --- a/server/src/test/java/org/iri_research/renkan/test/repositories/ProjectsRepositoryTest.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/test/java/org/iri_research/renkan/test/repositories/ProjectsRepositoryTest.java Fri Nov 15 09:34:41 2013 +0100 @@ -2,9 +2,9 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Date; import java.util.List; import java.util.Map; +import java.util.TimeZone; import java.util.UUID; import org.iri_research.renkan.models.Edge; @@ -20,6 +20,7 @@ import org.iri_research.renkan.repositories.SpacesRepository; import org.iri_research.renkan.repositories.UsersRepository; import org.iri_research.renkan.utils.ColorGenerator; +import org.joda.time.DateTime; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -76,7 +77,7 @@ private List testEdges = new ArrayList<>(); private List testUsers = new ArrayList<>(); - private Date creationDate = new Date(); + private DateTime creationDate = new DateTime(); private List spaceIds = new ArrayList<>(); @@ -88,6 +89,7 @@ @Before public void setup() { + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); logger.debug("Setup"); // CREATE USERS diff -r e65766f81b15 -r b7000ff4989b server/src/test/java/org/iri_research/renkan/test/repositories/SpacesRepositoryTest.java --- a/server/src/test/java/org/iri_research/renkan/test/repositories/SpacesRepositoryTest.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/test/java/org/iri_research/renkan/test/repositories/SpacesRepositoryTest.java Fri Nov 15 09:34:41 2013 +0100 @@ -1,14 +1,15 @@ package org.iri_research.renkan.test.repositories; import java.util.ArrayList; -import java.util.Date; 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.Space; import org.iri_research.renkan.repositories.SpacesRepository; +import org.joda.time.DateTime; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -50,9 +51,10 @@ public void setup() { logger.debug("Setup"); + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); spacesRepository.deleteAll(); for (int i = 0; i < SPACE_NB; i++) { - Date creationDate = new Date(); + DateTime creationDate = new DateTime(); String uuid = UUID.randomUUID().toString(); spacesUuids.add(uuid); Space testSpace = new Space(uuid, "test " + i, "Test space " + 1, @@ -111,7 +113,7 @@ Assert.assertTrue("mongo object must have created field", obj.containsField("created")); - Assert.assertEquals("Created must be the same", obj.get("created"), + Assert.assertEquals("Created must be the same", new DateTime(obj.get("created")), sp.getCreated()); Assert.assertTrue("mongo object must have bin_config field", diff -r e65766f81b15 -r b7000ff4989b server/src/test/java/org/iri_research/renkan/test/rest/ProjectRestTest.java --- a/server/src/test/java/org/iri_research/renkan/test/rest/ProjectRestTest.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/test/java/org/iri_research/renkan/test/rest/ProjectRestTest.java Fri Nov 15 09:34:41 2013 +0100 @@ -1,16 +1,16 @@ package org.iri_research.renkan.test.rest; +import java.io.IOException; import java.util.ArrayList; -import java.util.Date; import java.util.List; +import java.util.TimeZone; import java.util.UUID; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Application; +import javax.ws.rs.core.MediaType; import org.glassfish.jersey.server.ResourceConfig; -import org.glassfish.jersey.server.spring.SpringLifecycleListener; -import org.glassfish.jersey.server.spring.scope.RequestContextFilter; import org.glassfish.jersey.test.JerseyTest; import org.iri_research.renkan.models.Edge; import org.iri_research.renkan.models.Node; @@ -21,6 +21,9 @@ import org.iri_research.renkan.repositories.ProjectRevisionsRepository; import org.iri_research.renkan.repositories.ProjectsRepository; import org.iri_research.renkan.repositories.SpacesRepository; +import org.iri_research.renkan.rest.RestApplication; +import org.joda.time.DateTime; +import org.joda.time.format.ISODateTimeFormat; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -34,6 +37,10 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.joda.JodaModule; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; import com.mongodb.DBCursor; @@ -69,9 +76,16 @@ private List testNodes = new ArrayList(); private List testEdges = new ArrayList<>(); - private Date creationDate = new Date(); + private DateTime creationDate = new DateTime(); private String spaceId = UUID.randomUUID().toString(); + private String projectId = UUID.randomUUID().toString(); + + private ObjectMapper getObjectMapper() { + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new JodaModule()); + return mapper; + } public ProjectRestTest() { } @@ -91,10 +105,8 @@ @Override protected Application configure() { - ResourceConfig rc = new ResourceConfig() - .packages("org.iri_research.renkan.rest") - .register(SpringLifecycleListener.class) - .register(RequestContextFilter.class) + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + ResourceConfig rc = new RestApplication() .property("contextConfigLocation", "classpath:/org/iri_research/renkan/test/rest/rest-context.xml"); rc.setApplicationName("rest"); @@ -108,8 +120,7 @@ Space testSpace = new Space(this.spaceId, "test space", "Test space", null, null, null, "test_user", null, this.creationDate); testSpace = spacesRepository.save(testSpace); - testProject = new Project(testSpace.getId(), UUID.randomUUID() - .toString(), "test", "desc", + testProject = new Project(testSpace.getId(), this.projectId, "test", "desc", "http://localhost:8080/rest/projects/id", this.creationDate); for (int i = 0; i < 3; i++) { @@ -145,6 +156,28 @@ projectsRepository.deleteAll(); spacesRepository.deleteAll(); } + + @Test + public void testGetProject() throws JsonProcessingException, IOException { + WebTarget webResource = this.target(); + String respString = webResource.path("projects") + .path(testProject.getId()).request().acceptEncoding("UTF-8").accept(MediaType.APPLICATION_JSON_TYPE).get(String.class); + Assert.assertNotNull("get resp String not empty", respString); + Assert.assertFalse("get resp String non empty", respString.isEmpty()); + + logger.debug("Test get Project : respString : " + respString); + + ObjectMapper mapper = this.getObjectMapper(); + + JsonNode projectNode = mapper.readTree(respString); + + Assert.assertNotNull("project node not null", projectNode); + + Assert.assertNotNull("Must have an id", projectNode.get("id")); + Assert.assertEquals("id must match", this.projectId, projectNode.get("id").asText()); + Assert.assertNotNull("Must have a created date", projectNode.get("created")); + Assert.assertEquals("creation date must match", this.creationDate.toString(ISODateTimeFormat.dateTime()), projectNode.get("created").asText()); + } @Test public void testDeleteProject() { diff -r e65766f81b15 -r b7000ff4989b server/src/test/java/org/iri_research/renkan/test/rest/SpaceRestTest.java --- a/server/src/test/java/org/iri_research/renkan/test/rest/SpaceRestTest.java Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/test/java/org/iri_research/renkan/test/rest/SpaceRestTest.java Fri Nov 15 09:34:41 2013 +0100 @@ -2,9 +2,9 @@ import java.io.IOException; import java.net.URI; -import java.util.Date; import java.util.HashMap; import java.util.Map; +import java.util.TimeZone; import java.util.UUID; import javax.ws.rs.client.Entity; @@ -16,11 +16,10 @@ import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.model.Resource; -import org.glassfish.jersey.server.spring.SpringLifecycleListener; -import org.glassfish.jersey.server.spring.scope.RequestContextFilter; import org.glassfish.jersey.test.JerseyTest; import org.iri_research.renkan.models.Space; import org.iri_research.renkan.repositories.SpacesRepository; +import org.iri_research.renkan.rest.RestApplication; import org.iri_research.renkan.rest.SpacesResource; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormatter; @@ -39,6 +38,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.joda.JodaModule; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("rest-context.xml") @@ -51,7 +51,7 @@ private Map spacesList = new HashMap(); private String firstSpaceUUID = null; - + public SpaceRestTest() { } @@ -70,10 +70,8 @@ @Override protected Application configure() { - ResourceConfig rc = new ResourceConfig() - .packages("org.iri_research.renkan.rest") - .register(SpringLifecycleListener.class) - .register(RequestContextFilter.class) + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + ResourceConfig rc = new RestApplication() .property("contextConfigLocation", "classpath:/org/iri_research/renkan/test/rest/rest-context.xml"); rc.setApplicationName("rest"); @@ -85,7 +83,7 @@ logger.debug("Setup"); spacesRepository.deleteAll(); - Date creationDate = new Date(); + DateTime creationDate = new DateTime(); this.firstSpaceUUID = UUID.randomUUID().toString(); Space testSpace = new Space(firstSpaceUUID, "test", "Test space", "{}", "http://ldt.iri.centrepompidou.fr", "#ababab", "test_user", @@ -124,7 +122,8 @@ "The length of the space list resp. string must be > 0", respString.length() > 0); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); + JsonNode spacesList = mapper.readTree(respString); Assert.assertTrue("The spaceList must be an array", @@ -154,7 +153,7 @@ String respString = WebTarget.path("spaces").request() .get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode spacesList = mapper.readTree(respString); for (JsonNode jsonNode : spacesList) { @@ -178,7 +177,7 @@ String respString = WebTarget.path("spaces").request() .get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode spacesList = mapper.readTree(respString); for (JsonNode jsonNode : spacesList) { @@ -203,7 +202,7 @@ String respString = WebTarget.path("spaces").request() .get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode spacesList = mapper.readTree(respString); for (JsonNode jsonNode : spacesList) { @@ -227,7 +226,8 @@ String respString = WebTarget.path("spaces").request() .get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); + mapper.registerModule(new JodaModule()); JsonNode spacesList = mapper.readTree(respString); for (JsonNode jsonNode : spacesList) { @@ -251,7 +251,8 @@ String respString = WebTarget.path("spaces").request() .get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); + JsonNode spacesList = mapper.readTree(respString); for (JsonNode jsonNode : spacesList) { @@ -269,6 +270,12 @@ } + private ObjectMapper getObjectMapper() { + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new JodaModule()); + return mapper; + } + @Test public void testCreatedBy() throws JsonProcessingException, IOException { @@ -276,7 +283,7 @@ String respString = WebTarget.path("spaces").request() .get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode spacesList = mapper.readTree(respString); for (JsonNode jsonNode : spacesList) { @@ -301,7 +308,7 @@ String respString = WebTarget.path("spaces").request() .get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode spacesList = mapper.readTree(respString); for (JsonNode jsonNode : spacesList) { @@ -317,7 +324,7 @@ DateTime date = fmt.parseDateTime(dateStr); Assert.assertEquals("Created date must be the same", - space.getCreated(), date.toDate()); + space.getCreated(), date); } @@ -330,7 +337,7 @@ String respString = WebTarget.path("spaces").request() .get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode spacesList = mapper.readTree(respString); for (JsonNode jsonNode : spacesList) { @@ -355,7 +362,7 @@ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID) .request().accept(MediaType.APPLICATION_JSON).get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode jsonNode = mapper.readTree(respString); String id = jsonNode.get("id").asText(); @@ -370,7 +377,7 @@ DateTime date = fmt.parseDateTime(dateStr); Assert.assertEquals("Created date must be the same", - space.getCreated(), date.toDate()); + space.getCreated(), date); } @@ -382,7 +389,7 @@ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID) .request().accept(MediaType.APPLICATION_JSON).get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode jsonNode = mapper.readTree(respString); Assert.assertTrue("the space must have a title", @@ -402,7 +409,7 @@ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID) .request().accept(MediaType.APPLICATION_JSON).get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode jsonNode = mapper.readTree(respString); Assert.assertTrue("the space must have a description", @@ -421,7 +428,7 @@ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID) .request().accept(MediaType.APPLICATION_JSON).get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode jsonNode = mapper.readTree(respString); Assert.assertTrue("the space must have a uri", @@ -439,7 +446,7 @@ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID) .request().accept(MediaType.APPLICATION_JSON).get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode jsonNode = mapper.readTree(respString); Assert.assertTrue("the space must have a color", @@ -459,7 +466,7 @@ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID) .request().accept(MediaType.APPLICATION_JSON).get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode jsonNode = mapper.readTree(respString); Assert.assertTrue("the space must have a bin_config", @@ -479,7 +486,7 @@ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID) .request().accept(MediaType.APPLICATION_JSON).get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode jsonNode = mapper.readTree(respString); Assert.assertTrue("the space must have a created_by", @@ -498,7 +505,7 @@ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID) .request().accept(MediaType.APPLICATION_JSON).get(String.class); logger.debug("RESPONSE : " + respString); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode jsonNode = mapper.readTree(respString); Assert.assertTrue("the space must have a image", @@ -518,6 +525,7 @@ String color = "#bcbcbc"; String image = "http://ldt.iri.centrepompidou.fr/test_post/image"; String created = "2013-01-01T01:01:01.001+0000"; + String expectedCreated = "2013-01-01T01:01:01.001Z"; String bin_config = "{name: 'test_post_config'}"; String created_by = "test_user_post"; @@ -540,7 +548,7 @@ Assert.assertTrue("Resp must be application/json", resp.getMediaType() .isCompatible(MediaType.APPLICATION_JSON_TYPE)); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode objNode = mapper.readTree(respStr); Assert.assertTrue("the space must have an id", objNode.hasNonNull("id")); @@ -585,8 +593,8 @@ Assert.assertTrue("the space must have a created", objNode.hasNonNull("created")); String createdStr = objNode.get("created").asText(); - Assert.assertEquals("space created must be equals to " + created, - created, createdStr); + Assert.assertEquals("space created must be equals to " + expectedCreated, + expectedCreated, createdStr); // object must be created Space sp = this.spacesRepository.findOne(idStr); @@ -608,7 +616,7 @@ DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); DateTime created_date = fmt.parseDateTime(created); Assert.assertEquals("space created must be equals to " + created, - created_date.toDate(), sp.getCreated()); + created_date, sp.getCreated()); } @@ -701,7 +709,7 @@ DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); DateTime created_date = fmt.parseDateTime(created); Assert.assertEquals("space created must be equals to " + created, - created_date.toDate(), sp.getCreated()); + created_date, sp.getCreated()); } @@ -813,7 +821,7 @@ String jsonStr = respStr.substring("callback_func(".length(), respStr.length() - 1); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode jsonNode = mapper.readTree(jsonStr); Space space = this.spacesList.get(this.firstSpaceUUID); @@ -830,7 +838,7 @@ DateTime date = fmt.parseDateTime(dateStr); Assert.assertEquals("Created date must be the same", - space.getCreated(), date.toDate()); + space.getCreated(), date); Assert.assertEquals("title must be the same", space.getTitle(), jsonNode.get("title").asText()); @@ -856,7 +864,7 @@ String jsonStr = respStr.substring("callback_func(".length(), respStr.length() - 1); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = getObjectMapper(); JsonNode jsonNode = mapper.readTree(jsonStr); Space space = this.spacesList.get(this.firstSpaceUUID); @@ -873,7 +881,7 @@ DateTime date = fmt.parseDateTime(dateStr); Assert.assertEquals("Created date must be the same", - space.getCreated(), date.toDate()); + space.getCreated(), date); Assert.assertEquals("title must be the same", space.getTitle(), jsonNode.get("title").asText()); diff -r e65766f81b15 -r b7000ff4989b server/src/test/resources/org/iri_research/renkan/test/controller/controller-context.xml --- a/server/src/test/resources/org/iri_research/renkan/test/controller/controller-context.xml Thu Nov 07 10:42:18 2013 +0100 +++ b/server/src/test/resources/org/iri_research/renkan/test/controller/controller-context.xml Fri Nov 15 09:34:41 2013 +0100 @@ -13,6 +13,10 @@ + + + +