package com.box.sdk;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import com.eclipsesource.json.JsonArray;
import com.eclipsesource.json.JsonObject;
/**
* {@link BoxWebHook} related tests.
*/
public class BoxWebHookTest {
/**
* Unit test for {@link BoxWebHook#create(BoxResource, URL, BoxWebHook.Trigger...)}
*/
@Test
@Category(UnitTest.class)
public void testCreateSendsCorrectJson() throws MalformedURLException {
final String targetID = "1";
final String targetType = "folder";
final String address = "http://box.com";
final String trigger = "FILE.UPLOADED";
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(new JSONRequestInterceptor() {
@Override
protected BoxAPIResponse onJSONRequest(BoxJSONRequest request, JsonObject json) {
Assert.assertEquals("https://api.box.com/2.0/webhooks",
request.getUrl().toString());
Assert.assertEquals(targetID, json.get("target").asObject().get("id").asString());
Assert.assertEquals(targetType, json.get("target").asObject().get("type").asString());
Assert.assertEquals(address, json.get("address").asString());
Assert.assertEquals(trigger, json.get("triggers").asArray().get(0).asString());
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"id\": \"0\"}";
}
};
}
});
BoxWebHook.create(new BoxFolder(api, "1"), new URL(address), BoxWebHook.Trigger.FILE_UPLOADED);
}
/**
* Unit test for {@link BoxWebHook#create(BoxResource, URL, BoxWebHook.Trigger...)}
*/
@Test
@Category(UnitTest.class)
public void testCreateParseAllFieldsCorrectly() throws ParseException, MalformedURLException {
final String id = "4165";
final String targetID = "5016243669";
final String targetType = "file";
final String createdByID = "2030392653";
final String createdByName = "John Q. Developer";
final String createdByLogin = "johnq@dev.name";
final Date createdAt = BoxDateFormat.parse("2016-05-09T17:41:27-07:00");
final URL address = new URL("https://dev.name/actions/file_changed");
final BoxWebHook.Trigger firstTrigger = BoxWebHook.Trigger.FILE_DOWNLOADED;
final BoxWebHook.Trigger secondTrigger = BoxWebHook.Trigger.FILE_UPLOADED;
final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n"
+ " \"id\": \"4165\",\n"
+ " \"type\": \"webhook\",\n"
+ " \"target\": {\n"
+ " \"id\": \"5016243669\",\n"
+ " \"type\": \"file\"\n"
+ " },\n"
+ " \"created_by\": {\n"
+ " \"type\": \"user\",\n"
+ " \"id\": \"2030392653\",\n"
+ " \"name\": \"John Q. Developer\",\n"
+ " \"login\": \"johnq@dev.name\"\n"
+ " },\n"
+ " \"created_at\": \"2016-05-09T17:41:27-07:00\",\n"
+ " \"address\": \"https://dev.name/actions/file_changed\",\n"
+ " \"triggers\": [\n"
+ " \"FILE.DOWNLOADED\",\n"
+ " \"FILE.UPLOADED\"\n"
+ " ]\n"
+ "}");
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse));
BoxWebHook.Info info = BoxWebHook.create(new BoxFile(api, "0"), address);
Assert.assertEquals(id, info.getID());
Assert.assertEquals(targetID, info.getTarget().getId());
Assert.assertEquals(targetType, info.getTarget().getType());
Assert.assertEquals(createdByID, info.getCreatedBy().getID());
Assert.assertEquals(createdByName, info.getCreatedBy().getName());
Assert.assertEquals(createdByLogin, info.getCreatedBy().getLogin());
Assert.assertEquals(createdAt, info.getCreatedAt());
Assert.assertEquals(address, info.getAddress());
Assert.assertEquals(true, info.getTriggers().contains(firstTrigger));
Assert.assertEquals(true, info.getTriggers().contains(secondTrigger));
}
/**
* Unit test for {@link BoxWebHook#getInfo())}
*/
@Test
@Category(UnitTest.class)
public void testGetInfoSendsCorrectRequestWithoutFields() {
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(new RequestInterceptor() {
@Override
public BoxAPIResponse onRequest(BoxAPIRequest request) {
Assert.assertEquals("https://api.box.com/2.0/webhooks/0",
request.getUrl().toString());
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"id\": \"0\"}";
}
};
}
});
BoxWebHook hook = new BoxWebHook(api, "0");
hook.getInfo();
}
/**
* Unit test for {@link BoxWebHook#getInfo(String...)}
*/
@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/webhooks/0?fields=created_at",
request.getUrl().toString());
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"id\": \"0\"}";
}
};
}
});
BoxWebHook hook = new BoxWebHook(api, "0");
hook.getInfo("created_at");
}
/**
* Unit test for {@link BoxWebHook#getInfo()}
*/
@Test
@Category(UnitTest.class)
public void testGetInfoParseAllFieldsCorrectly() throws ParseException, MalformedURLException {
final String id = "4137";
final String targetID = "5018848529";
final String targetType = "file";
final String createdByID = "2030392653";
final String createdByName = "John Q. Developer";
final String createdByLogin = "johnq@example.net";
final Date createdAt = BoxDateFormat.parse("2016-05-04T18:51:45-07:00");
final URL address = new URL("https://example.net/actions/file_changed");
final BoxWebHook.Trigger trigger = BoxWebHook.Trigger.FILE_PREVIEWED;
final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n"
+ " \"id\": \"4137\",\n"
+ " \"type\": \"webhook\",\n"
+ " \"target\": {\n"
+ " \"id\": \"5018848529\",\n"
+ " \"type\": \"file\"\n"
+ " },\n"
+ " \"created_by\": {\n"
+ " \"type\": \"user\",\n"
+ " \"id\": \"2030392653\",\n"
+ " \"name\": \"John Q. Developer\",\n"
+ " \"login\": \"johnq@example.net\"\n"
+ " },\n"
+ " \"created_at\": \"2016-05-04T18:51:45-07:00\",\n"
+ " \"address\": \"https://example.net/actions/file_changed\",\n"
+ " \"triggers\": [\n"
+ " \"FILE.PREVIEWED\"\n"
+ " ]\n"
+ "}");
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse));
BoxWebHook.Info info = new BoxWebHook(api, id).getInfo();
Assert.assertEquals(id, info.getID());
Assert.assertEquals(targetID, info.getTarget().getId());
Assert.assertEquals(targetType, info.getTarget().getType());
Assert.assertEquals(createdByID, info.getCreatedBy().getID());
Assert.assertEquals(createdByName, info.getCreatedBy().getName());
Assert.assertEquals(createdByLogin, info.getCreatedBy().getLogin());
Assert.assertEquals(createdAt, info.getCreatedAt());
Assert.assertEquals(address, info.getAddress());
Assert.assertEquals(trigger, info.getTriggers().toArray()[0]);
}
/**
* Unit test for {@link BoxWebHook#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/webhooks/0",
request.getUrl().toString());
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"id\": \"0\"}";
}
};
}
});
BoxWebHook hook = new BoxWebHook(api, "0");
hook.delete();
}
/**
* Unit test for {@link BoxWebHook#all(BoxAPIConnection)}
*/
@Test
@Category(UnitTest.class)
public void testAllSendsCorrectRequestWithoutParams() {
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(new RequestInterceptor() {
@Override
public BoxAPIResponse onRequest(BoxAPIRequest request) {
Assert.assertEquals("https://api.box.com/2.0/webhooks?limit=64",
request.getUrl().toString());
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"entries\": []}";
}
};
}
});
Iterator<BoxWebHook.Info> iterator = BoxWebHook.all(api).iterator();
iterator.hasNext();
}
/**
* Unit test for {@link BoxWebHook#all(BoxAPIConnection, String...)}
*/
@Test
@Category(UnitTest.class)
public void testAllSendsCorrectRequestWithFields() {
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(new RequestInterceptor() {
@Override
public BoxAPIResponse onRequest(BoxAPIRequest request) {
Assert.assertEquals("https://api.box.com/2.0/webhooks?fields=created_at%2Ccreated_by&limit=64",
request.getUrl().toString());
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"entries\": []}";
}
};
}
});
Iterator<BoxWebHook.Info> iterator = BoxWebHook.all(api, "created_at", "created_by").iterator();
iterator.hasNext();
}
/**
* Unit test for {@link BoxWebHook#all(BoxAPIConnection)}
*/
@Test
@Category(UnitTest.class)
public void testAllParseAllFieldsCorrectly() {
final String firstID = "4161";
final String firstTargetID = "5018326685";
final String firstTargetType = "folder";
final String secondID = "4165";
final String secondTargetID = "5016243669";
final String secondTargerType = "file";
final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n"
+ " \"entries\": [\n"
+ " {\n"
+ " \"id\": \"4161\",\n"
+ " \"type\": \"webhook\",\n"
+ " \"target\": {\n"
+ " \"id\": \"5018326685\",\n"
+ " \"type\": \"folder\"\n"
+ " }\n"
+ " },\n"
+ " {\n"
+ " \"id\": \"4165\",\n"
+ " \"type\": \"webhook\",\n"
+ " \"target\": {\n"
+ " \"id\": \"5016243669\",\n"
+ " \"type\": \"file\"\n"
+ " }\n"
+ " }\n"
+ " ],\n"
+ " \"limit\": 3\n"
+ "}");
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse));
Iterator<BoxWebHook.Info> iterator = BoxWebHook.all(api).iterator();
BoxWebHook.Info info = iterator.next();
Assert.assertEquals(firstID, info.getID());
Assert.assertEquals(firstTargetID, info.getTarget().getId());
Assert.assertEquals(firstTargetType, info.getTarget().getType());
info = iterator.next();
Assert.assertEquals(secondID, info.getID());
Assert.assertEquals(secondTargetID, info.getTarget().getId());
Assert.assertEquals(secondTargerType, info.getTarget().getType());
Assert.assertEquals(false, iterator.hasNext());
}
/**
* Unit test for {@link BoxWebHook#updateInfo(BoxWebHook.Info)}
*/
@Test
@Category(UnitTest.class)
public void testUpdateSendCorrectJSON() {
final String address = "";
final String firstTrigger = "FILE.PREVIEWED";
final String secondTrigger = "FILE.DOWNLOADED";
final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n"
+ " \"id\": \"4137\",\n"
+ " \"type\": \"webhook\",\n"
+ " \"target\": {\n"
+ " \"id\": \"5018848529\",\n"
+ " \"type\": \"file\"\n"
+ " }\n"
+ "}");
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse));
BoxWebHook hook = new BoxWebHook(api, "0");
BoxWebHook.Info info = hook.new Info();
api.setRequestInterceptor(new JSONRequestInterceptor() {
@Override
protected BoxAPIResponse onJSONRequest(BoxJSONRequest request, JsonObject json) {
Assert.assertEquals("https://api.box.com/2.0/webhooks/0",
request.getUrl().toString());
Assert.assertEquals(address, json.get("address").asString());
Assert.assertEquals(firstTrigger, json.get("triggers").asArray().get(0).asString());
Assert.assertEquals(secondTrigger, json.get("triggers").asArray().get(1).asString());
return new BoxJSONResponse() {
@Override
public String getJSON() {
return "{\"id\": \"0\"}";
}
};
}
});
info.addPendingChange("address", address);
info.addPendingChange("triggers", new JsonArray().add(firstTrigger).add(secondTrigger));
hook.updateInfo(info);
}
/**
* Unit test for {@link BoxWebHook#updateInfo(BoxWebHook.Info)}
*/
@Test
@Category(UnitTest.class)
public void testUpdateParseAllFieldsCorrectly() throws ParseException, MalformedURLException {
final String id = "4133";
final String targetID = "1000605797";
final String targetType = "folder";
final String createdByID = "2030392653";
final String createdByName = "John Q. Developer";
final String createdByLogin = "john2@example.net";
final Date createdAt = BoxDateFormat.parse("2016-05-04T18:51:17-07:00");
final URL address = new URL("https://notification.example.net");
final BoxWebHook.Trigger firstTrigger = BoxWebHook.Trigger.FILE_PREVIEWED;
final BoxWebHook.Trigger secondTrigger = BoxWebHook.Trigger.FILE_DOWNLOADED;
final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n"
+ " \"id\": \"4133\",\n"
+ " \"type\": \"webhook\",\n"
+ " \"target\": {\n"
+ " \"id\": \"1000605797\",\n"
+ " \"type\": \"folder\"\n"
+ " },\n"
+ " \"created_by\": {\n"
+ " \"type\": \"user\",\n"
+ " \"id\": \"2030392653\",\n"
+ " \"name\": \"John Q. Developer\",\n"
+ " \"login\": \"john2@example.net\"\n"
+ " },\n"
+ " \"created_at\": \"2016-05-04T18:51:17-07:00\",\n"
+ " \"address\": \"https://notification.example.net\",\n"
+ " \"triggers\": [\n"
+ " \"FILE.PREVIEWED\", \"FILE.DOWNLOADED\"\n"
+ " ]\n"
+ "}");
BoxAPIConnection api = new BoxAPIConnection("");
api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse));
BoxWebHook hook = new BoxWebHook(api, id);
BoxWebHook.Info info = hook.new Info();
info.addPendingChange("address", "fake pending change");
hook.updateInfo(info);
Assert.assertEquals(id, info.getID());
Assert.assertEquals(targetID, info.getTarget().getId());
Assert.assertEquals(targetType, info.getTarget().getType());
Assert.assertEquals(createdByID, info.getCreatedBy().getID());
Assert.assertEquals(createdByName, info.getCreatedBy().getName());
Assert.assertEquals(createdByLogin, info.getCreatedBy().getLogin());
Assert.assertEquals(createdAt, info.getCreatedAt());
Assert.assertEquals(address, info.getAddress());
Assert.assertEquals(true, info.getTriggers().contains(firstTrigger));
Assert.assertEquals(true, info.getTriggers().contains(secondTrigger));
}
@Test
@Category(IntegrationTest.class)
public void createWebHookFileSucceeds() throws IOException {
BoxAPIConnection api = new BoxAPIConnection(TestConfig.getAccessToken());
BoxFolder rootFolder = BoxFolder.getRootFolder(api);
String fileName = "[createWebhook] Test File.txt";
byte[] fileBytes = "Non-empty string".getBytes(StandardCharsets.UTF_8);
InputStream uploadStream = new ByteArrayInputStream(fileBytes);
BoxFile uploadedFile = rootFolder.uploadFile(uploadStream, fileName).getResource();
try {
URL address = new URL("https://www.google.com");
BoxWebHook.Info info = BoxWebHook.create(uploadedFile, address,
BoxWebHook.Trigger.FILE_PREVIEWED, BoxWebHook.Trigger.FILE_LOCKED);
assertThat(info.getID(), is(notNullValue()));
assertThat(info.getAddress(), is(equalTo(address)));
assertThat(info.getTarget().getType(), is(equalTo(BoxResource.getResourceType(BoxFile.class))));
assertThat(info.getTarget().getId(), is(equalTo(uploadedFile.getID())));
assertThat(info.getTriggers(), is(equalTo(this.toSet(
new BoxWebHook.Trigger[] {BoxWebHook.Trigger.FILE_PREVIEWED, BoxWebHook.Trigger.FILE_LOCKED }))));
info.getResource().delete();
} finally {
uploadedFile.delete();
}
}
@Test
@Category(IntegrationTest.class)
public void createWebHookFolderSucceeds() throws IOException {
BoxAPIConnection api = new BoxAPIConnection(TestConfig.getAccessToken());
BoxFolder rootFolder = BoxFolder.getRootFolder(api);
String folderName = "[createWebhook] Folder";
BoxFolder folder = rootFolder.createFolder(folderName).getResource();
try {
URL address = new URL("https://www.google.com");
BoxWebHook.Info info = BoxWebHook.create(folder, address,
BoxWebHook.Trigger.FOLDER_DOWNLOADED, BoxWebHook.Trigger.FOLDER_COPIED);
assertThat(info.getID(), is(notNullValue()));
assertThat(info.getAddress(), is(equalTo(address)));
assertThat(info.getTarget().getType(), is(equalTo(BoxResource.getResourceType(BoxFolder.class))));
assertThat(info.getTarget().getId(), is(equalTo(folder.getID())));
assertThat(info.getTriggers(), is(equalTo(this.toSet(new BoxWebHook.Trigger[] {
BoxWebHook.Trigger.FOLDER_COPIED, BoxWebHook.Trigger.FOLDER_DOWNLOADED }))));
info.getResource().delete();
} finally {
folder.delete(true);
}
}
@Test
@Category(IntegrationTest.class)
public void listWebHooksSucceeds() throws IOException {
BoxAPIConnection api = new BoxAPIConnection(TestConfig.getAccessToken());
BoxFolder rootFolder = BoxFolder.getRootFolder(api);
String fileName = "[listWebhooks] Test File.txt";
byte[] fileBytes = "Non-empty string".getBytes(StandardCharsets.UTF_8);
InputStream uploadStream = new ByteArrayInputStream(fileBytes);
BoxFile uploadedFile = rootFolder.uploadFile(uploadStream, fileName).getResource();
try {
URL address = new URL("https://www.google.com");
BoxWebHook.Info info = BoxWebHook.create(uploadedFile, address, BoxWebHook.Trigger.FILE_PREVIEWED);
Iterable<BoxWebHook.Info> webhooks = BoxWebHook.all(api);
assertThat(webhooks, hasItem(Matchers.<BoxWebHook.Info>hasProperty("ID", equalTo(info.getID()))));
info.getResource().delete();
webhooks = BoxWebHook.all(api);
assertThat(webhooks, not(hasItem(Matchers.<BoxWebHook.Info>hasProperty("ID", equalTo(info.getID())))));
} finally {
uploadedFile.delete();
}
}
@Test
@Category(IntegrationTest.class)
public void updateWebHookInfoSucceeds() throws IOException {
BoxAPIConnection api = new BoxAPIConnection(TestConfig.getAccessToken());
BoxFolder rootFolder = BoxFolder.getRootFolder(api);
String fileName = "[updateWebHookInfoSucceeds] Test File.txt";
byte[] fileBytes = "Non-empty string".getBytes(StandardCharsets.UTF_8);
InputStream uploadStream = new ByteArrayInputStream(fileBytes);
BoxFile uploadedFile = rootFolder.uploadFile(uploadStream, fileName).getResource();
try {
URL address = new URL("https://www.google.com");
BoxWebHook webHook = BoxWebHook.create(uploadedFile, address,
BoxWebHook.Trigger.FILE_PREVIEWED, BoxWebHook.Trigger.FILE_LOCKED).getResource();
URL newAddress = new URL("https://www.yahoo.com");
BoxWebHook.Info newInfo = webHook.new Info();
newInfo.setTriggers(BoxWebHook.Trigger.FILE_UNLOCKED);
newInfo.setAddress(newAddress);
webHook.updateInfo(newInfo);
assertThat(newInfo.getAddress(), is(equalTo(newAddress)));
assertThat(newInfo.getTriggers(), is(equalTo(
this.toSet(new BoxWebHook.Trigger[]{BoxWebHook.Trigger.FILE_UNLOCKED})
)));
webHook.delete();
} finally {
uploadedFile.delete();
}
}
private <T> Set<T> toSet(T[] values) {
return new HashSet<T>(Arrays.asList(values));
}
}