package com.box.sdk;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import org.junit.Assert;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import com.eclipsesource.json.JsonObject;
/**
* {@link BoxTask} related tests.
*/
public class BoxTaskTest {
/**
* Unit test for {@link BoxTask#getInfo()}
*/
@Test
@Category(UnitTest.class)
public void testGetInfoSendsCorrectRequest() {
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(new RequestInterceptor() {
@Override
public BoxAPIResponse onRequest(BoxAPIRequest request) {
Assert.assertEquals("https://api.box.com/2.0/tasks/0",
request.getUrl().toString());
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"id\": \"0\"}";
}
};
}
});
new BoxTask(api, "0").getInfo();
}
/**
* Unit test for {@link BoxTask#getInfo(String...)}
*/
@Test
@Category(UnitTest.class)
public void testGetInfoSendsCorrectRequestWithFields() {
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(new RequestInterceptor() {
@Override
public BoxAPIResponse onRequest(BoxAPIRequest request) {
Assert.assertEquals("https://api.box.com/2.0/tasks/0?fields=item%2Cdue_at",
request.getUrl().toString());
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"id\": \"0\"}";
}
};
}
});
new BoxTask(api, "0").getInfo("item", "due_at");
}
/**
* Unit test for {@link BoxTask#getInfo()}
*/
@Test
@Category(UnitTest.class)
public void testGetInfoParseAllFieldsCorrectly() throws ParseException {
final String id = "1839355";
final String itemID = "7287087200";
final String itemSequenceID = "0";
final String itemEtag = "0";
final String itemSha1 = "0bbd79a105c504f99573e3799756debba4c760cd";
final String itemName = "box-logo.png";
final Date dueAt = BoxDateFormat.parse("2014-04-03T11:09:43-07:00");
final BoxTask.Action action = BoxTask.Action.REVIEW;
final String message = "REVIEW PLZ K THX";
final int assignmentCount = 0;
final boolean isCompleted = false;
final String createdByID = "11993747";
final String createdByName = "sean";
final String createdByLogin = "sean@box.com";
final Date createdAt = BoxDateFormat.parse("2013-04-03T11:12:54-07:00");
final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n"
+ " \"type\": \"task\",\n"
+ " \"id\": \"1839355\",\n"
+ " \"item\": {\n"
+ " \"type\": \"file\",\n"
+ " \"id\": \"7287087200\",\n"
+ " \"sequence_id\": \"0\",\n"
+ " \"etag\": \"0\",\n"
+ " \"sha1\": \"0bbd79a105c504f99573e3799756debba4c760cd\",\n"
+ " \"name\": \"box-logo.png\"\n"
+ " },\n"
+ " \"due_at\": \"2014-04-03T11:09:43-07:00\",\n"
+ " \"action\": \"review\",\n"
+ " \"message\": \"REVIEW PLZ K THX\",\n"
+ " \"task_assignment_collection\": {\n"
+ " \"total_count\": 0,\n"
+ " \"entries\": []\n"
+ " },\n"
+ " \"is_completed\": false,\n"
+ " \"created_by\": {\n"
+ " \"type\": \"user\",\n"
+ " \"id\": \"11993747\",\n"
+ " \"name\": \"sean\",\n"
+ " \"login\": \"sean@box.com\"\n"
+ " },\n"
+ " \"created_at\": \"2013-04-03T11:12:54-07:00\"\n"
+ "}");
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse));
BoxTask.Info info = new BoxTask(api, id).getInfo();
Assert.assertEquals(id, info.getID());
Assert.assertEquals(itemID, info.getItem().getID());
Assert.assertEquals(itemSequenceID, info.getItem().getSequenceID());
Assert.assertEquals(itemEtag, info.getItem().getEtag());
Assert.assertEquals(itemSha1, info.getItem().getSha1());
Assert.assertEquals(itemName, info.getItem().getName());
Assert.assertEquals(dueAt, info.getDueAt());
Assert.assertEquals(action, info.getAction());
Assert.assertEquals(message, info.getMessage());
Assert.assertEquals(assignmentCount, info.getTaskAssignments().size());
Assert.assertEquals(isCompleted, info.isCompleted());
Assert.assertEquals(createdByID, info.getCreatedBy().getID());
Assert.assertEquals(createdByName, info.getCreatedBy().getName());
Assert.assertEquals(createdByLogin, info.getCreatedBy().getLogin());
Assert.assertEquals(createdAt, info.getCreatedAt());
}
/**
* Unit test for {@link BoxTask#updateInfo(BoxTask.Info)}
*/
@Test
@Category(UnitTest.class)
public void testUpdateInfoSendsCorrectJson() throws ParseException {
final String action = "review";
final String message = "text message";
final Date dueAt = BoxDateFormat.parse("2016-05-09T17:41:27-07:00");
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(new JSONRequestInterceptor() {
@Override
protected BoxAPIResponse onJSONRequest(BoxJSONRequest request, JsonObject json) {
Assert.assertEquals("https://api.box.com/2.0/tasks/0",
request.getUrl().toString());
Assert.assertEquals(action, json.get("action").asString());
Assert.assertEquals(message, json.get("message").asString());
try {
Assert.assertEquals(dueAt, BoxDateFormat.parse(json.get("due_at").asString()));
} catch (ParseException e) {
assert false;
}
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"id\": \"0\"}";
}
};
}
});
BoxTask task = new BoxTask(api, "0");
BoxTask.Info info = task.new Info();
info.addPendingChange("message", message);
info.addPendingChange("action", action);
info.addPendingChange("due_at", BoxDateFormat.format(dueAt));
task.updateInfo(info);
}
/**
* Unit test for {@link BoxTask#updateInfo(BoxTask.Info)}
*/
@Test
@Category(UnitTest.class)
public void testUpdateInfoParseAllFieldsCorrectly() throws ParseException {
final String id = "1839355";
final String itemID = "7287087200";
final String itemSequenceID = "0";
final String itemEtag = "0";
final String itemSha1 = "0bbd79a105c504f99573e3799756debba4c760cd";
final String itemName = "box-logo.png";
final Date dueAt = BoxDateFormat.parse("2014-04-03T11:09:43-07:00");
final BoxTask.Action action = BoxTask.Action.REVIEW;
final String message = "REVIEW PLZ K THX";
final int assignmentCount = 0;
final boolean isCompleted = false;
final String createdByID = "11993747";
final String createdByName = "sean";
final String createdByLogin = "sean@box.com";
final Date createdAt = BoxDateFormat.parse("2013-04-03T11:12:54-07:00");
final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n"
+ " \"type\": \"task\",\n"
+ " \"id\": \"1839355\",\n"
+ " \"item\": {\n"
+ " \"type\": \"file\",\n"
+ " \"id\": \"7287087200\",\n"
+ " \"sequence_id\": \"0\",\n"
+ " \"etag\": \"0\",\n"
+ " \"sha1\": \"0bbd79a105c504f99573e3799756debba4c760cd\",\n"
+ " \"name\": \"box-logo.png\"\n"
+ " },\n"
+ " \"due_at\": \"2014-04-03T11:09:43-07:00\",\n"
+ " \"action\": \"review\",\n"
+ " \"message\": \"REVIEW PLZ K THX\",\n"
+ " \"task_assignment_collection\": {\n"
+ " \"total_count\": 0,\n"
+ " \"entries\": []\n"
+ " },\n"
+ " \"is_completed\": false,\n"
+ " \"created_by\": {\n"
+ " \"type\": \"user\",\n"
+ " \"id\": \"11993747\",\n"
+ " \"name\": \"sean\",\n"
+ " \"login\": \"sean@box.com\"\n"
+ " },\n"
+ " \"created_at\": \"2013-04-03T11:12:54-07:00\"\n"
+ "}");
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse));
BoxTask task = new BoxTask(api, id);
BoxTask.Info info = task.new Info();
info.addPendingChange("message", message);
task.updateInfo(info);
Assert.assertEquals(id, info.getID());
Assert.assertEquals(itemID, info.getItem().getID());
Assert.assertEquals(itemSequenceID, info.getItem().getSequenceID());
Assert.assertEquals(itemEtag, info.getItem().getEtag());
Assert.assertEquals(itemSha1, info.getItem().getSha1());
Assert.assertEquals(itemName, info.getItem().getName());
Assert.assertEquals(dueAt, info.getDueAt());
Assert.assertEquals(action, info.getAction());
Assert.assertEquals(message, info.getMessage());
Assert.assertEquals(assignmentCount, info.getTaskAssignments().size());
Assert.assertEquals(isCompleted, info.isCompleted());
Assert.assertEquals(createdByID, info.getCreatedBy().getID());
Assert.assertEquals(createdByName, info.getCreatedBy().getName());
Assert.assertEquals(createdByLogin, info.getCreatedBy().getLogin());
Assert.assertEquals(createdAt, info.getCreatedAt());
}
/**
* Unit test for {@link BoxTask#delete()}
*/
@Test
@Category(UnitTest.class)
public void testDeleteSendsCorrectRequest() {
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(new RequestInterceptor() {
@Override
public BoxAPIResponse onRequest(BoxAPIRequest request) {
Assert.assertEquals("https://api.box.com/2.0/tasks/0",
request.getUrl().toString());
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"id\": \"0\"}";
}
};
}
});
new BoxTask(api, "0").delete();
}
/**
* Unit test for {@link BoxTask#addAssignmentByLogin(String)}
*/
@Test
@Category(UnitTest.class)
public void testAddAssignmentByLoginSendsCorrectJson() {
final String taskType = "task";
final String taskID = "0";
final String assignToLogin = "login@somewhere.com";
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(new JSONRequestInterceptor() {
@Override
protected BoxAPIResponse onJSONRequest(BoxJSONRequest request, JsonObject json) {
Assert.assertEquals("https://api.box.com/2.0/task_assignments",
request.getUrl().toString());
Assert.assertEquals(taskType, json.get("task").asObject().get("type").asString());
Assert.assertEquals(taskID, json.get("task").asObject().get("id").asString());
Assert.assertEquals(assignToLogin, json.get("assign_to").asObject().get("login").asString());
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"id\": \"0\"}";
}
};
}
});
new BoxTask(api, taskID).addAssignmentByLogin(assignToLogin);
}
/**
* Unit test for {@link BoxTask#addAssignment(BoxUser)}
*/
@Test
@Category(UnitTest.class)
public void testAddAssignmentSendsCorrectJson() {
final String taskType = "task";
final String taskID = "0";
final String assignToID = "1";
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(new JSONRequestInterceptor() {
@Override
protected BoxAPIResponse onJSONRequest(BoxJSONRequest request, JsonObject json) {
Assert.assertEquals("https://api.box.com/2.0/task_assignments",
request.getUrl().toString());
Assert.assertEquals(taskType, json.get("task").asObject().get("type").asString());
Assert.assertEquals(taskID, json.get("task").asObject().get("id").asString());
Assert.assertEquals(assignToID, json.get("assign_to").asObject().get("id").asString());
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"id\": \"0\"}";
}
};
}
});
BoxUser user = new BoxUser(api, assignToID);
new BoxTask(api, taskID).addAssignment(user);
}
/**
* Unit test for {@link BoxTask#addAssignment(BoxUser)}
*/
@Test
@Category(UnitTest.class)
public void testAddAssignmentParseAllFieldsCorrectly() throws ParseException {
final String id = "2698512";
final String itemID = "8018809384";
final String itemSequenceID = "0";
final String itemEtag = "0";
final String itemSha1 = "7840095ee096ee8297676a138d4e316eabb3ec96";
final String itemName = "scrumworksToTrello.js";
final String assignedToID = "1992432";
final String assignedToName = "rhaegar@box.com";
final String assignedToLogin = "rhaegar@box.com";
final String message = null;
final Date completedAt = null;
final Date assignedAt = BoxDateFormat.parse("2013-05-10T11:43:41-07:00");
final Date remindedAt = null;
final BoxTaskAssignment.ResolutionState resolutionState = BoxTaskAssignment.ResolutionState.INCOMPLETE;
final String assignedByID = "11993747";
final String assignedByName = "sean";
final String assignedByLogin = "sean@box.com";
final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n"
+ " \"type\": \"task_assignment\",\n"
+ " \"id\": \"2698512\",\n"
+ " \"item\": {\n"
+ " \"type\": \"file\",\n"
+ " \"id\": \"8018809384\",\n"
+ " \"sequence_id\": \"0\",\n"
+ " \"etag\": \"0\",\n"
+ " \"sha1\": \"7840095ee096ee8297676a138d4e316eabb3ec96\",\n"
+ " \"name\": \"scrumworksToTrello.js\"\n"
+ " },\n"
+ " \"assigned_to\": {\n"
+ " \"type\": \"user\",\n"
+ " \"id\": \"1992432\",\n"
+ " \"name\": \"rhaegar@box.com\",\n"
+ " \"login\": \"rhaegar@box.com\"\n"
+ " },\n"
+ " \"message\": null,\n"
+ " \"completed_at\": null,\n"
+ " \"assigned_at\": \"2013-05-10T11:43:41-07:00\",\n"
+ " \"reminded_at\": null,\n"
+ " \"resolution_state\": \"incomplete\",\n"
+ " \"assigned_by\": {\n"
+ " \"type\": \"user\",\n"
+ " \"id\": \"11993747\",\n"
+ " \"name\": \"sean\",\n"
+ " \"login\": \"sean@box.com\"\n"
+ " }\n"
+ "}");
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse));
BoxUser user = new BoxUser(api, assignedToID);
BoxTaskAssignment.Info info = new BoxTask(api, id).addAssignment(user);
Assert.assertEquals(id, info.getID());
Assert.assertEquals(itemID, info.getItem().getID());
Assert.assertEquals(itemSequenceID, info.getItem().getSequenceID());
Assert.assertEquals(itemEtag, info.getItem().getEtag());
Assert.assertEquals(itemSha1, ((BoxFile.Info) info.getItem()).getSha1());
Assert.assertEquals(itemName, info.getItem().getName());
Assert.assertEquals(assignedToID, info.getAssignedTo().getID());
Assert.assertEquals(assignedToName, info.getAssignedTo().getName());
Assert.assertEquals(assignedToLogin, info.getAssignedTo().getLogin());
Assert.assertEquals(message, info.getMessage());
Assert.assertEquals(completedAt, info.getCompletedAt());
Assert.assertEquals(assignedAt, info.getAssignedAt());
Assert.assertEquals(remindedAt, info.getRemindedAt());
Assert.assertEquals(resolutionState, info.getResolutionState());
Assert.assertEquals(assignedByID, info.getAssignedBy().getID());
Assert.assertEquals(assignedByName, info.getAssignedBy().getName());
Assert.assertEquals(assignedByLogin, info.getAssignedBy().getLogin());
}
/**
* Unit test for {@link BoxTask#getAllAssignments(String...)}
*/
@Test
@Category(UnitTest.class)
public void testGetAllAssignmentsSendsCorrectRequest() {
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(new RequestInterceptor() {
@Override
public BoxAPIResponse onRequest(BoxAPIRequest request) {
Assert.assertEquals(
"https://api.box.com/2.0/tasks/0/assignments?fields=item%2Cmessage&limit=100&offset=0",
request.getUrl().toString());
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"total_count\": 1, \"offset\": 0, \"entries\":[]}";
}
};
}
});
Iterator<BoxTaskAssignment.Info> iterator
= new BoxTask(api, "0").getAllAssignments("item", "message").iterator();
iterator.hasNext();
}
/**
* Unit test for {@link BoxTask#getAllAssignments(String...)}
*/
@Test
@Category(UnitTest.class)
public void testGetAllAssignmentsParseAllFieldsCorrectly() {
final String firstId = "2485961";
final String firstItemID = "7287087200";
final String firstItemSequenceID = "0";
final String firstItemEtag = "0";
final String firstItemSha1 = "0bbd79a105c504f99573e3799756debba4c760cd";
final String firstItemName = "box-logo.png";
final String firstAssignedToID = "193425559";
final String firstAssignedToName = "Rhaegar Targaryen";
final String firstAssignedToLogin = "rhaegar@box.com";
final String secondId = "2485963";
final String secondItemID = "7287087204";
final String secondItemSequenceID = "1";
final String secondItemEtag = "1";
final String secondItemSha1 = "0bbd79a105c504f99573e3799756debb";
final String secondItemName = "box-icon.png";
final String secondAssignedToID = "1934255";
final String secondAssignedToName = "Tyrion Lannister";
final String secondAssignedToLogin = "littlebig@box.com";
final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n"
+ " \"total_count\": 2,\n"
+ " \"offset\": 0,\n"
+ " \"entries\": [\n"
+ " {\n"
+ " \"type\": \"task_assignment\",\n"
+ " \"id\": \"2485961\",\n"
+ " \"item\": {\n"
+ " \"type\": \"file\",\n"
+ " \"id\": \"7287087200\",\n"
+ " \"sequence_id\": \"0\",\n"
+ " \"etag\": \"0\",\n"
+ " \"sha1\": \"0bbd79a105c504f99573e3799756debba4c760cd\",\n"
+ " \"name\": \"box-logo.png\"\n"
+ " },\n"
+ " \"assigned_to\": {\n"
+ " \"type\": \"user\",\n"
+ " \"id\": \"193425559\",\n"
+ " \"name\": \"Rhaegar Targaryen\",\n"
+ " \"login\": \"rhaegar@box.com\"\n"
+ " }\n"
+ " },\n"
+ " {\n"
+ " \"type\": \"task_assignment\",\n"
+ " \"id\": \"2485963\",\n"
+ " \"item\": {\n"
+ " \"type\": \"file\",\n"
+ " \"id\": \"7287087204\",\n"
+ " \"sequence_id\": \"1\",\n"
+ " \"etag\": \"1\",\n"
+ " \"sha1\": \"0bbd79a105c504f99573e3799756debb\",\n"
+ " \"name\": \"box-icon.png\"\n"
+ " },\n"
+ " \"assigned_to\": {\n"
+ " \"type\": \"user\",\n"
+ " \"id\": \"1934255\",\n"
+ " \"name\": \"Tyrion Lannister\",\n"
+ " \"login\": \"littlebig@box.com\"\n"
+ " }\n"
+ " }\n"
+ " ]\n"
+ "}");
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse));
Iterator<BoxTaskAssignment.Info> iterator = new BoxTask(api, "0").getAllAssignments().iterator();
BoxTaskAssignment.Info info = iterator.next();
Assert.assertEquals(firstId, info.getID());
Assert.assertEquals(firstItemID, info.getItem().getID());
Assert.assertEquals(firstItemSequenceID, info.getItem().getSequenceID());
Assert.assertEquals(firstItemEtag, info.getItem().getEtag());
Assert.assertEquals(firstItemSha1, ((BoxFile.Info) info.getItem()).getSha1());
Assert.assertEquals(firstItemName, info.getItem().getName());
Assert.assertEquals(firstAssignedToID, info.getAssignedTo().getID());
Assert.assertEquals(firstAssignedToName, info.getAssignedTo().getName());
Assert.assertEquals(firstAssignedToLogin, info.getAssignedTo().getLogin());
info = iterator.next();
Assert.assertEquals(secondId, info.getID());
Assert.assertEquals(secondItemID, info.getItem().getID());
Assert.assertEquals(secondItemSequenceID, info.getItem().getSequenceID());
Assert.assertEquals(secondItemEtag, info.getItem().getEtag());
Assert.assertEquals(secondItemSha1, ((BoxFile.Info) info.getItem()).getSha1());
Assert.assertEquals(secondItemName, info.getItem().getName());
Assert.assertEquals(secondAssignedToID, info.getAssignedTo().getID());
Assert.assertEquals(secondAssignedToName, info.getAssignedTo().getName());
Assert.assertEquals(secondAssignedToLogin, info.getAssignedTo().getLogin());
Assert.assertEquals(false, iterator.hasNext());
}
@Test
@Category(IntegrationTest.class)
public void updateInfoSucceeds() {
BoxAPIConnection api = new BoxAPIConnection(TestConfig.getAccessToken());
BoxFolder rootFolder = BoxFolder.getRootFolder(api);
String fileName = "[updateInfoSucceeds] Test File.txt";
byte[] fileBytes = "Non-empty string".getBytes(StandardCharsets.UTF_8);
String originalMessage = "Original message";
String changedMessage = "Changed message";
InputStream uploadStream = new ByteArrayInputStream(fileBytes);
BoxFile uploadedFile = rootFolder.uploadFile(uploadStream, fileName).getResource();
Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
calendar.add(Calendar.DATE, 1);
Date dueAt = calendar.getTime();
BoxTask.Info taskInfo = uploadedFile.addTask(BoxTask.Action.REVIEW, originalMessage, dueAt);
BoxTask task = taskInfo.getResource();
taskInfo.setMessage(changedMessage);
taskInfo.setDueAt(dueAt);
task.updateInfo(taskInfo);
assertThat(taskInfo.getMessage(), is(equalTo(changedMessage)));
assertThat(taskInfo.getDueAt(), is(equalTo(dueAt)));
uploadedFile.delete();
}
}