package controllers;
import static org.fest.assertions.Assertions.assertThat;
import static play.test.Helpers.callAction;
import static play.test.Helpers.charset;
import static play.test.Helpers.contentAsString;
import static play.test.Helpers.contentType;
import static play.test.Helpers.header;
import static play.test.Helpers.status;
import static test.AorraTestUtils.asAdminUser;
import static test.AorraTestUtils.fileStore;
import static test.AorraTestUtils.injector;
import java.io.ByteArrayInputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.jcr.Session;
import models.Flag;
import models.GroupManager;
import models.User;
import com.google.common.collect.ContiguousSet;
import com.google.common.collect.DiscreteDomain;
import com.google.common.collect.Lists;
import com.google.common.collect.Range;
import org.apache.commons.io.IOUtils;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import org.apache.jackrabbit.api.security.user.Group;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.junit.Test;
import play.api.mvc.AnyContentAsText;
import play.api.mvc.Call;
import play.libs.F;
import play.libs.Json;
import play.mvc.Http.Status;
import play.mvc.Result;
import play.test.FakeRequest;
import service.filestore.CommentStore;
import service.filestore.FileStore;
import service.filestore.FileStore.Permission;
import service.filestore.FlagStore;
import service.filestore.FlagStore.FlagType;
import service.filestore.JsonBuilder;
import service.filestore.roles.Admin;
public class CommentControllerTest {
@Test
public void list() {
asAdminUser(new F.Function3<Session, User, FakeRequest, Session>() {
@Override
public Session apply(
final Session session,
final User user,
final FakeRequest newRequest) throws Throwable {
final String targetId = UUID.randomUUID().toString();
final CommentStore.Manager csm =
injector().getInstance(CommentStore.class).getManager(session);
csm.create(user.getId(), targetId, "Test message #1");
csm.create(user.getId(), targetId, "Test message #2");
csm.create(user.getId(), UUID.randomUUID().toString(), "Other message");
final Result result = callAction(
controllers.routes.ref.CommentController.list(targetId),
newRequest);
assertThat(status(result)).isEqualTo(200);
assertThat(contentType(result)).isEqualTo("application/json");
assertThat(charset(result)).isEqualTo("utf-8");
assertThat(header("Cache-Control", result))
.isEqualTo("max-age=0, must-revalidate");
final JsonNode json = Json.parse(contentAsString(result));
assertThat(json.isArray()).isTrue();
for (JsonNode jsonObj : json) {
assertThat(jsonObj.has("id")).isTrue();
assertThat(jsonObj.get("targetId").asText()).isEqualTo(targetId);
assertThat(jsonObj.get("userId").asText()).isEqualTo(user.getId());
assertThat(jsonObj.has("message")).isTrue();
assertThat(jsonObj.has("created")).isTrue();
assertThat(jsonObj.has("modified")).isTrue();
}
return session;
}
});
}
@Test
public void get() {
asAdminUser(new F.Function3<Session, User, FakeRequest, Session>() {
@Override
public Session apply(
final Session session,
final User user,
final FakeRequest newRequest) throws Throwable {
final String targetId = UUID.randomUUID().toString();
final CommentStore.Manager csm =
injector().getInstance(CommentStore.class).getManager(session);
csm.create(user.getId(), targetId, "Test message #1");
final CommentStore.Comment intendedComment =
csm.create(user.getId(), targetId, "Test message #2");
final Result result = callAction(
controllers.routes.ref.CommentController.get(
intendedComment.getId(), targetId),
newRequest);
assertThat(status(result)).isEqualTo(200);
assertThat(contentType(result)).isEqualTo("application/json");
assertThat(charset(result)).isEqualTo("utf-8");
assertThat(header("Cache-Control", result))
.isEqualTo("max-age=0, must-revalidate");
final JsonNode json = Json.parse(contentAsString(result));
assertThat(json.isArray()).isFalse();
assertThat(json.get("id").asText()).isEqualTo(intendedComment.getId());
assertThat(json.get("targetId").asText()).isEqualTo(targetId);
assertThat(json.get("userId").asText()).isEqualTo(user.getId());
assertThat(json.get("message").asText()).isEqualTo(
intendedComment.getMessage());
assertThat(json.has("created")).isTrue();
assertThat(json.has("modified")).isTrue();
return session;
}
});
}
@Test
public void create() {
asAdminUser(new F.Function3<Session, User, FakeRequest, Session>() {
@Override
public Session apply(
final Session session,
final User user,
final FakeRequest newRequest) throws Throwable {
final String targetId = UUID.randomUUID().toString();
final String msg = "Test message.";
final CommentStore.Manager csm =
injector().getInstance(CommentStore.class).getManager(session);
final ObjectNode requestJson = Json.newObject();
requestJson.put("message", msg);
final Result result = callAction(
controllers.routes.ref.CommentController.create(targetId),
newRequest.withJsonBody(requestJson));
assertThat(status(result)).isEqualTo(201);
assertThat(contentType(result)).isEqualTo("application/json");
assertThat(charset(result)).isEqualTo("utf-8");
assertThat(header("Cache-Control", result))
.isEqualTo("max-age=0, must-revalidate");
final JsonNode json = Json.parse(contentAsString(result));
assertThat(json.isArray()).isFalse();
final CommentStore.Comment comment = csm.findByTarget(targetId).first();
assertThat(json.get("id").asText()).isEqualTo(comment.getId());
assertThat(json.get("targetId").asText()).isEqualTo(targetId);
assertThat(comment.getTargetId()).isEqualTo(targetId);
assertThat(json.get("userId").asText()).isEqualTo(user.getId());
assertThat(comment.getUserId()).isEqualTo(user.getId());
assertThat(json.get("message").asText()).isEqualTo(msg);
assertThat(comment.getMessage()).isEqualTo(msg);
assertThat(json.has("created")).isTrue();
assertThat(json.has("modified")).isTrue();
return session;
}
});
}
@Test
public void update() {
asAdminUser(new F.Function3<Session, User, FakeRequest, Session>() {
@Override
public Session apply(
final Session session,
final User user,
final FakeRequest newRequest) throws Throwable {
final String targetId = UUID.randomUUID().toString();
final String msg = "Test message.";
final String newMsg = "Updated message.";
final CommentStore.Manager csm =
injector().getInstance(CommentStore.class).getManager(session);
final String cId = csm.create(user.getId(), targetId, msg).getId();
final ObjectNode requestJson = Json.newObject();
requestJson.put("message", newMsg);
final Result result = callAction(
controllers.routes.ref.CommentController.update(cId, targetId),
newRequest.withJsonBody(requestJson));
assertThat(status(result)).isEqualTo(200);
assertThat(contentType(result)).isEqualTo("application/json");
assertThat(charset(result)).isEqualTo("utf-8");
assertThat(header("Cache-Control", result))
.isEqualTo("max-age=0, must-revalidate");
final JsonNode json = Json.parse(contentAsString(result));
assertThat(json.isArray()).isFalse();
final CommentStore.Comment comment = csm.findById(cId);
assertThat(json.get("id").asText()).isEqualTo(comment.getId());
assertThat(json.get("targetId").asText()).isEqualTo(targetId);
assertThat(comment.getTargetId()).isEqualTo(targetId);
assertThat(json.get("userId").asText()).isEqualTo(user.getId());
assertThat(comment.getUserId()).isEqualTo(user.getId());
assertThat(json.get("message").asText()).isEqualTo(newMsg);
assertThat(comment.getMessage()).isEqualTo(newMsg);
assertThat(json.has("created")).isTrue();
assertThat(json.has("modified")).isTrue();
assertThat(json.get("modified").asText()).isNotEqualTo(
json.get("created").asText());
return session;
}
});
}
@Test
public void delete() {
asAdminUser(new F.Function3<Session, User, FakeRequest, Session>() {
@Override
public Session apply(
final Session session,
final User user,
final FakeRequest newRequest) throws Throwable {
final String targetId = UUID.randomUUID().toString();
final String msg = "Test message.";
final CommentStore.Manager csm =
injector().getInstance(CommentStore.class).getManager(session);
final String cId = csm.create(user.getId(), targetId, msg).getId();
final Result result = callAction(
controllers.routes.ref.CommentController.delete(cId, targetId),
newRequest);
assertThat(status(result)).isEqualTo(204);
assertThat(header("Cache-Control", result))
.isEqualTo("max-age=0, must-revalidate");
assertThat(csm.findById(cId)).isNull();
return session;
}
});
}
}