package com.belladati.sdk.dashboard.impl;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotEquals;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertSame;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Calendar;
import java.util.Collections;
import java.util.TimeZone;
import org.apache.http.entity.InputStreamEntity;
import org.testng.annotations.Test;
import com.belladati.sdk.dashboard.Dashboard;
import com.belladati.sdk.dashboard.DashboardInfo;
import com.belladati.sdk.dashboard.impl.DashboardImpl;
import com.belladati.sdk.dashboard.impl.DashboardInfoImpl;
import com.belladati.sdk.exception.server.InvalidStreamException;
import com.belladati.sdk.test.SDKTest;
import com.belladati.sdk.test.TestRequestHandler;
import com.belladati.sdk.util.PaginatedList;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* Tests behavior related to dashboards.
*
* @author Chris Hennigfeld
*/
@Test
public class DashboardsTest extends SDKTest {
private final String dashboardsUri = "/api/dashboards";
private final String id = "123";
private final String name = "dashboard name";
private final String lastChange = "Mon, 16 Apr 2012 10:17:26 GMT";
/** Regular dashboard info data is loaded correctly. */
public void loadDashboardInfo() {
PaginatedList<DashboardInfo> dashboardInfos = service.getDashboardInfo();
registerSingleDashboard(builder.buildDashboardNode(id, name, lastChange));
dashboardInfos.load();
server.assertRequestUris(dashboardsUri);
assertEquals(dashboardInfos.size(), 1);
DashboardInfo info = dashboardInfos.get(0);
assertEquals(info.getId(), id);
assertEquals(info.getName(), name);
Calendar expectedChange = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
expectedChange.set(2012, 3, 16, 10, 17, 26);
expectedChange.set(Calendar.MILLISECOND, 0);
assertEquals(info.getLastChange(), expectedChange.getTime());
assertEquals(info.toString(), name);
}
/** Dashboard last change may be null. */
public void infoNullLastChange() {
registerSingleDashboard(builder.buildDashboardNode(id, name, null));
assertNull(service.getDashboardInfo().load().get(0).getLastChange());
}
/** Dashboard last change may be missing. */
public void infoWithoutLastChange() {
ObjectNode node = builder.buildDashboardNode(id, name, lastChange);
node.remove("lastChange");
registerSingleDashboard(node);
assertNull(service.getDashboardInfo().load().get(0).getLastChange());
}
/** Dashboard last change may be invalid format. */
public void infoInvalidLastChange() {
registerSingleDashboard(builder.buildDashboardNode(id, name, "something invalid"));
assertNull(service.getDashboardInfo().load().get(0).getLastChange());
}
/** Getting a dashboard info list multiple times returns the same list. */
public void dashboardInfoListSame() {
assertSame(service.getDashboardInfo(), service.getDashboardInfo());
}
/** Individual dashboard can be loaded by ID through service. */
public void loadDashboard() {
server.register(dashboardsUri + "/" + id, builder.buildDashboardNode(id, name, lastChange).toString());
Dashboard dashboard = service.loadDashboard(id);
server.assertRequestUris(dashboardsUri + "/" + id);
assertEquals(dashboard.getId(), id);
assertEquals(dashboard.getName(), name);
Calendar expectedChange = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
expectedChange.set(2012, 3, 16, 10, 17, 26);
expectedChange.set(Calendar.MILLISECOND, 0);
assertEquals(dashboard.getLastChange(), expectedChange.getTime());
assertEquals(dashboard.getDashlets(), Collections.emptyList());
assertEquals(dashboard.toString(), name);
}
/** Dashboard last change may be null. */
public void dashboardNullLastChange() {
server.register(dashboardsUri + "/" + id, builder.buildDashboardNode(id, name, null).toString());
Dashboard dashboard = service.loadDashboard(id);
assertNull(dashboard.getLastChange());
}
/** Dashboard last change may be missing. */
public void dashboardWithoutLastChange() {
ObjectNode node = builder.buildDashboardNode(id, name, lastChange);
node.remove("lastChange");
server.register(dashboardsUri + "/" + id, node.toString());
Dashboard dashboard = service.loadDashboard(id);
assertNull(dashboard.getLastChange());
}
/** Dashboard last change may be invalid format. */
public void dashboardInvalidLastChange() {
server.register(dashboardsUri + "/" + id, builder.buildDashboardNode(id, name, "something invalid").toString());
Dashboard dashboard = service.loadDashboard(id);
assertNull(dashboard.getLastChange());
}
/** Dashboard can be loaded from a dashboard info object. */
public void loadDashboardFromInfo() {
String idDash = "id2";
String nameDash = "name2";
String lastChangeDash = "Tue, 17 Apr 2012 11:18:27 GMT";
registerSingleDashboard(builder.buildDashboardNode(id, name, lastChange));
server.register(dashboardsUri + "/" + id, builder.buildDashboardNode(idDash, nameDash, lastChangeDash).toString());
Dashboard dashboard = service.getDashboardInfo().load().get(0).loadDetails();
assertEquals(dashboard.getId(), idDash);
assertEquals(dashboard.getName(), nameDash);
Calendar expectedChange = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
expectedChange.set(2012, 3, 17, 11, 18, 27);
expectedChange.set(Calendar.MILLISECOND, 0);
assertEquals(dashboard.getLastChange(), expectedChange.getTime());
assertEquals(dashboard.getDashlets(), Collections.emptyList());
}
/** Can load a dashboard thumbnail from service. */
public void loadThumbnailFromService() {
server.register(dashboardsUri + "/" + id + "/thumbnail", new TestRequestHandler() {
@Override
protected void handle(HttpHolder holder) throws IOException {
holder.response.setEntity(new InputStreamEntity(getTestImageStream()));
}
});
BufferedImage thumbnail = (BufferedImage) service.loadDashboardThumbnail(id);
server.assertRequestUris(dashboardsUri + "/" + id + "/thumbnail");
assertEquals(thumbnail.getWidth(), 56);
assertEquals(thumbnail.getHeight(), 46);
}
/** Can load a dashboard thumbnail from info. */
public void loadThumbnailFromDashboardInfo() {
DashboardInfo dashboardInfo = new DashboardInfoImpl(service, builder.buildDashboardNode(id, name, lastChange));
server.register(dashboardsUri + "/" + id + "/thumbnail", new TestRequestHandler() {
@Override
protected void handle(HttpHolder holder) throws IOException {
holder.response.setEntity(new InputStreamEntity(getTestImageStream()));
}
});
BufferedImage thumbnail = (BufferedImage) dashboardInfo.loadThumbnail();
server.assertRequestUris(dashboardsUri + "/" + id + "/thumbnail");
assertEquals(thumbnail.getWidth(), 56);
assertEquals(thumbnail.getHeight(), 46);
}
/** Invalid thumbnail results in exception. */
@Test(expectedExceptions = InvalidStreamException.class)
public void loadInvalidThumbnail() throws InvalidStreamException {
DashboardInfo dashboardInfo = new DashboardInfoImpl(service, builder.buildDashboardNode(id, name, lastChange));
server.register(dashboardsUri + "/" + id + "/thumbnail", "not a thumbnail image");
dashboardInfo.loadThumbnail();
}
/** equals/hashcode for dashboard info */
public void dashboardInfoEquality() {
DashboardInfo d1 = new DashboardInfoImpl(service, builder.buildDashboardNode(id, name, lastChange));
DashboardInfo d2 = new DashboardInfoImpl(service, builder.buildDashboardNode(id, "", null));
DashboardInfo d3 = new DashboardInfoImpl(service, builder.buildDashboardNode("otherId", name, lastChange));
assertEquals(d1, d2);
assertEquals(d1.hashCode(), d2.hashCode());
assertFalse(d1.equals(new Object()));
assertNotEquals(d1, d3);
}
/** equals/hashcode for dashboard */
public void dashboardEquality() {
Dashboard d1 = new DashboardImpl(service, builder.buildDashboardNode(id, name, lastChange));
Dashboard d2 = new DashboardImpl(service, builder.buildDashboardNode(id, "", null));
Dashboard d3 = new DashboardImpl(service, builder.buildDashboardNode("otherId", name, lastChange));
assertEquals(d1, d2);
assertEquals(d1.hashCode(), d2.hashCode());
assertFalse(d1.equals(new Object()));
assertNotEquals(d1, d3);
}
/**
* Tells the server to return the specified node as the only dashboard node
* in a <tt>dashboards</tt> array.
*
* @param node the node to return
*/
private void registerSingleDashboard(JsonNode node) {
server.registerPaginatedItem(dashboardsUri, "dashboards", node);
}
}