package com.belladati.sdk.dataset.impl; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.belladati.sdk.dataset.data.OverwritePolicy; import com.belladati.sdk.dataset.source.DataSource; import com.belladati.sdk.dataset.source.DataSourcePendingImport; import com.belladati.sdk.dataset.source.ImportIntervalUnit; import com.belladati.sdk.dataset.source.impl.DataSourceImpl; import com.belladati.sdk.impl.BellaDatiServiceImpl; import com.belladati.sdk.test.SDKTest; import com.belladati.sdk.test.TestRequestHandler; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @Test public class DataSourcePendingImportTest extends SDKTest { private final String id = "id"; private final String requestUri = String.format("/api/dataSets/dataSources/%s/schedule", id); private final Date date = new Date(123); private DataSource dataSource; private DataSourcePendingImport pending; @BeforeMethod(alwaysRun = true) protected void setupSource() throws Exception { dataSource = new DataSourceImpl(service, builder.buildDataSourceNode(id, "", "")); pending = dataSource.setupImport(date); } /** setting only a date from a source */ public void dateOnlyFromSource() { JsonNode expected = new ObjectMapper().createObjectNode().put("when", new SimpleDateFormat(BellaDatiServiceImpl.DATE_TIME_FORMAT).format(date)); assertEquals(dataSource.setupImport(date).toJson(), expected); } /** setting only a date from service */ public void dateOnlyFromService() { Date date = new Date(123); JsonNode expected = new ObjectMapper().createObjectNode().put("when", new SimpleDateFormat(BellaDatiServiceImpl.DATE_TIME_FORMAT).format(date)); assertEquals(service.setupDataSourceImport(id, date).toJson(), expected); } /** posting to server sends JSON */ public void postToServer() { server.register(requestUri, new TestRequestHandler() { @Override protected void handle(HttpHolder holder) throws IOException { assertEquals(holder.getFormParameters().get("params"), pending.toJson().toString()); } }); pending.post(); server.assertRequestUris(requestUri); } /** check initial field values */ public void initialValues() { assertNull(pending.getRepeatInterval()); assertSame(pending.getOverwritePolicy(), OverwritePolicy.deleteNone()); assertFalse(pending.isOverwriting()); } /** overwrite policy can be set */ public void setPolicy() { pending.setOverwritePolicy(OverwritePolicy.byAllAttributes()); assertSame(pending.getOverwritePolicy(), OverwritePolicy.byAllAttributes()); assertTrue(pending.isOverwriting()); assertEquals(pending.toJson().get("overwrite"), OverwritePolicy.byAllAttributes().toJson()); } /** policy can be unset after setting */ public void setUnsetPolicy() { pending.setOverwritePolicy(OverwritePolicy.byAllAttributes()); pending.setOverwritePolicy(OverwritePolicy.deleteNone()); assertSame(pending.getOverwritePolicy(), OverwritePolicy.deleteNone()); assertFalse(pending.isOverwriting()); assertNull(pending.toJson().get("overwrite")); } /** null policy means delete none */ public void nullPolicy() { pending.setOverwritePolicy(OverwritePolicy.byAllAttributes()); pending.setOverwritePolicy(null); assertSame(pending.getOverwritePolicy(), OverwritePolicy.deleteNone()); assertFalse(pending.isOverwriting()); assertNull(pending.toJson().get("overwrite")); } /** can set an interval */ @Test(dataProvider = "intervalUnits") public void setInterval(String interval, ImportIntervalUnit unit, int factor, int minutes) { pending.setRepeatInterval(unit, factor); assertEquals(pending.getRepeatInterval().getMinutes(), minutes); assertEquals(pending.toJson().get("repeateInterval").asText(), interval); assertNull(pending.toJson().get("customRepeateInterval")); } /** can set a custom interval */ public void setMinuteInterval() { pending.setRepeatInterval(ImportIntervalUnit.MINUTE, 30); assertEquals(pending.getRepeatInterval().getMinutes(), 30); assertEquals(pending.toJson().get("repeateInterval").asText(), "CUSTOM"); assertEquals(pending.toJson().get("customRepeateInterval").asInt(), 30); } /** can set a new interval as custom */ public void setNewInterval() { pending.setRepeatInterval(ImportIntervalUnit.HOUR, 3); assertEquals(pending.getRepeatInterval().getMinutes(), 180); assertEquals(pending.toJson().get("repeateInterval").asText(), "CUSTOM"); assertEquals(pending.toJson().get("customRepeateInterval").asInt(), 180); } /** unset interval by setting negative */ public void negativeInterval() { pending.setRepeatInterval(ImportIntervalUnit.MINUTE, 10).setRepeatInterval(ImportIntervalUnit.MINUTE, -10); assertNull(pending.getRepeatInterval()); assertNull(pending.toJson().get("repeateInterval")); assertNull(pending.toJson().get("customRepeateInterval")); } /** unset interval by setting zero */ public void zeroInterval() { pending.setRepeatInterval(ImportIntervalUnit.MINUTE, 10).setRepeatInterval(ImportIntervalUnit.MINUTE, 0); assertNull(pending.getRepeatInterval()); assertNull(pending.toJson().get("repeateInterval")); assertNull(pending.toJson().get("customRepeateInterval")); } /** unset interval by setting zero */ public void nullUnitInterval() { pending.setRepeatInterval(ImportIntervalUnit.MINUTE, 10).setRepeatInterval(null, 10); assertNull(pending.getRepeatInterval()); assertNull(pending.toJson().get("repeateInterval")); assertNull(pending.toJson().get("customRepeateInterval")); } /** can't change policy after posting */ @Test(expectedExceptions = IllegalStateException.class) public void setPolicyAfterPost() { server.register(requestUri, ""); pending.post(); pending.setOverwritePolicy(OverwritePolicy.deleteNone()); } /** can't change interval after posting */ @Test(expectedExceptions = IllegalStateException.class) public void setIntervalAfterPost() { server.register(requestUri, ""); pending.post(); pending.setRepeatInterval(ImportIntervalUnit.MINUTE, 10); } /** can't post again after posting */ @Test(expectedExceptions = IllegalStateException.class) public void postAfterPost() { server.register(requestUri, ""); pending.post(); pending.post(); } }