package com.belladati.sdk.dataset.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 static org.testng.Assert.assertTrue; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.TimeZone; import org.apache.http.entity.StringEntity; import org.testng.annotations.Test; import com.belladati.sdk.dataset.DataSet; import com.belladati.sdk.dataset.DataSetInfo; import com.belladati.sdk.dataset.data.DataColumn; import com.belladati.sdk.dataset.data.DataRow; import com.belladati.sdk.dataset.impl.DataSetImpl; import com.belladati.sdk.dataset.impl.DataSetInfoImpl; import com.belladati.sdk.report.ReportInfo; import com.belladati.sdk.test.SDKTest; import com.belladati.sdk.test.TestRequestHandler; import com.belladati.sdk.util.PaginatedIdList; import com.belladati.sdk.util.PaginatedList; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; /** * Tests behavior related to data sets. * * @author Chris Hennigfeld */ @Test public class DataSetsTest extends SDKTest { private final String dataSetsUri = "/api/dataSets"; private final String dataUri = "/api/dataSets/%s/data"; private final String id = "123"; private final String name = "data set name"; private final String description = "data set description"; private final String owner = "data set owner"; private final String lastChange = "Mon, 16 Apr 2012 10:17:26 GMT"; /** Regular data set info data is loaded correctly. */ public void loadDataSetInfo() { PaginatedList<DataSetInfo> dataSetInfos = service.getDataSetInfo(); registerSingleDataSet(builder.buildDataSetNode(id, name, description, owner, lastChange)); dataSetInfos.load(); server.assertRequestUris(dataSetsUri); assertEquals(dataSetInfos.size(), 1); DataSetInfo info = dataSetInfos.get(0); assertEquals(info.getId(), id); assertEquals(info.getName(), name); assertEquals(info.getDescription(), description); assertEquals(info.getOwnerName(), owner); 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); } /** Data set description may be null. */ public void infoNullDescription() { registerSingleDataSet(builder.buildDataSetNode(id, name, null, owner, lastChange)); assertEquals(service.getDataSetInfo().load().get(0).getDescription(), ""); } /** Data set description may be missing. */ public void infoWithoutDescription() { ObjectNode node = builder.buildDataSetNode(id, name, description, owner, lastChange); node.remove("description"); registerSingleDataSet(node); assertEquals(service.getDataSetInfo().load().get(0).getDescription(), ""); } /** Data set last change may be null. */ public void infoNullLastChange() { registerSingleDataSet(builder.buildDataSetNode(id, name, description, owner, null)); assertNull(service.getDataSetInfo().load().get(0).getLastChange()); } /** Data set last change may be missing. */ public void infoWithoutLastChange() { ObjectNode node = builder.buildDataSetNode(id, name, description, owner, lastChange); node.remove("lastChange"); registerSingleDataSet(node); assertNull(service.getDataSetInfo().load().get(0).getLastChange()); } /** Data set last change may be invalid format. */ public void infoInvalidLastChange() { registerSingleDataSet(builder.buildDataSetNode(id, name, description, owner, "something invalid")); assertNull(service.getDataSetInfo().load().get(0).getLastChange()); } /** Getting a data set info list multiple times returns the same list. */ public void dataSetInfoListSame() { assertSame(service.getDataSetInfo(), service.getDataSetInfo()); } /** Individual data set can be loaded by ID through service. */ public void loadDataSet() { server.register(dataSetsUri + "/" + id, builder.buildDataSetNode(id, name, description, owner, lastChange).toString()); DataSet dataSet = service.loadDataSet(id); server.assertRequestUris(dataSetsUri + "/" + id); assertEquals(dataSet.getId(), id); assertEquals(dataSet.getName(), name); assertEquals(dataSet.getDescription(), description); assertEquals(dataSet.getOwnerName(), owner); Calendar expectedChange = Calendar.getInstance(TimeZone.getTimeZone("GMT")); expectedChange.set(2012, 3, 16, 10, 17, 26); expectedChange.set(Calendar.MILLISECOND, 0); assertEquals(dataSet.getLastChange(), expectedChange.getTime()); assertEquals(dataSet.getAttributes(), Collections.emptyList()); assertEquals(dataSet.getIndicators(), Collections.emptyList()); assertEquals(dataSet.getReports(), Collections.emptyList()); assertEquals(dataSet.toString(), name); } /** Data set description may be null. */ public void dataSetNullDescription() { server.register(dataSetsUri + "/" + id, builder.buildDataSetNode(id, name, null, owner, lastChange).toString()); DataSet dataSet = service.loadDataSet(id); assertEquals(dataSet.getDescription(), ""); } /** Data set description may be missing. */ public void dataSetWithoutDescription() { ObjectNode node = builder.buildDataSetNode(id, name, description, owner, lastChange); node.remove("description"); server.register(dataSetsUri + "/" + id, node.toString()); DataSet dataSet = service.loadDataSet(id); assertEquals(dataSet.getDescription(), ""); } /** Data set last change may be null. */ public void dataSetNullLastChange() { server.register(dataSetsUri + "/" + id, builder.buildDataSetNode(id, name, description, owner, null).toString()); DataSet dataSet = service.loadDataSet(id); assertNull(dataSet.getLastChange()); } /** Data set last change may be missing. */ public void dataSetWithoutLastChange() { ObjectNode node = builder.buildDataSetNode(id, name, description, owner, lastChange); node.remove("lastChange"); server.register(dataSetsUri + "/" + id, node.toString()); DataSet dataSet = service.loadDataSet(id); assertNull(dataSet.getLastChange()); } /** Data set last change may be invalid format. */ public void dataSetInvalidLastChange() { server.register(dataSetsUri + "/" + id, builder.buildDataSetNode(id, name, description, owner, "something invalid").toString()); DataSet dataSet = service.loadDataSet(id); assertNull(dataSet.getLastChange()); } /** Data set can be loaded from a data set info object. */ public void loadDataSetFromInfo() { String idDS = "id2"; String nameDS = "name2"; String descDS = "desc2"; String ownerDS = "owner2"; String lastChangeDS = "Tue, 17 Apr 2012 11:18:27 GMT"; registerSingleDataSet(builder.buildDataSetNode(id, name, description, owner, lastChange)); server.register(dataSetsUri + "/" + id, builder.buildDataSetNode(idDS, nameDS, descDS, ownerDS, lastChangeDS).toString()); DataSet dataSet = service.getDataSetInfo().load().get(0).loadDetails(); assertEquals(dataSet.getId(), idDS); assertEquals(dataSet.getName(), nameDS); assertEquals(dataSet.getDescription(), descDS); assertEquals(dataSet.getOwnerName(), ownerDS); Calendar expectedChange = Calendar.getInstance(TimeZone.getTimeZone("GMT")); expectedChange.set(2012, 3, 17, 11, 18, 27); expectedChange.set(Calendar.MILLISECOND, 0); assertEquals(dataSet.getLastChange(), expectedChange.getTime()); assertEquals(dataSet.getAttributes(), Collections.emptyList()); assertEquals(dataSet.getIndicators(), Collections.emptyList()); assertEquals(dataSet.getReports(), Collections.emptyList()); } /** equals/hashcode for data set info */ public void dataSetInfoEquality() { DataSetInfo d1 = new DataSetInfoImpl(service, builder.buildDataSetNode(id, name, description, owner, lastChange)); DataSetInfo d2 = new DataSetInfoImpl(service, builder.buildDataSetNode(id, "", "", "", null)); DataSetInfo d3 = new DataSetInfoImpl(service, builder.buildDataSetNode("otherId", name, description, owner, lastChange)); assertEquals(d1, d2); assertEquals(d1.hashCode(), d2.hashCode()); assertFalse(d1.equals(new Object())); assertNotEquals(d1, d3); } /** equals/hashcode for data set */ public void dataSetEquality() { DataSet d1 = new DataSetImpl(service, builder.buildDataSetNode(id, name, description, owner, lastChange)); DataSet d2 = new DataSetImpl(service, builder.buildDataSetNode(id, "", "", "", null)); DataSet d3 = new DataSetImpl(service, builder.buildDataSetNode("otherId", name, description, owner, lastChange)); assertEquals(d1, d2); assertEquals(d1.hashCode(), d2.hashCode()); assertFalse(d1.equals(new Object())); assertNotEquals(d1, d3); } /** No reports field means no reports. */ public void reportsMissing() { server.register(dataSetsUri + "/" + id, builder.buildDataSetNode(id, name, description, owner, lastChange).toString()); DataSet dataSet = service.loadDataSet(id); assertEquals(dataSet.getReports(), Collections.emptyList()); } /** Empty reports array means no reports. */ public void reportsEmpty() { ObjectNode node = builder.buildDataSetNode(id, name, description, owner, lastChange); node.put("reports", new ObjectMapper().createArrayNode()); server.register(dataSetsUri + "/" + id, node.toString()); DataSet dataSet = service.loadDataSet(id); assertEquals(dataSet.getReports(), Collections.emptyList()); } /** Invalid reports are ignored. */ public void reportsInvalid() { ObjectNode node = builder.buildDataSetNode(id, name, description, owner, lastChange); node.put("reports", new ObjectMapper().createArrayNode().add(builder.buildReportNode(null, name, description, owner, lastChange))); server.register(dataSetsUri + "/" + id, node.toString()); DataSet dataSet = service.loadDataSet(id); assertEquals(dataSet.getReports(), Collections.emptyList()); } /** valid reports are loaded */ public void reportValid() { ObjectNode node = builder.buildDataSetNode(id, name, description, owner, lastChange); String reportId = "reportId"; node.put("reports", new ObjectMapper().createArrayNode().add(builder.buildReportNode(reportId, name, description, owner, lastChange))); server.register(dataSetsUri + "/" + id, node.toString()); DataSet dataSet = service.loadDataSet(id); assertEquals(dataSet.getReports().size(), 1); ReportInfo reportInfo = dataSet.getReports().get(0); assertEquals(reportInfo.getId(), reportId); assertEquals(reportInfo.getName(), name); assertEquals(reportInfo.getDescription(), description); assertEquals(reportInfo.getOwnerName(), owner); server.register("/api/reports/" + reportId, builder.buildReportNode(reportId, name, description, owner, lastChange).toString()); reportInfo.loadDetails(); server.assertRequestUris(dataSetsUri + "/" + id, "/api/reports/" + reportId); } /** * Tells the server to return the specified node as the only data set node * in a <tt>data sets</tt> array. * * @param node the node to return */ private void registerSingleDataSet(JsonNode node) { server.registerPaginatedItem(dataSetsUri, "dataSets", node); } /** Regular data set data is loaded correctly. */ public void loadDataSetData() { server.register(dataSetsUri + "/" + id, builder.buildDataSetNode(id, name, description, owner, lastChange).toString()); DataSet dataSet = service.loadDataSet(id); server.assertRequestUris(dataSetsUri + "/" + id); server.register(String.format(dataUri, id), builder.buildDataSetDataNode(id, name, description, owner, lastChange, "456", "L_ATTRIBUTE", "My Value", "M_INDICATOR", "11.99").toString()); PaginatedIdList<DataRow> dataList = dataSet.getData(); dataList.load(); server.assertRequestUris(dataSetsUri + "/" + id, String.format(dataUri, id)); assertEquals(dataList.size(), 1); assertEquals(dataList.toList().size(), 1); DataRow info = dataList.get(0); assertEquals(info.getId(), "456"); assertEquals(info.getColumns().size(), 2); } /** Regular data set info data is loaded correctly. */ public void loadDataSetDataFromInfo() { String idDS = "id2"; String nameDS = "name2"; String descDS = "desc2"; String ownerDS = "owner2"; String lastChangeDS = "Tue, 17 Apr 2012 11:18:27 GMT"; registerSingleDataSet(builder.buildDataSetNode(id, name, description, owner, lastChange)); server.register(dataSetsUri + "/" + id, builder.buildDataSetNode(idDS, nameDS, descDS, ownerDS, lastChangeDS).toString()); DataSetInfo dataSetInfo = service.getDataSetInfo().load().get(0); server.assertRequestUris(dataSetsUri); server.register(String.format(dataUri, id), builder.buildDataSetDataNode(id, name, description, owner, lastChange, "456", "L_ATTRIBUTE", "My Value", "M_INDICATOR", "11.99").toString()); PaginatedIdList<DataRow> dataList = dataSetInfo.getData(); dataList.load(); server.assertRequestUris(dataSetsUri, String.format(dataUri, id)); assertEquals(dataList.size(), 1); assertEquals(dataList.toList().size(), 1); DataRow info = dataList.get(0); assertEquals(info.getId(), "456"); assertEquals(info.getColumns().size(), 2); } /** Posts data set data row. */ public void postDataSetData() { DataSet dataSet = new DataSetImpl(service, builder.buildDataSetNode(id, name, description, owner, lastChange)); ObjectNode expectedNode = builder.buildDataSetDataRowNode("456", "L_ATTRIBUTE", "My Value", "M_INDICATOR", "11.99"); server.register(String.format(dataUri, id), new TestRequestHandler() { @Override protected void handle(HttpHolder holder) throws IOException { Map<String, String> formParams = holder.getFormParameters(); assertEquals(formParams.size(), 1); assertTrue(formParams.containsKey("dataRow")); assertEquals(formParams.get("dataRow"), expectedNode.toString()); holder.response.setEntity(new StringEntity("")); } }); List<DataColumn> columns = new ArrayList<>(); columns.add(new DataColumn("L_ATTRIBUTE")); columns.add(new DataColumn("M_INDICATOR")); DataRow dataRow = new DataRow("456", columns); dataRow.setAll("My Value", "11.99"); dataSet.postData(dataRow); } /** Posts data set info data row. */ public void postDataSetDataFromInfo() { DataSetInfo dataSetInfo = new DataSetInfoImpl(service, builder.buildDataSetNode(id, name, description, owner, lastChange)); ObjectNode expectedNode = builder.buildDataSetDataRowNode("456", "L_ATTRIBUTE", "My Value", "M_INDICATOR", "11.99"); server.register(String.format(dataUri, id), new TestRequestHandler() { @Override protected void handle(HttpHolder holder) throws IOException { Map<String, String> formParams = holder.getFormParameters(); assertEquals(formParams.size(), 1); assertTrue(formParams.containsKey("dataRow")); assertEquals(formParams.get("dataRow"), expectedNode.toString()); holder.response.setEntity(new StringEntity("")); } }); List<DataColumn> columns = new ArrayList<>(); columns.add(new DataColumn("L_ATTRIBUTE")); columns.add(new DataColumn("M_INDICATOR")); DataRow dataRow = new DataRow("456", columns); dataRow.setAll("My Value", "11.99"); dataSetInfo.postData(dataRow); } }