package eu.balticdiversity.feedreaders;
import fi.luomus.commons.db.connectivity.ConnectionDescription;
import fi.luomus.commons.db.connectivity.PreparedStatementStoringAndClosingTransactionConnection;
import fi.luomus.commons.db.connectivity.TransactionConnection;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class DocumentQueueServiceDAOTest {
private ConnectionDescription description;
private DocumentQueueServiceDAO documentQueueServiceDAO;
@Before
public void setUp() throws Exception {
Properties props = new Properties();
// store in classpath, not included in repository obviously
InputStream stream = this.getClass().getClassLoader().getResourceAsStream("test_db_settings.properties");
if (stream == null) {
throw new RuntimeException("test db settings not available");
}
props.load(stream);
String driver = props.getProperty("driver");
String username = props.getProperty("username");
String password = props.getProperty("password");
String url = props.getProperty("url");
description = new ConnectionDescription(driver, url, username, password);
documentQueueServiceDAO = new DocumentQueueServiceDAO(description);
resetDbs();
}
@After
public void tearDown() throws SQLException {
documentQueueServiceDAO.close();
documentQueueServiceDAO = null;
}
@Test
public void testSaveQueue() throws Exception {
assertEquals(0, documentQueueServiceDAO.getDocumentQueue(50).size());
addToQueue("http://www.mock.com", "id", 1);
List<DBFeedEntry> documentQueue = documentQueueServiceDAO.getDocumentQueue(50);
assertEquals(1, documentQueue.size());
assertEquals(new URI("http://www.mock.com"), documentQueue.get(0).getUri());
assertEquals(1, documentQueue.get(0).getSourceID());
addToQueue("http://www.foo.com", "id", 2);
documentQueue = documentQueueServiceDAO.getDocumentQueue(50);
assertEquals(2, documentQueue.size());
assertEquals(new URI("http://www.foo.com"), documentQueue.get(1).getUri());
assertEquals(2, documentQueue.get(1).getSourceID());
}
@Test
public void testQueueLimit() throws Exception {
assertEquals(0, documentQueueServiceDAO.getDocumentQueue(5).size());
addToQueue("http://www.mock.com/1", "id", 1);
addToQueue("http://www.mock.com/2", "id", 2);
addToQueue("http://www.mock.com/3", "id", 3);
assertEquals(3, documentQueueServiceDAO.getDocumentQueue(50).size());
assertEquals(3, documentQueueServiceDAO.getDocumentQueue(3).size());
assertEquals(1, documentQueueServiceDAO.getDocumentQueue(1).size());
assertEquals(1, documentQueueServiceDAO.getDocumentQueue(1).get(0).getSourceID());
assertEquals(2, documentQueueServiceDAO.getDocumentQueue(2).get(1).getSourceID());
}
@Test
public void saveSingle() throws Exception {
assertEquals(0, getFiles().size());
addToQueue("http://www.mock.com", "id", 5);
List<DBFeedEntry> entries = documentQueueServiceDAO.getDocumentQueue(50);
assertEquals(1, entries.size());
documentQueueServiceDAO.saveDocumentAndRemoveFromQueue("doc", entries.get(0));
List<SavedDocument> files = getFiles();
assertEquals(1, files.size());
assertEquals("id", files.get(0).getDocumentId());
assertEquals("doc", files.get(0).getDocument());
assertEquals(5, files.get(0).getSourceId());
assertEquals(0, documentQueueServiceDAO.getDocumentQueue(50).size());
}
@Test
public void saveSingleMultipleQueues() throws Exception {
for (int i = 0; i < 5; i++) {
addToQueue("http://www.mock.com", "id", 5);
Thread.sleep(100);
}
List<DBFeedEntry> queue = documentQueueServiceDAO.getDocumentQueue(50);
assertEquals(5, queue.size());
DBFeedEntry entry = queue.get(2);
assertNotNull(entry.getId());
documentQueueServiceDAO.saveDocumentAndRemoveFromQueue("doc", entry);
queue = documentQueueServiceDAO.getDocumentQueue(50);
assertEquals(4, queue.size());
for (DBFeedEntry remainingEntry : queue) {
if (remainingEntry.getId().equals(entry.getId())) {
fail("wrong entry deleted");
}
}
}
@Test
public void testSaveNotInQueue() throws Exception {
assertEquals(0, getFiles().size());
try {
DBFeedEntry entry = getDBFeedEntry("http://www.mock.com", "id", 5);
entry.setId(1);
documentQueueServiceDAO.saveDocumentAndRemoveFromQueue("doc", entry);
fail("no error");
} catch (Exception e) {
assertEquals(0, getFiles().size());
}
}
@Test
public void testLastReadSequence() throws Exception {
DAO dao = new DAO(description, 10);
assertNull(dao.getLastReadSequence());
dao.setLastReadSequence(10L);
assertEquals(Long.valueOf(10), dao.getLastReadSequence());
dao.setLastReadSequence(20L);
assertEquals(Long.valueOf(20), dao.getLastReadSequence());
}
private DBFeedEntry getDBFeedEntry(String uri, String documentId, int sourceId) throws URISyntaxException {
DBFeedEntry dbFeedEntry = new DBFeedEntry();
dbFeedEntry.setDocumentId(documentId);
dbFeedEntry.setSourceID(sourceId);
dbFeedEntry.setUri(new URI(uri));
return dbFeedEntry;
}
private void addToQueue(String uri, String docId, int sourceId) throws Exception {
DAO dao;
dao = new DAO(description, sourceId);
FeedEntry feedEntry = new FeedEntry();
feedEntry.setDocumentId(docId);
feedEntry.setSourceID(sourceId);
feedEntry.setUri(new URI(uri));
dao.addDocumentToQueue(feedEntry);
dao.close();
}
private List<SavedDocument> getFiles() throws Exception {
TransactionConnection con = new PreparedStatementStoringAndClosingTransactionConnection(description);
PreparedStatement query = con.prepareStatement("SELECT * FROM ETL.XMLFile");
ResultSet rs = query.executeQuery();
List<SavedDocument> savedDocuments = new ArrayList<SavedDocument>();
while (rs.next()) {
savedDocuments.add(new SavedDocument(rs.getString("DocumentID"),
rs.getString("XMLData"), rs.getInt("SourceFK")));
}
query.close();
rs.close();
con.release();
return savedDocuments;
}
private void resetDbs() throws SQLException {
TransactionConnection con = new PreparedStatementStoringAndClosingTransactionConnection(description);
con.prepareStatement("DELETE FROM ETL.XMLQueue").execute();
con.prepareStatement("DELETE FROM ETL.XMLFile").execute();
con.prepareStatement("DELETE FROM ETL.XMLSequence").execute();
con.release();
}
private class SavedDocument {
private final String documentId;
private final String document;
private final int sourceId;
private SavedDocument(String documentId, String document, int sourceId) {
this.documentId = documentId;
this.document = document;
this.sourceId = sourceId;
}
private String getDocumentId() {
return documentId;
}
private String getDocument() {
return document;
}
private int getSourceId() {
return sourceId;
}
}
}