package com.belladati.sdk.view.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.assertTrue; import java.io.IOException; import java.util.Collections; import java.util.Locale; import org.apache.http.entity.StringEntity; import org.testng.annotations.Test; import com.belladati.sdk.exception.impl.UnknownViewTypeException; import com.belladati.sdk.report.Report; import com.belladati.sdk.test.SDKTest; import com.belladati.sdk.test.TestRequestHandler; import com.belladati.sdk.view.JsonView; import com.belladati.sdk.view.TableView; import com.belladati.sdk.view.View; import com.belladati.sdk.view.ViewLoader; import com.belladati.sdk.view.ViewType; import com.belladati.sdk.view.impl.ViewImpl; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; /** * Tests behavior related to views. * * @author Chris Hennigfeld */ @Test public class ViewsTest extends SDKTest { private final String viewsUri = "/api/reports/views/"; private final String reportsUri = "/api/reports"; private final String id = "id"; private final String name = "name"; private final String description = "report description"; private final String owner = "report owner"; private final String lastChange = "Mon, 16 Apr 2012 10:17:26 GMT"; /** View JSON is loaded correctly. */ @Test(dataProvider = "jsonViewTypes") public void loadViewJson(String stringType, ViewType viewType) throws UnknownViewTypeException { View view = ViewImpl.buildView(service, builder.buildViewNode(id, name, stringType)); ObjectNode viewNode = new ObjectMapper().createObjectNode().put("some field", "some value"); server.register(viewsUri + id + "/" + stringType, viewNode.toString()); assertEquals(view.toString(), name); assertEquals(view.loadContent(), viewNode); server.assertRequestUris(viewsUri + id + "/" + stringType); assertTrue(view instanceof JsonView, "Wrong view instance type, was " + view.getClass()); } /** View JSON is loaded correctly via service. */ @Test(dataProvider = "jsonViewTypes") public void loadViewJsonFromService(String stringType, ViewType viewType) throws UnknownViewTypeException { ObjectNode viewNode = new ObjectMapper().createObjectNode().put("some field", "some value"); server.register(viewsUri + id + "/" + stringType, viewNode.toString()); assertEquals(service.loadViewContent(id, viewType), viewNode); server.assertRequestUris(viewsUri + id + "/" + stringType); } /** View JSON is loaded correctly through a loader. */ @Test(dataProvider = "jsonViewTypes") public void loadViewJsonFromLoader(String stringType, ViewType viewType) throws UnknownViewTypeException { View view = ViewImpl.buildView(service, builder.buildViewNode(id, name, stringType)); ObjectNode viewNode = new ObjectMapper().createObjectNode().put("some field", "some value"); server.register(viewsUri + id + "/" + stringType, viewNode.toString()); ViewLoader loader = view.createLoader(); assertEquals(loader.getId(), id); assertEquals(loader.getType(), viewType); assertEquals(loader.loadContent(), viewNode); server.assertRequestUris(viewsUri + id + "/" + stringType); } /** View JSON is loaded correctly via service through a loader. */ @Test(dataProvider = "jsonViewTypes") public void loadViewJsonFromServiceLoader(String stringType, ViewType viewType) throws UnknownViewTypeException { ObjectNode viewNode = new ObjectMapper().createObjectNode().put("some field", "some value"); server.register(viewsUri + id + "/" + stringType, viewNode.toString()); ViewLoader loader = service.setupViewLoader(id, viewType); assertEquals(loader.getId(), id); assertEquals(loader.getType(), viewType); assertEquals(loader.loadContent(), viewNode); server.assertRequestUris(viewsUri + id + "/" + stringType); } /** Report views field may be null. */ public void reportViewsNull() { ObjectNode node = builder.buildReportNode(id, name, description, owner, lastChange).put("views", (String) null); server.register(reportsUri + "/" + id, node.toString()); Report report = service.loadReport(id); assertEquals(report.getViews(), Collections.emptyList()); } /** Report views field may be not an array. */ public void reportViewsNotArray() { ObjectNode node = builder.buildReportNode(id, name, description, owner, lastChange).put("views", "not an array"); server.register(reportsUri + "/" + id, node.toString()); Report report = service.loadReport(id); assertEquals(report.getViews(), Collections.emptyList()); } /** Report views are read correctly for all known view types. */ @Test(dataProvider = "viewTypes") public void reportViewInfo(String stringType, ViewType viewType) { String viewId = "viewId"; String viewName = "viewName"; ArrayNode views = new ObjectMapper().createArrayNode(); views.add(builder.buildViewNode(viewId, viewName, stringType)); ObjectNode node = builder.buildReportNode(id, name, description, owner, lastChange); node.put("views", views); server.register(reportsUri + "/" + id, node.toString()); Report report = service.loadReport(id); assertEquals(report.getViews().size(), 1); View view = report.getViews().get(0); assertEquals(view.getId(), viewId); assertEquals(view.getName(), viewName); assertEquals(view.getType(), viewType); if (viewType == ViewType.TABLE) { assertTrue(view instanceof TableView, "Wrong view instance type, was " + view.getClass()); } else { assertTrue(view instanceof JsonView, "Wrong view instance type, was " + view.getClass()); } } /** Report views of unsupported type are ignored. */ @Test(dataProvider = "unsupportedViewTypes") public void reportViewInfoUnknownType(String stringType) { String viewId = "viewId"; String viewName = "viewName"; ArrayNode views = new ObjectMapper().createArrayNode(); views.add(builder.buildViewNode(viewId, viewName, stringType)); ObjectNode node = builder.buildReportNode(id, name, description, owner, lastChange); node.put("views", views); server.register(reportsUri + "/" + id, node.toString()); Report report = service.loadReport(id); assertEquals(report.getViews(), Collections.emptyList()); } /** Report views without type are ignored. */ public void reportViewInfoWithoutType() { String viewId = "viewId"; String viewName = "viewName"; ArrayNode views = new ObjectMapper().createArrayNode(); ObjectNode viewInfoNode = builder.buildViewNode(viewId, viewName, ""); viewInfoNode.remove("type"); views.add(viewInfoNode); ObjectNode node = builder.buildReportNode(id, name, description, owner, lastChange); node.put("views", views); server.register(reportsUri + "/" + id, node.toString()); Report report = service.loadReport(id); assertEquals(report.getViews(), Collections.emptyList()); } /** equals/hashcode for views (JSON and tables) */ public void equality() throws UnknownViewTypeException { View v1 = ViewImpl.buildView(service, builder.buildViewNode(id, name, "chart")); View v2 = ViewImpl.buildView(service, builder.buildViewNode(id, "", "table")); View v3 = ViewImpl.buildView(service, builder.buildViewNode("otherId", name, "chart")); assertEquals(v1, v2); assertEquals(v1.hashCode(), v2.hashCode()); assertFalse(v1.equals(new Object())); assertNotEquals(v1, v3); } /** no date/time definition means neither is supported, nothing is set */ public void noDateTimeDefinition() throws UnknownViewTypeException { View view = ViewImpl.buildView(service, builder.buildViewNode(id, name, "chart")); assertFalse(view.isDateIntervalSupported()); assertFalse(view.isTimeIntervalSupported()); assertFalse(view.hasPredefinedDateInterval()); assertFalse(view.hasPredefinedTimeInterval()); assertNull(view.getPredefinedDateInterval()); assertNull(view.getPredefinedTimeInterval()); } /** neither is supported in the definition */ public void neitherSupported() throws UnknownViewTypeException { View view = ViewImpl.buildView(service, builder.insertViewDateTimeDefinition(false, false, builder.buildViewNode(id, name, "chart"))); assertFalse(view.isDateIntervalSupported()); assertFalse(view.isTimeIntervalSupported()); } /** only date is supported in the definition */ public void dateSupported() throws UnknownViewTypeException { View view = ViewImpl.buildView(service, builder.insertViewDateTimeDefinition(true, false, builder.buildViewNode(id, name, "chart"))); assertTrue(view.isDateIntervalSupported()); assertFalse(view.isTimeIntervalSupported()); } /** only time is supported in the definition */ public void timeSupported() throws UnknownViewTypeException { View view = ViewImpl.buildView(service, builder.insertViewDateTimeDefinition(false, true, builder.buildViewNode(id, name, "chart"))); assertFalse(view.isDateIntervalSupported()); assertTrue(view.isTimeIntervalSupported()); } /** both are supported in the definition */ public void bothSupported() throws UnknownViewTypeException { View view = ViewImpl.buildView(service, builder.insertViewDateTimeDefinition(true, true, builder.buildViewNode(id, name, "chart"))); assertTrue(view.isDateIntervalSupported()); assertTrue(view.isTimeIntervalSupported()); } /** system locale doesn't affect upper/lowercase conversion */ @Test(dataProvider = "viewTypes", groups = "locale") public void localeCaseConversion(String stringType, ViewType viewType) throws UnknownViewTypeException { Locale.setDefault(new Locale("tr")); View view = ViewImpl.buildView(service, builder.buildViewNode(id, name, stringType)); assertEquals(view.getType(), viewType); } /** No locale means no parameter. */ @Test(dataProvider = "jsonViewTypes") public void noLocale(String stringType, ViewType viewType) throws UnknownViewTypeException { View view = ViewImpl.buildView(service, builder.buildViewNode(id, name, stringType)); server.register(viewsUri + id + "/" + stringType, new TestRequestHandler() { @Override protected void handle(HttpHolder holder) throws IOException { assertFalse(holder.getUrlParameters().containsKey("lang")); holder.response.setEntity(new StringEntity("{}")); } }); view.createLoader().loadContent(); view.loadContent(); server.assertRequestUris(viewsUri + id + "/" + stringType, viewsUri + id + "/" + stringType); } /** custom locale is passed as parameter. */ @Test(dataProvider = "jsonViewTypes") public void customLocale(String stringType, ViewType viewType) throws UnknownViewTypeException { View view = ViewImpl.buildView(service, builder.buildViewNode(id, name, stringType)); server.register(viewsUri + id + "/" + stringType, new TestRequestHandler() { @Override protected void handle(HttpHolder holder) throws IOException { assertEquals(holder.getUrlParameters().get("lang"), "tr"); holder.response.setEntity(new StringEntity("{}")); } }); view.createLoader().setLocale(new Locale("tR")).loadContent(); server.assertRequestUris(viewsUri + id + "/" + stringType); } /** predefined locale is passed as parameter. */ @Test(dataProvider = "jsonViewTypes") public void builtInLocale(String stringType, ViewType viewType) throws UnknownViewTypeException { View view = ViewImpl.buildView(service, builder.buildViewNode(id, name, stringType)); server.register(viewsUri + id + "/" + stringType, new TestRequestHandler() { @Override protected void handle(HttpHolder holder) throws IOException { assertEquals(holder.getUrlParameters().get("lang"), "de"); holder.response.setEntity(new StringEntity("{}")); } }); view.createLoader().setLocale(Locale.GERMAN).loadContent(); server.assertRequestUris(viewsUri + id + "/" + stringType); } /** no predefined filter set */ public void noPredefinedFilter() throws UnknownViewTypeException { View view = ViewImpl.buildView(service, builder.buildViewNode(id, name, "chart")); assertFalse(view.hasPredefinedFilters()); assertEquals(view.getPredefinedFilters(), Collections.emptyList()); } }