package controllers; import static org.fest.assertions.Assertions.assertThat; import static org.junit.Assert.fail; 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 notifications.NotificationManagerTest.awaitNotifications; import static test.AorraTestUtils.asAdminUser; import static test.AorraTestUtils.fileStore; import static test.AorraTestUtils.flagStore; import static test.AorraTestUtils.jcrom; import java.io.ByteArrayInputStream; import java.util.List; import java.util.UUID; import javax.jcr.PathNotFoundException; import javax.jcr.Session; import models.Flag; import models.GroupManager; import models.Notification; import models.User; import models.UserDAO; 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.apache.jackrabbit.api.security.user.Group; import org.junit.Test; import play.api.mvc.Call; import play.libs.F; import play.libs.Json; import play.mvc.Result; import play.test.FakeRequest; public class GroupControllerTest { @Test public void routes() { asAdminUser(new F.Function3<Session, User, FakeRequest, Session>() { @Override public Session apply( final Session session, final User user, final FakeRequest newRequest) throws Throwable { { final Call call = controllers.routes.GroupController.list(); assertThat(call.method()).isEqualTo("GET"); assertThat(call.url()).isEqualTo("/groups"); } return session; } }); } @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 Result result = callAction( controllers.routes.ref.GroupController.list(), 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(); assertThat(json).hasSize(1); for (JsonNode g : json) { assertThat(g.has("id")).isTrue(); assertThat(g.has("name")).isTrue(); assertThat(g.has("members")).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 Result result = callAction( controllers.routes.ref.GroupController.get("testgroup"), 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.has("id")).isTrue(); assertThat(json.has("name")).isTrue(); assertThat(json.has("members")).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 { // name attribute is required { final ObjectNode jsonRequest = Json.newObject(); final Result result = callAction( controllers.routes.ref.GroupController.create(), newRequest.withJsonBody(jsonRequest)); assertThat(status(result)).isEqualTo(400); } // New group can be created { final ObjectNode jsonRequest = Json.newObject(); jsonRequest.put("name", "newgroup"); final Result result = callAction( controllers.routes.ref.GroupController.create(), newRequest.withJsonBody(jsonRequest)); assertThat(new GroupManager(session).find("newgroup")).isNotNull(); 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(); assertThat(json.has("id")).isTrue(); assertThat(json.has("name")).isTrue(); assertThat(json.has("members")).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 GroupManager gm = new GroupManager(session); final Group group = gm.create("newgroup"); // members attribute is required { final ObjectNode jsonRequest = Json.newObject(); final Result result = callAction( controllers.routes.ref.GroupController.update("newgroup"), newRequest.withJsonBody(jsonRequest)); assertThat(status(result)).isEqualTo(400); } // Members can be added and removed { final ObjectNode jsonRequest = Json.newObject(); jsonRequest.putArray("members").add(user.getId()); final Result result = callAction( controllers.routes.ref.GroupController.update("newgroup"), newRequest.withJsonBody(jsonRequest)); assertThat(gm.memberships(user.getId())) .contains(group); 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.has("id")).isTrue(); assertThat(json.has("name")).isTrue(); assertThat(json.has("members")).isTrue(); } { final ObjectNode jsonRequest = Json.newObject(); jsonRequest.putArray("members"); final Result result = callAction( controllers.routes.ref.GroupController.update("newgroup"), newRequest.withJsonBody(jsonRequest)); assertThat(gm.memberships(user.getId())) .excludes(group); 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.has("id")).isTrue(); assertThat(json.has("name")).isTrue(); assertThat(json.has("members")).isTrue(); } // Removing admin == removed access { final ObjectNode jsonRequest = Json.newObject(); jsonRequest.putArray("members"); final Result result = callAction( controllers.routes.ref.GroupController.update("testgroup"), newRequest.withJsonBody(jsonRequest)); assertThat(status(result)).isEqualTo(200); } { final ObjectNode jsonRequest = Json.newObject(); jsonRequest.putArray("members").add(user.getId()); final Result result = callAction( controllers.routes.ref.GroupController.update("testgroup"), newRequest.withJsonBody(jsonRequest)); assertThat(status(result)).isEqualTo(403); } 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 Result result = callAction( controllers.routes.ref.GroupController.delete("testgroup"), newRequest); try { new GroupManager(session).find("testgroup"); fail(); } catch (PathNotFoundException e) { // As expected } assertThat(status(result)).isEqualTo(204); return session; } }); } }