package com.box.sdk; import java.text.ParseException; import java.util.Collection; import java.util.Date; import java.util.Iterator; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.skyscreamer.jsonassert.JSONCompareMode.LENIENT; import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; import static com.github.tomakehurst.wiremock.client.WireMock.delete; import static com.github.tomakehurst.wiremock.client.WireMock.deleteRequestedFor; import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson; import static com.github.tomakehurst.wiremock.client.WireMock.post; import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor; import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; import static com.github.tomakehurst.wiremock.client.WireMock.verify; import com.eclipsesource.json.JsonArray; import com.eclipsesource.json.JsonObject; import com.github.tomakehurst.wiremock.client.WireMock; import com.github.tomakehurst.wiremock.junit.WireMockRule; /** * {@link BoxGroup} related tests. */ public class BoxGroupTest { /** * Wiremock */ @Rule public WireMockRule wireMockRule = new WireMockRule(8080); /** * Unit test for {@link BoxGroup#getInfo(String...)}. */ @Test @Category(UnitTest.class) public void testGetInfoSendsCorrectRequestWithParams() { final JsonObject fakeJSONResponse = new JsonObject() .add("id", "0"); BoxAPIConnection api = new BoxAPIConnection(""); api.setRequestInterceptor(new RequestInterceptor() { @Override public BoxAPIResponse onRequest(BoxAPIRequest request) { Assert.assertEquals( "https://api.box.com/2.0/groups/0?fields=name%2Ccreated_at", request.getUrl().toString()); return new BoxJSONResponse() { @Override public String getJSON() { return fakeJSONResponse.toString(); } }; } }); BoxGroup group = new BoxGroup(api, "0"); group.getInfo("name", "created_at"); } /** * Unit test for {@link BoxGroup#getInfo()}. */ @Test @Category(UnitTest.class) public void testGetInfoSendsCorrectRequest() { final JsonObject fakeJSONResponse = new JsonObject() .add("id", "0"); BoxAPIConnection api = new BoxAPIConnection(""); api.setRequestInterceptor(new RequestInterceptor() { @Override public BoxAPIResponse onRequest(BoxAPIRequest request) { Assert.assertEquals( "https://api.box.com/2.0/groups/0", request.getUrl().toString()); return new BoxJSONResponse() { @Override public String getJSON() { return fakeJSONResponse.toString(); } }; } }); BoxGroup group = new BoxGroup(api, "0"); group.getInfo(); } /** * Unit test for {@link BoxGroup#getInfo()}. */ @Test @Category(UnitTest.class) public void testGetInfoParseAllFieldsCorrectly() throws ParseException { final String id = "119720"; final String name = "Box Employees"; final Date createdAt = BoxDateFormat.parse("2013-05-16T15:27:57-07:00"); final Date modifiedAt = BoxDateFormat.parse("2013-05-16T15:27:57-07:00"); final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n" + " \"type\": \"group\",\n" + " \"id\": \"119720\",\n" + " \"name\": \"Box Employees\",\n" + " \"created_at\": \"2013-05-16T15:27:57-07:00\",\n" + " \"modified_at\": \"2013-05-16T15:27:57-07:00\"\n" + "}"); BoxAPIConnection api = new BoxAPIConnection(""); api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse)); BoxGroup group = new BoxGroup(api, id); BoxGroup.Info info = group.getInfo(); Assert.assertEquals(id, info.getID()); Assert.assertEquals(name, info.getName()); Assert.assertEquals(createdAt, info.getCreatedAt()); Assert.assertEquals(modifiedAt, info.getModifiedAt()); } /** * Unit test for {@link BoxGroup#addMembership(BoxUser)}. */ @Test @Category(UnitTest.class) public void testAddMembershipSendsCorrectJson() { final String userID = "1992432"; final String groupID = "1992433"; final JsonObject fakeJSONResponse = new JsonObject().add("id", "0"); BoxAPIConnection api = new BoxAPIConnection(""); api.setRequestInterceptor(new JSONRequestInterceptor() { @Override protected BoxAPIResponse onJSONRequest(BoxJSONRequest request, JsonObject json) { Assert.assertEquals("https://api.box.com/2.0/group_memberships", request.getUrl().toString()); Assert.assertEquals(userID, json.get("user").asObject().get("id").asString()); Assert.assertEquals(groupID, json.get("group").asObject().get("id").asString()); return new BoxJSONResponse() { @Override public String getJSON() { return fakeJSONResponse.toString(); } }; } }); BoxGroup group = new BoxGroup(api, groupID); group.addMembership(new BoxUser(api, userID)); } /** * Unit test for {@link BoxGroup#addMembership(BoxUser)}. */ @Test @Category(UnitTest.class) public void testAddMembershipParseAllFieldscorrectly() { final String id = "1560354"; final String userID = "13130406"; final String userName = "Alison Wonderland"; final String userLogin = "alice@gmail.com"; final String groupID = "119720"; final String groupName = "family"; final BoxGroupMembership.Role role = BoxGroupMembership.Role.MEMBER; final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n" + " \"type\": \"group_membership\",\n" + " \"id\": \"1560354\",\n" + " \"user\": {\n" + " \"type\": \"user\",\n" + " \"id\": \"13130406\",\n" + " \"name\": \"Alison Wonderland\",\n" + " \"login\": \"alice@gmail.com\"\n" + " },\n" + " \"group\": {\n" + " \"type\": \"group\",\n" + " \"id\": \"119720\",\n" + " \"name\": \"family\"\n" + " },\n" + " \"role\": \"member\"\n" + " }"); BoxAPIConnection api = new BoxAPIConnection(""); api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse)); BoxGroup group = new BoxGroup(api, id); BoxGroupMembership.Info info = group.addMembership(new BoxUser(api, "0")); Assert.assertEquals(id, info.getID()); Assert.assertEquals(userID, info.getUser().getID()); Assert.assertEquals(userName, info.getUser().getName()); Assert.assertEquals(userLogin, info.getUser().getLogin()); Assert.assertEquals(groupID, info.getGroup().getID()); Assert.assertEquals(groupName, info.getGroup().getName()); Assert.assertEquals(role, info.getRole()); } /** * Unit test for {@link BoxGroup#getAllMemberships(String...)}. */ @Test @Category(UnitTest.class) public void testGetAllMembershipsParseAllFieldsCorrectly() { final String firstMembershipID = "1560354"; final String firstMembershipUserID = "13130906"; final String firstMembershipUserName = "Alice"; final String firstMembershipUserLogin = "alice@gmail.com"; final String groupID = "119720"; final String groupName = "family"; final BoxGroupMembership.Role role = BoxGroupMembership.Role.MEMBER; final String secondMembershipID = "1560356"; final String secondMembershipUserID = "192633962"; final String secondMembershipUserName = "rabbit"; final String secondMembershipUserLogin = "rabbit@gmail.com"; final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n" + " \"total_count\": 2,\n" + " \"entries\": [\n" + " {\n" + " \"type\": \"group_membership\",\n" + " \"id\": \"1560354\",\n" + " \"user\": {\n" + " \"type\": \"user\",\n" + " \"id\": \"13130906\",\n" + " \"name\": \"Alice\",\n" + " \"login\": \"alice@gmail.com\"\n" + " },\n" + " \"group\": {\n" + " \"type\": \"group\",\n" + " \"id\": \"119720\",\n" + " \"name\": \"family\"\n" + " },\n" + " \"role\": \"member\"\n" + " },\n" + " {\n" + " \"type\": \"group_membership\",\n" + " \"id\": \"1560356\",\n" + " \"user\": {\n" + " \"type\": \"user\",\n" + " \"id\": \"192633962\",\n" + " \"name\": \"rabbit\",\n" + " \"login\": \"rabbit@gmail.com\"\n" + " },\n" + " \"group\": {\n" + " \"type\": \"group\",\n" + " \"id\": \"119720\",\n" + " \"name\": \"family\"\n" + " },\n" + " \"role\": \"member\"\n" + " }\n" + " ],\n" + " \"offset\": 0,\n" + " \"limit\": 1000\n" + "}"); BoxAPIConnection api = new BoxAPIConnection(""); api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse)); BoxGroup group = new BoxGroup(api, "0"); Iterator<BoxGroupMembership.Info> iterator = group.getAllMemberships().iterator(); BoxGroupMembership.Info info = iterator.next(); Assert.assertEquals(firstMembershipID, info.getID()); Assert.assertEquals(firstMembershipUserID, info.getUser().getID()); Assert.assertEquals(firstMembershipUserName, info.getUser().getName()); Assert.assertEquals(firstMembershipUserLogin, info.getUser().getLogin()); Assert.assertEquals(groupID, info.getGroup().getID()); Assert.assertEquals(groupName, info.getGroup().getName()); Assert.assertEquals(role, info.getRole()); info = iterator.next(); Assert.assertEquals(secondMembershipID, info.getID()); Assert.assertEquals(secondMembershipUserID, info.getUser().getID()); Assert.assertEquals(secondMembershipUserName, info.getUser().getName()); Assert.assertEquals(secondMembershipUserLogin, info.getUser().getLogin()); Assert.assertEquals(groupID, info.getGroup().getID()); Assert.assertEquals(groupName, info.getGroup().getName()); Assert.assertEquals(role, info.getRole()); Assert.assertEquals(false, iterator.hasNext()); } /** * Unit test for {@link BoxGroup#getAllMemberships(String...)}. */ @Test @Category(UnitTest.class) public void testGetAllMembershipsSendsCorrectRequest() { final JsonObject fakeJSONResponse = new JsonObject() .add("total_count", 0) .add("offset", 0) .add("entries", new JsonArray()); BoxAPIConnection api = new BoxAPIConnection(""); api.setRequestInterceptor(new RequestInterceptor() { @Override public BoxAPIResponse onRequest(BoxAPIRequest request) { Assert.assertEquals( "https://api.box.com/2.0/groups/0/memberships?fields=user%2Cgroup&limit=1000&offset=0", request.getUrl().toString()); return new BoxJSONResponse() { @Override public String getJSON() { return fakeJSONResponse.toString(); } }; } }); BoxGroup group = new BoxGroup(api, "0"); Iterator<BoxGroupMembership.Info> iterator = group.getAllMemberships("user", "group").iterator(); iterator.hasNext(); } /** * Unit test for {@link BoxGroup#getAllGroups(BoxAPIConnection, String...)}. */ @Test @Category(UnitTest.class) public void testGetAllGroupsSendsCorrectRequest() { final JsonObject fakeJSONResponse = new JsonObject() .add("total_count", 0) .add("offset", 0) .add("entries", new JsonArray()); BoxAPIConnection api = new BoxAPIConnection(""); api.setRequestInterceptor(new RequestInterceptor() { @Override public BoxAPIResponse onRequest(BoxAPIRequest request) { Assert.assertEquals("https://api.box.com/2.0/groups?fields=name%2Ccreated_at&limit=1000&offset=0", request.getUrl().toString()); return new BoxJSONResponse() { @Override public String getJSON() { return fakeJSONResponse.toString(); } }; } }); Iterator<BoxGroup.Info> iterator = BoxGroup.getAllGroups(api, "name", "created_at").iterator(); iterator.hasNext(); } /** * Unit test for {@link BoxGroup#updateInfo(BoxGroup.Info)}. */ @Test @Category(UnitTest.class) public void testUpdateInfoSendsCorrectJSON() { final String name = "family"; final String provenance = "non-empty provenance"; final String externalSyncIdentifier = "non-empty identifier"; final String description = "non-empty description"; final String invitabilityLevel = "non-empty level"; final String memberViewabilityLevel = "another non-empty level"; BoxAPIConnection api = new BoxAPIConnection(""); api.setRequestInterceptor(new JSONRequestInterceptor() { @Override protected BoxAPIResponse onJSONRequest(BoxJSONRequest request, JsonObject json) { Assert.assertEquals("https://api.box.com/2.0/groups/0", request.getUrl().toString()); Assert.assertEquals(name, json.get("name").asString()); Assert.assertEquals(provenance, json.get("provenance").asString()); Assert.assertEquals(externalSyncIdentifier, json.get("external_sync_identifier").asString()); Assert.assertEquals(description, json.get("description").asString()); Assert.assertEquals(invitabilityLevel, json.get("invitability_level").asString()); Assert.assertEquals(memberViewabilityLevel, json.get("member_viewability_level").asString()); return new BoxJSONResponse() { @Override public String getJSON() { return "{}"; } }; } }); BoxGroup group = new BoxGroup(api, "0"); BoxGroup.Info info = group.new Info(); info.addPendingChange("name", name); info.addPendingChange("provenance", provenance); info.addPendingChange("external_sync_identifier", externalSyncIdentifier); info.addPendingChange("description", description); info.addPendingChange("invitability_level", invitabilityLevel); info.addPendingChange("member_viewability_level", memberViewabilityLevel); group.updateInfo(info); } /** * Unit test for {@link BoxGroup#updateInfo(BoxGroup.Info)}. */ @Test @Category(UnitTest.class) public void testUpdateInfoParseAllFieldsCorrectly() throws ParseException { final String id = "119720"; final String name = "family"; final Date createdAt = BoxDateFormat.parse("2013-05-16T15:27:57-07:00"); final Date modifiedAt = BoxDateFormat.parse("2013-05-17T15:27:57-07:00"); final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n" + " \"type\": \"group\",\n" + " \"id\": \"119720\",\n" + " \"name\": \"family\",\n" + " \"created_at\": \"2013-05-16T15:27:57-07:00\",\n" + " \"modified_at\": \"2013-05-17T15:27:57-07:00\"\n" + "}"); BoxAPIConnection api = new BoxAPIConnection(""); api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse)); BoxGroup group = new BoxGroup(api, id); BoxGroup.Info info = group.new Info(); info.addPendingChange("name", name); group.updateInfo(info); Assert.assertEquals(id, info.getID()); Assert.assertEquals(name, info.getName()); Assert.assertEquals(createdAt, info.getCreatedAt()); Assert.assertEquals(modifiedAt, info.getModifiedAt()); } @Test @Category(IntegrationTest.class) public void createAndDeleteGroupSucceeds() { final String groupName = "[createAndDeleteGroupSucceeds] Test Group"; BoxAPIConnection api = new BoxAPIConnection(TestConfig.getAccessToken()); BoxGroup.Info createdGroupInfo = BoxGroup.createGroup(api, groupName); assertThat(createdGroupInfo.getName(), equalTo(groupName)); createdGroupInfo.getResource().delete(); } @Test @Category(IntegrationTest.class) public void addMembershipSucceedsAndGetMembershipsHasCorrectMemberships() { BoxAPIConnection api = new BoxAPIConnection(TestConfig.getAccessToken()); String groupName = "[addMembershipSucceedsAndGetMembershipsHasCorrectMemberships] Test Group"; BoxUser user = BoxUser.getCurrentUser(api); BoxGroupMembership.Role membershipRole = BoxGroupMembership.Role.ADMIN; BoxGroup group = BoxGroup.createGroup(api, groupName).getResource(); BoxGroupMembership.Info membershipInfo = group.addMembership(user, membershipRole); String membershipID = membershipInfo.getID(); assertThat(membershipInfo.getUser().getID(), is(equalTo(user.getID()))); assertThat(membershipInfo.getGroup().getID(), is(equalTo(group.getID()))); assertThat(membershipInfo.getRole(), is(equalTo(membershipRole))); Collection<BoxGroupMembership.Info> memberships = group.getMemberships(); assertThat(memberships, hasSize(1)); assertThat(memberships, hasItem(Matchers.<BoxGroupMembership.Info>hasProperty("ID", equalTo(membershipID)))); group.delete(); } @Test @Category(IntegrationTest.class) public void getInfoSucceeds() { final String groupName = "[getInfoSucceeds] Test Group"; BoxAPIConnection api = new BoxAPIConnection(TestConfig.getAccessToken()); BoxGroup createdGroup = BoxGroup.createGroup(api, groupName).getResource(); BoxGroup.Info createdGroupInfo = createdGroup.getInfo(); assertThat(createdGroupInfo.getName(), equalTo(groupName)); createdGroupInfo.getResource().delete(); } /** * Unit test for {@link BoxGroup#createGroup(BoxAPIConnection, String, String, String, String, String, String)}. */ @Test @Category(UnitTest.class) public void createGroupSendsCorrectRequestAndParsesResponseCorrectly() throws ParseException { BoxAPIConnection api = new BoxAPIConnection(""); api.setBaseURL("http://localhost:8080/"); final String name = "Test Group"; final String description = "Test group description"; final String provenance = "test provenance"; final String externalSyncItentifier = "unit tests"; final String invitibilityLevel = "admins_only"; final String memberViewabilityLevel = "all_managed_users"; JsonObject mockJSON = new JsonObject() .add("type", "group") .add("id", "305742") .add("name", name) .add("description", description) .add("provenance", provenance) .add("external_sync_identifier", externalSyncItentifier) .add("invitability_level", invitibilityLevel) .add("member_viewability_level", memberViewabilityLevel) .add("created_at", "2015-01-05T16:08:27-08:00") .add("modified_at", "2015-01-05T16:08:27-08:00"); stubFor(post(urlEqualTo("/groups")) .willReturn(aResponse() .withHeader("Content-Type", "application/json") .withBody(mockJSON.toString()))); BoxGroup.Info groupInfo = BoxGroup.createGroup(api, name, provenance, externalSyncItentifier, description, invitibilityLevel, memberViewabilityLevel); assertThat(groupInfo.getID(), is(equalTo(mockJSON.get("id").asString()))); assertThat(groupInfo.getName(), is(equalTo(mockJSON.get("name").asString()))); assertThat(groupInfo.getDescription(), is(equalTo(mockJSON.get("description").asString()))); assertThat(groupInfo.getProvenance(), is(equalTo(mockJSON.get("provenance").asString()))); assertThat(groupInfo.getExternalSyncIdentifier(), is(equalTo(mockJSON.get("external_sync_identifier").asString()))); assertThat(groupInfo.getInvitabilityLevel(), is(equalTo(mockJSON.get("invitability_level").asString()))); assertThat(groupInfo.getMemberViewabilityLevel(), is(equalTo(mockJSON.get("member_viewability_level").asString()))); assertThat(groupInfo.getCreatedAt(), is(equalTo(BoxDateFormat.parse(mockJSON.get("created_at").asString())))); assertThat(groupInfo.getModifiedAt(), is(equalTo(BoxDateFormat.parse(mockJSON.get("modified_at").asString())))); JsonObject expectedJSON = new JsonObject() .add("name", name) .add("description", description) .add("provenance", provenance) .add("external_sync_identifier", externalSyncItentifier) .add("invitability_level", invitibilityLevel) .add("member_viewability_level", memberViewabilityLevel); verify(postRequestedFor(urlEqualTo("/groups")) .withHeader("Content-Type", WireMock.equalTo("application/json")) .withRequestBody(equalToJson(expectedJSON.toString(), LENIENT))); } /** * Unit test for {@link BoxGroup#delete()}. */ @Test @Category(UnitTest.class) public void deleteGroupSendsCorrectRequest() { BoxAPIConnection api = new BoxAPIConnection(""); api.setBaseURL("http://localhost:8080/"); final String groupID = "1"; final String groupURL = "/groups/" + groupID; stubFor(delete(urlEqualTo(groupURL)) .willReturn(aResponse() .withStatus(204))); BoxGroup group = new BoxGroup(api, groupID); group.delete(); verify(deleteRequestedFor(urlEqualTo(groupURL)) .withRequestBody(WireMock.equalTo(""))); } @Test @Category(IntegrationTest.class) public void getCollaborationsSucceedsAndHandlesResponseCorrectly() { BoxAPIConnection api = new BoxAPIConnection(TestConfig.getAccessToken()); String groupName = "[getCollaborationsSucceedsAndHandlesResponseCorrectly] Test Group"; BoxGroup group = BoxGroup.createGroup(api, groupName).getResource(); BoxCollaborator collabGroup = new BoxGroup(api, group.getID()); String folderName = "[getCollaborationsSucceedsAndHandlesResponseCorrectly] Test Folder"; BoxFolder rootFolder = BoxFolder.getRootFolder(api); BoxFolder folder = rootFolder.createFolder(folderName).getResource(); BoxCollaboration.Info collabInfo = folder.collaborate(collabGroup, BoxCollaboration.Role.EDITOR); Collection<BoxCollaboration.Info> collaborations = group.getCollaborations(); assertThat(collaborations, hasSize(1)); assertThat(collaborations, hasItem( Matchers.<BoxCollaboration.Info>hasProperty("ID", equalTo(collabInfo.getID()))) ); group.delete(); folder.delete(false); } }