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.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.http.entity.StringEntity;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.belladati.sdk.exception.impl.UnknownViewTypeException;
import com.belladati.sdk.filter.Filter;
import com.belladati.sdk.filter.FilterOperation;
import com.belladati.sdk.test.SDKTest;
import com.belladati.sdk.test.TestRequestHandler;
import com.belladati.sdk.view.TableView;
import com.belladati.sdk.view.TableView.Table;
import com.belladati.sdk.view.impl.TableViewImpl;
import com.belladati.sdk.view.View;
import com.belladati.sdk.view.ViewType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
@Test
public class TableViewsTest extends SDKTest {
private final String viewsUri = "/api/reports/views/";
private final String id = "id";
private final String name = "name";
/** Table is loaded correctly. */
public void loadViewTable() throws UnknownViewTypeException {
View view = new TableViewImpl(service, builder.buildViewNode(id, name, "table"));
int rows = 8;
int columns = 12;
server.register(viewsUri + id + "/table/bounds", builder.buildTableNode(rows, columns, 2, 2).toString());
TableView.Table table = (Table) view.loadContent();
assertEquals(table.getRowCount(), rows);
assertEquals(table.getColumnCount(), columns);
assertTrue(table.hasLeftHeader());
assertTrue(table.hasTopHeader());
server.assertRequestUris(viewsUri + id + "/table/bounds");
assertEquals(view.toString(), name);
assertTrue(table.toString().contains(id));
}
/** Table is loaded correctly via service. */
public void loadViewTableFromService() {
int rows = 8;
int columns = 12;
server.register(viewsUri + id + "/table/bounds", builder.buildTableNode(rows, columns, 2, 2).toString());
TableView.Table table = (Table) service.loadViewContent(id, ViewType.TABLE);
assertEquals(table.getRowCount(), rows);
assertEquals(table.getColumnCount(), columns);
assertTrue(table.hasLeftHeader());
assertTrue(table.hasTopHeader());
server.assertRequestUris(viewsUri + id + "/table/bounds");
}
/** Table is loaded correctly. */
public void loadViewTableFromLoader() throws UnknownViewTypeException {
View view = new TableViewImpl(service, builder.buildViewNode(id, name, "table"));
int rows = 8;
int columns = 12;
server.register(viewsUri + id + "/table/bounds", builder.buildTableNode(rows, columns, 2, 2).toString());
TableView.Table table = (Table) view.createLoader().loadContent();
assertEquals(table.getRowCount(), rows);
assertEquals(table.getColumnCount(), columns);
assertTrue(table.hasLeftHeader());
assertTrue(table.hasTopHeader());
}
/** Table is loaded correctly via service. */
public void loadViewTableFromServiceLoader() {
int rows = 8;
int columns = 12;
server.register(viewsUri + id + "/table/bounds", builder.buildTableNode(rows, columns, 2, 2).toString());
TableView.Table table = (Table) service.setupViewLoader(id, ViewType.TABLE).loadContent();
assertEquals(table.getRowCount(), rows);
assertEquals(table.getColumnCount(), columns);
assertTrue(table.hasLeftHeader());
assertTrue(table.hasTopHeader());
}
/** Table without left header. */
public void tableZeroLeftHeader() {
server.register(viewsUri + id + "/table/bounds", builder.buildTableNode(10, 12, 0, 2).toString());
TableView.Table table = (Table) service.loadViewContent(id, ViewType.TABLE);
assertTrue(table.hasTopHeader());
assertFalse(table.hasLeftHeader());
}
/** Table without top header. */
public void tableZeroTopHeader() {
server.register(viewsUri + id + "/table/bounds", builder.buildTableNode(10, 12, 2, 0).toString());
TableView.Table table = (Table) service.loadViewContent(id, ViewType.TABLE);
assertFalse(table.hasTopHeader());
assertTrue(table.hasLeftHeader());
}
/** Table view without rows attribute. */
public void tableViewNoRows() {
int columns = 12;
ObjectNode tableNode = builder.buildTableNode(10, columns);
tableNode.remove("rowsCount");
server.register(viewsUri + id + "/table/bounds", tableNode.toString());
TableView.Table table = (Table) service.loadViewContent(id, ViewType.TABLE);
assertEquals(table.getRowCount(), 0);
assertEquals(table.getColumnCount(), columns);
}
/** Table view without columns attribute. */
public void tableViewNoColumns() {
int rows = 12;
ObjectNode tableNode = builder.buildTableNode(rows, 10);
tableNode.remove("columnsCount");
server.register(viewsUri + id + "/table/bounds", tableNode.toString());
TableView.Table table = (Table) service.loadViewContent(id, ViewType.TABLE);
assertEquals(table.getRowCount(), rows);
assertEquals(table.getColumnCount(), 0);
}
/** Table view with non-numeric rows attribute. */
public void tableViewRowsNotNumber() {
int columns = 12;
ObjectNode tableNode = builder.buildTableNode(10, columns);
tableNode.put("rowsCount", "not a number");
server.register(viewsUri + id + "/table/bounds", tableNode.toString());
TableView.Table table = (Table) service.loadViewContent(id, ViewType.TABLE);
assertEquals(table.getRowCount(), 0);
assertEquals(table.getColumnCount(), columns);
}
/** Table view with non-numeric columns attribute. */
public void tableViewColumnsNotNumber() {
int rows = 12;
ObjectNode tableNode = builder.buildTableNode(rows, 10);
tableNode.put("columnsCount", "not a number");
server.register(viewsUri + id + "/table/bounds", tableNode.toString());
TableView.Table table = (Table) service.loadViewContent(id, ViewType.TABLE);
assertEquals(table.getRowCount(), rows);
assertEquals(table.getColumnCount(), 0);
}
/** Table view without top rows attribute. */
public void tableViewNoTopRows() {
ObjectNode tableNode = builder.buildTableNode(10, 12, 2, 2);
tableNode.remove("topHeaderRowsCount");
server.register(viewsUri + id + "/table/bounds", tableNode.toString());
TableView.Table table = (Table) service.loadViewContent(id, ViewType.TABLE);
assertFalse(table.hasTopHeader());
assertTrue(table.hasLeftHeader());
}
/** Table view without left columns attribute. */
public void tableViewNoLeftColumns() {
ObjectNode tableNode = builder.buildTableNode(12, 10, 2, 2);
tableNode.remove("leftHeaderColumnsCount");
server.register(viewsUri + id + "/table/bounds", tableNode.toString());
TableView.Table table = (Table) service.loadViewContent(id, ViewType.TABLE);
assertFalse(table.hasLeftHeader());
assertTrue(table.hasTopHeader());
}
/** Table view with non-numeric top rows attribute. */
public void tableViewTopRowsNotNumber() {
ObjectNode tableNode = builder.buildTableNode(10, 12, 2, 2);
tableNode.put("topHeaderRowsCount", "not a number");
server.register(viewsUri + id + "/table/bounds", tableNode.toString());
TableView.Table table = (Table) service.loadViewContent(id, ViewType.TABLE);
assertFalse(table.hasTopHeader());
assertTrue(table.hasLeftHeader());
}
/** Table view with non-numeric left columns attribute. */
public void tableViewLeftColumnsNotNumber() {
ObjectNode tableNode = builder.buildTableNode(12, 10, 2, 2);
tableNode.put("leftHeaderColumnsCount", "not a number");
server.register(viewsUri + id + "/table/bounds", tableNode.toString());
TableView.Table table = (Table) service.loadViewContent(id, ViewType.TABLE);
assertFalse(table.hasLeftHeader());
assertTrue(table.hasTopHeader());
}
/** Left header first row less than zero. */
@Test(expectedExceptions = IllegalArgumentException.class)
public void tableLeftHeaderBelowZero() {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 10));
table.loadLeftHeader(-1, 3);
}
/** Left header last row greater than number of rows. */
@Test(expectedExceptions = IllegalArgumentException.class)
public void tableLeftHeaderAboveCount() {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 10));
table.loadLeftHeader(3, 11);
}
/** Left header first row greater than last row. */
@Test(expectedExceptions = IllegalArgumentException.class)
public void tableLeftHeaderEndBeforeStart() {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 10));
table.loadLeftHeader(5, 3);
}
/** Top header first column less than zero. */
@Test(expectedExceptions = IllegalArgumentException.class)
public void tableTopHeaderBelowZero() {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 10));
table.loadTopHeader(-1, 3);
}
/** Top header last column greater than column count. */
@Test(expectedExceptions = IllegalArgumentException.class)
public void tableTopHeaderAboveCount() {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 10));
table.loadTopHeader(3, 11);
}
/** Top header first column greater than last column. */
@Test(expectedExceptions = IllegalArgumentException.class)
public void tableTopHeaderEndBeforeStart() {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 10));
table.loadTopHeader(5, 3);
}
/** Data first row less than zero. */
@Test(expectedExceptions = IllegalArgumentException.class)
public void tableDataRowBelowZero() {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 10));
table.loadData(-1, 3, 3, 3);
}
/** Data last row greater than number of rows. */
@Test(expectedExceptions = IllegalArgumentException.class)
public void tableDataRowAboveCount() {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 10));
table.loadData(3, 11, 3, 3);
}
/** Data first row greater than last row. */
@Test(expectedExceptions = IllegalArgumentException.class)
public void tableDataRowEndBeforeStart() {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 10));
table.loadData(5, 3, 3, 3);
}
/** Data first column less than zero. */
@Test(expectedExceptions = IllegalArgumentException.class)
public void tableDataColumnBelowZero() {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 10));
table.loadData(3, 3, -1, 3);
}
/** Data last column greater than column count. */
@Test(expectedExceptions = IllegalArgumentException.class)
public void tableDataColumnAboveCount() {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 10));
table.loadData(3, 3, 3, 11);
}
/** Data first column greater than last column. */
@Test(expectedExceptions = IllegalArgumentException.class)
public void tableDataColumnEndBeforeStart() {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 10));
table.loadData(3, 3, 5, 3);
}
@DataProvider(name = "firstLastProvider")
public Object[][] provideFirstLast() {
return new Object[][] { { 3, 8 }, { 10, 10 } };
}
/** Left header is loaded correctly. */
@Test(dataProvider = "firstLastProvider")
public void loadLeftHeader(final int firstRow, final int lastRow) {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 5, 2, 2));
final JsonNode result = new ObjectMapper().createObjectNode().put("content", "some content");
server.register(viewsUri + id + "/table/leftHeader", new TestRequestHandler() {
@Override
protected void handle(HttpHolder holder) throws IOException {
Map<String, String> expectedParams = new HashMap<String, String>();
expectedParams.put("rowsFrom", "" + firstRow);
expectedParams.put("rowsTo", "" + lastRow);
assertEquals(holder.getUrlParameters(), expectedParams);
holder.response.setEntity(new StringEntity(result.toString()));
}
});
assertEquals(table.loadLeftHeader(firstRow, lastRow), result);
server.assertRequestUris(viewsUri + id + "/table/leftHeader");
}
/** Top header is loaded correctly. */
@Test(dataProvider = "firstLastProvider")
public void loadTopHeader(final int firstCol, final int lastCol) {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(5, 10, 2, 2));
final JsonNode result = new ObjectMapper().createObjectNode().put("content", "some content");
server.register(viewsUri + id + "/table/topHeader", new TestRequestHandler() {
@Override
protected void handle(HttpHolder holder) throws IOException {
Map<String, String> expectedParams = new HashMap<String, String>();
expectedParams.put("columnsFrom", "" + firstCol);
expectedParams.put("columnsTo", "" + lastCol);
assertEquals(holder.getUrlParameters(), expectedParams);
holder.response.setEntity(new StringEntity(result.toString()));
}
});
assertEquals(table.loadTopHeader(firstCol, lastCol), result);
server.assertRequestUris(viewsUri + id + "/table/topHeader");
}
@DataProvider(name = "doubleFirstLastProvider")
public Object[][] provideDoubleFirstLast() {
return new Object[][] { { 3, 6, 4, 9 }, { 8, 8, 10, 10 } };
}
/** Data is loaded correctly when there are more rows than columns. */
@Test(dataProvider = "doubleFirstLastProvider")
public void loadDataMoreRows(final int firstCol, final int lastCol, final int firstRow, final int lastRow) {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(10, 8, 2, 2));
final JsonNode result = new ObjectMapper().createObjectNode().put("content", "some content");
server.register(viewsUri + id + "/table/data", new TestRequestHandler() {
@Override
protected void handle(HttpHolder holder) throws IOException {
Map<String, String> expectedParams = new HashMap<String, String>();
expectedParams.put("rowsFrom", "" + firstRow);
expectedParams.put("rowsTo", "" + lastRow);
expectedParams.put("columnsFrom", "" + firstCol);
expectedParams.put("columnsTo", "" + lastCol);
assertEquals(holder.getUrlParameters(), expectedParams);
holder.response.setEntity(new StringEntity(result.toString()));
}
});
assertEquals(table.loadData(firstRow, lastRow, firstCol, lastCol), result);
server.assertRequestUris(viewsUri + id + "/table/data");
}
/** Data is loaded correctly when there are more columns than rows. */
@Test(dataProvider = "doubleFirstLastProvider")
public void loadDataMoreColumns(final int firstRow, final int lastRow, final int firstCol, final int lastCol) {
Table table = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(8, 10, 2, 2));
final JsonNode result = new ObjectMapper().createObjectNode().put("content", "some content");
server.register(viewsUri + id + "/table/data", new TestRequestHandler() {
@Override
protected void handle(HttpHolder holder) throws IOException {
Map<String, String> expectedParams = new HashMap<String, String>();
expectedParams.put("rowsFrom", "" + firstRow);
expectedParams.put("rowsTo", "" + lastRow);
expectedParams.put("columnsFrom", "" + firstCol);
expectedParams.put("columnsTo", "" + lastCol);
assertEquals(holder.getUrlParameters(), expectedParams);
holder.response.setEntity(new StringEntity(result.toString()));
}
});
assertEquals(table.loadData(firstRow, lastRow, firstCol, lastCol), result);
server.assertRequestUris(viewsUri + id + "/table/data");
}
/** equals/hashcode without filters */
public void noFilterEquality() {
Table t1 = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(2, 2));
Table t2 = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(1, 1));
Table t3 = new TableViewImpl.TableImpl(service, "otherId", builder.buildTableNode(1, 1));
assertEquals(t1, t2);
assertEquals(t1.hashCode(), t2.hashCode());
assertFalse(t1.equals(new Object()));
assertNotEquals(t1, t3);
}
/** equals/hashcode with filters */
public void filterEquality() {
List<Filter<?>> f1 = Arrays.<Filter<?>> asList(FilterOperation.NULL.createFilter(service, "id", "code"));
Table t1 = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(2, 2), f1);
Table t2 = new TableViewImpl.TableImpl(service, id, builder.buildTableNode(1, 1), f1);
Table t3 = new TableViewImpl.TableImpl(service, "otherId", builder.buildTableNode(1, 1), f1);
Table t4 = new TableViewImpl.TableImpl(service, "otherId", builder.buildTableNode(1, 1),
Arrays.<Filter<?>> asList(FilterOperation.NOT_NULL.createFilter(service, "id", "code")));
assertEquals(t1, t2);
assertEquals(t1.hashCode(), t2.hashCode());
assertNotEquals(t1, t3);
assertNotEquals(t1, t4);
assertFalse(t1.equals(new Object()));
}
/** no date/time definition means neither is supported */
public void noDateTimeDefinition() throws UnknownViewTypeException {
View view = new TableViewImpl(service, builder.buildViewNode(id, name, "table"));
assertFalse(view.isDateIntervalSupported());
assertFalse(view.isTimeIntervalSupported());
}
/** date/time definition still doesn't support intervals */
public void hasDateTimeDefinition() throws UnknownViewTypeException {
View view = new TableViewImpl(service,
builder.insertViewDateTimeDefinition(true, true, builder.buildViewNode(id, name, "table")));
assertFalse(view.isDateIntervalSupported());
assertFalse(view.isTimeIntervalSupported());
}
/** no locale means no parameter is set */
public void noLocale() throws UnknownViewTypeException {
View view = new TableViewImpl(service, builder.buildViewNode(id, name, "table"));
int rows = 8;
int columns = 12;
server.register(viewsUri + id + "/table/bounds", builder.buildTableNode(rows, columns, 2, 2).toString());
TableView.Table table = (Table) view.loadContent();
assertNull(table.getLocale());
TestRequestHandler paramChecker = new TestRequestHandler() {
@Override
protected void handle(HttpHolder holder) throws IOException {
assertFalse(holder.getUrlParameters().containsKey("lang"));
holder.response.setEntity(new StringEntity("{}"));
}
};
server.register(viewsUri + id + "/table/leftHeader", paramChecker);
server.register(viewsUri + id + "/table/topHeader", paramChecker);
server.register(viewsUri + id + "/table/data", paramChecker);
table.loadLeftHeader(0, 0);
table.loadTopHeader(0, 0);
table.loadData(0, 0, 0, 0);
server.assertRequestUris(viewsUri + id + "/table/bounds", viewsUri + id + "/table/leftHeader",
viewsUri + id + "/table/topHeader", viewsUri + id + "/table/data");
}
/** custom locale is sent */
public void customLocale() throws UnknownViewTypeException {
View view = new TableViewImpl(service, builder.buildViewNode(id, name, "table"));
int rows = 8;
int columns = 12;
server.register(viewsUri + id + "/table/bounds", builder.buildTableNode(rows, columns, 2, 2).toString());
TableView.Table table = (Table) view.createLoader().setLocale(new Locale("tR")).loadContent();
assertEquals(table.getLocale(), new Locale("Tr"));
TestRequestHandler paramChecker = new TestRequestHandler() {
@Override
protected void handle(HttpHolder holder) throws IOException {
assertEquals(holder.getUrlParameters().get("lang"), "tr");
holder.response.setEntity(new StringEntity("{}"));
}
};
server.register(viewsUri + id + "/table/leftHeader", paramChecker);
server.register(viewsUri + id + "/table/topHeader", paramChecker);
server.register(viewsUri + id + "/table/data", paramChecker);
table.loadLeftHeader(0, 0);
table.loadTopHeader(0, 0);
table.loadData(0, 0, 0, 0);
server.assertRequestUris(viewsUri + id + "/table/bounds", viewsUri + id + "/table/leftHeader",
viewsUri + id + "/table/topHeader", viewsUri + id + "/table/data");
}
/** table locale is sent */
public void tableLocale() throws UnknownViewTypeException {
View view = new TableViewImpl(service, builder.buildViewNode(id, name, "table"));
int rows = 8;
int columns = 12;
server.register(viewsUri + id + "/table/bounds", builder.buildTableNode(rows, columns, 2, 2).toString());
TableView.Table table = (Table) view.createLoader().loadContent();
table.setLocale(new Locale("Tr"));
TestRequestHandler paramChecker = new TestRequestHandler() {
@Override
protected void handle(HttpHolder holder) throws IOException {
assertEquals(holder.getUrlParameters().get("lang"), "tr");
holder.response.setEntity(new StringEntity("{}"));
}
};
server.register(viewsUri + id + "/table/leftHeader", paramChecker);
server.register(viewsUri + id + "/table/topHeader", paramChecker);
server.register(viewsUri + id + "/table/data", paramChecker);
table.loadLeftHeader(0, 0);
table.loadTopHeader(0, 0);
table.loadData(0, 0, 0, 0);
server.assertRequestUris(viewsUri + id + "/table/bounds", viewsUri + id + "/table/leftHeader",
viewsUri + id + "/table/topHeader", viewsUri + id + "/table/data");
}
}