package nl.ipo.cds.etl.db; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringReader; import java.io.StringWriter; import java.sql.Date; import nl.idgis.commons.utils.DateTimeUtils; import nl.ipo.cds.etl.test.TestData; import nl.ipo.cds.etl.theme.protectedSite.ProtectedSite; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Before; import org.junit.Test; public class DBWriterTest { private static final String TEST_DATASET_ID = "0"; private static final String TEST_ID = "TEST.ID.0"; private static final Log logger = LogFactory.getLog(DBWriterTest.class); private DBWriterFactory<ProtectedSite> dbWriterFactory; private void assertOccurrence(int expected, String line, String str) { int count = 0, index = line.indexOf(str); while(index != -1) { count++; index = line.indexOf(str, index + str.length()); } assertEquals(expected, count); } @Before public void setUp() { dbWriterFactory = new DBWriterFactory<ProtectedSite>(ProtectedSite.class, "dataset_id", TEST_DATASET_ID); } @Test public void testQuery() throws IOException { String query = dbWriterFactory.getQuery(); assertTrue(query.startsWith("copy ")); assertFalse(query.indexOf("bron.protected_site") == -1); int open = query.indexOf("("); int close = query.indexOf(")"); assertFalse(open == -1); assertFalse(close == -1); String columnsString = query.substring(open + 1, close); assertOccurrence(8, columnsString, ", "); String[] columns = columnsString.split(", "); assertEquals(9, columns.length); assertFalse(query.indexOf("csv") == -1); } @Test public void testSingleRecord() throws IOException { StringWriter stringWriter = new StringWriter(); DBWriter<ProtectedSite> dbWriter = dbWriterFactory.getDBWriter(stringWriter); final Date now = new Date (DateTimeUtils.now ().getTime ()); ProtectedSite ps = new ProtectedSite(); ps.setInspireID(""); ps.setId(TEST_ID); ps.setSiteProtectionClassification (new String[] { "cultural", "ecological" }); ps.setLegalFoundationDate (now); dbWriter.writeObject(ps); BufferedReader bufferedReader = new BufferedReader(new StringReader(stringWriter.getBuffer().toString())); String line = bufferedReader.readLine(); assertNotNull(line); assertOccurrence(8, line, ","); // 9 columns -> 8 separators String[] columns = line.split(","); assertEquals(9, columns.length); int nulls = 0, empties = 0, ids = 0, datasetIds = 0, lists = 0, dates = 0; for(String column : columns) { if(column.isEmpty()) { column = null; } else { assertEquals('"', column.charAt(0)); assertEquals('"', column.charAt(column.length() - 1)); column = column.substring(1, column.length() - 1); } if(column == null) { nulls++; } else if(column.equals("")) { empties++; } else if(column.equals(TEST_ID)) { ids++; } else if(column.equals(TEST_DATASET_ID)) { datasetIds++; } else if (column.contains ("|")) { ++ lists; } else if (column.equals (now.toString ())) { ++ dates; } } assertEquals(1, empties); assertEquals(4, nulls); assertEquals(1, ids); assertEquals(1, datasetIds); assertEquals (1, lists); assertEquals (1, dates); line = bufferedReader.readLine(); assertNull(line); } @Test public void testFeatureCollection() throws Exception { File tempFile = File.createTempFile("test", ".sql"); logger.info(tempFile); FileWriter writer = new FileWriter(tempFile); PrintWriter printWriter = new PrintWriter(writer); DBWriter<ProtectedSite> dbWriter = dbWriterFactory.getDBWriter(printWriter); printWriter.println(dbWriterFactory.getQuery() + ";"); TestData testData = new TestData(); Iterable<ProtectedSite> stilteGebieden = testData.getProtectedSites(); int count = 0; for(ProtectedSite stilteGebied : stilteGebieden) { assertNotNull(stilteGebied); dbWriter.writeObject(stilteGebied); count++; } assertEquals(33, count); printWriter.close(); } }