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.util.Calendar; import java.util.Collections; import java.util.TimeZone; import org.testng.annotations.Test; import com.belladati.sdk.dataset.source.DataSource; import com.belladati.sdk.dataset.source.DataSourceImport; import com.belladati.sdk.dataset.source.ImportInterval; import com.belladati.sdk.dataset.source.ImportIntervalUnit; import com.belladati.sdk.dataset.source.impl.DataSourceImpl; import com.belladati.sdk.dataset.source.impl.DataSourceImportImpl; import com.belladati.sdk.exception.impl.InvalidDataSourceImportException; import com.belladati.sdk.test.SDKTest; import com.belladati.sdk.util.CachedList; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; @Test public class DataSourceImportTest extends SDKTest { private final String dsId = "ds-id"; private final String importUri = String.format("/api/dataSets/dataSources/%s/executions", dsId); private final String id = "123"; private final String caller = "import caller"; private final String lastImport = "Mon, 16 Apr 2012 10:17:26 GMT"; private final String overwritePolicy = "DELETE_ALL"; private final String interval = "CUSTOM"; private final int customIntervalLength = 30; /** Import is loaded correctly from service. */ public void loadDataSource() { CachedList<DataSourceImport> imports = service.getDataSourceImports(dsId); registerSingleImport( builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, interval, customIntervalLength)); imports.load(); server.assertRequestUris(importUri); assertEquals(imports.toList().size(), 1); DataSourceImport exec = imports.toList().get(0); assertEquals(exec.getId(), id); assertEquals(exec.getCallerName(), caller); Calendar expectedImport = Calendar.getInstance(TimeZone.getTimeZone("GMT")); expectedImport.set(2012, 3, 16, 10, 17, 26); expectedImport.set(Calendar.MILLISECOND, 0); assertEquals(exec.getNextExecutionDate(), expectedImport.getTime()); assertEquals(exec.getRepeatInterval().getMinutes(), customIntervalLength); assertTrue(exec.isOverwriting()); } /** Import is loaded correctly from data source. */ public void loadFromDataSet() { DataSource source = new DataSourceImpl(service, builder.buildDataSourceNode(dsId, "", "")); CachedList<DataSourceImport> imports = source.getImports(); registerSingleImport( builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, interval, customIntervalLength)); imports.load(); server.assertRequestUris(importUri); assertEquals(imports.toList().size(), 1); DataSourceImport exec = imports.toList().get(0); assertEquals(exec.getId(), id); assertEquals(exec.getCallerName(), caller); Calendar expectedImport = Calendar.getInstance(TimeZone.getTimeZone("GMT")); expectedImport.set(2012, 3, 16, 10, 17, 26); expectedImport.set(Calendar.MILLISECOND, 0); assertEquals(exec.getNextExecutionDate(), expectedImport.getTime()); assertEquals(exec.getRepeatInterval().getMinutes(), customIntervalLength); assertTrue(exec.isOverwriting()); } /** given the same ID, the same collection is returned */ public void sameCollection() { DataSource source = new DataSourceImpl(service, builder.buildDataSourceNode(dsId, "", "")); assertSame(source.getImports(), service.getDataSourceImports(dsId)); } /** equals/hashcode for imports */ public void dataSourceEquality() throws InvalidDataSourceImportException { DataSourceImport d1 = new DataSourceImportImpl( builder.buildSourceImportNode(dsId, caller, lastImport, overwritePolicy, interval, customIntervalLength)); DataSourceImport d2 = new DataSourceImportImpl(builder.buildSourceImportNode(dsId, null, lastImport, null, null)); DataSourceImport d3 = new DataSourceImportImpl( builder.buildSourceImportNode("other id", caller, lastImport, overwritePolicy, interval, customIntervalLength)); assertEquals(d1, d2); assertEquals(d1.hashCode(), d2.hashCode()); assertFalse(d1.equals(new Object())); assertNotEquals(d1, d3); } /** missing last import source is ignored */ public void missingLastImport() { ObjectNode node = builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, interval, customIntervalLength); node.remove("when"); registerSingleImport(node); assertEquals(service.getDataSourceImports(dsId).load().toList(), Collections.emptyList()); } /** null last import source is ignored */ public void nullLastImport() { registerSingleImport(builder.buildSourceImportNode(id, caller, null, overwritePolicy, interval, customIntervalLength)); assertEquals(service.getDataSourceImports(dsId).load().toList(), Collections.emptyList()); } /** invalid last import source is ignored */ public void invalidLastImport() { registerSingleImport( builder.buildSourceImportNode(id, caller, "not a date", overwritePolicy, interval, customIntervalLength)); assertEquals(service.getDataSourceImports(dsId).load().toList(), Collections.emptyList()); } /** missing interval means no scheduling */ public void missingInterval() { ObjectNode node = builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, interval, customIntervalLength); node.remove("repeateInterval"); registerSingleImport(node); assertNull(service.getDataSourceImports(dsId).load().toList().get(0).getRepeatInterval()); } /** null interval means no scheduling */ public void nullInterval() { registerSingleImport(builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, null, customIntervalLength)); assertNull(service.getDataSourceImports(dsId).load().toList().get(0).getRepeatInterval()); } /** sources with invalid intervals are ignored */ public void invalidInterval() { registerSingleImport( builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, "not an interval type", customIntervalLength)); assertEquals(service.getDataSourceImports(dsId).load().toList(), Collections.emptyList()); } /** custom interval with missing length is invalid */ public void customIntervalMissingLength() { ObjectNode node = builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, interval, customIntervalLength); node.remove("repeateIntervalCustom"); registerSingleImport(node); assertEquals(service.getDataSourceImports(dsId).load().toList(), Collections.emptyList()); } /** custom interval with null length is invalid */ public void customIntervalNullLength() { registerSingleImport(builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, interval, null)); assertEquals(service.getDataSourceImports(dsId).load().toList(), Collections.emptyList()); } /** custom interval with invalid length is invalid */ public void customIntervalInvalidLength() { ObjectNode node = builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, interval, customIntervalLength); node.put("repeateIntervalCustom", "not a number"); registerSingleImport(node); assertEquals(service.getDataSourceImports(dsId).load().toList(), Collections.emptyList()); } /** custom interval with negative length is invalid */ public void customIntervalNegativeLength() { registerSingleImport(builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, interval, -11)); assertEquals(service.getDataSourceImports(dsId).load().toList(), Collections.emptyList()); } /** custom interval with zero length is invalid */ public void customIntervalZeroLength() { registerSingleImport(builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, interval, 0)); assertEquals(service.getDataSourceImports(dsId).load().toList(), Collections.emptyList()); } /** missing policy means no overwrite */ public void missingOverwritePolicy() { ObjectNode node = builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, interval, customIntervalLength); node.remove("overwritingPolicy"); registerSingleImport(node); assertFalse(service.getDataSourceImports(dsId).load().toList().get(0).isOverwriting()); } /** null policy means no overwrite */ public void nullOverwritePolicy() { registerSingleImport(builder.buildSourceImportNode(id, caller, lastImport, null, interval, customIntervalLength)); assertFalse(service.getDataSourceImports(dsId).load().toList().get(0).isOverwriting()); } /** empty string policy means no overwrite */ public void emptyOverwritePolicy() { registerSingleImport(builder.buildSourceImportNode(id, caller, lastImport, "", interval, customIntervalLength)); assertFalse(service.getDataSourceImports(dsId).load().toList().get(0).isOverwriting()); } /** any other policy means overwrite */ public void otherOverwritePolicy() { registerSingleImport( builder.buildSourceImportNode(id, caller, lastImport, "some policy", interval, customIntervalLength)); assertTrue(service.getDataSourceImports(dsId).load().toList().get(0).isOverwriting()); } /** interval units are parsed correctly */ @Test(dataProvider = "intervalUnits") public void predefinedInterval(String interval, ImportIntervalUnit unit, int factor, int minutes) { registerSingleImport(builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, interval)); ImportInterval result = service.getDataSourceImports(dsId).load().toList().get(0).getRepeatInterval(); assertEquals(result.getMinutes(), minutes); assertEquals(result.getUnit(), unit); assertEquals(result.getFactor(), factor); } /** custom numbers are ignored with non-CUSTOM interval */ public void predefinedWithNumber() { registerSingleImport(builder.buildSourceImportNode(id, caller, lastImport, overwritePolicy, "HOUR", 123)); assertEquals(service.getDataSourceImports(dsId).load().toList().get(0).getRepeatInterval().getMinutes(), 60); } private void registerSingleImport(JsonNode node) { server.registerPaginatedItem(importUri, "executions", node); } }