package uk.ac.ox.zoo.seeg.abraid.mp.dataacquisition.acquirers.csv.domain;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests the CsvDiseaseOccurrence class.
*
* Copyright (c) 2014 University of Oxford
*/
public class CsvDiseaseOccurrenceTest {
@Test
public void readCsvFileReturnsAnEmptyListIfInputIsNull() throws Exception {
List<CsvDiseaseOccurrence> occurrences = CsvDiseaseOccurrence.readFromCsv(null);
assertThat(occurrences).isEmpty();
}
@Test
public void readCsvFileReturnsAnEmptyListIfInputIsEmpty() throws Exception {
List<CsvDiseaseOccurrence> occurrences = CsvDiseaseOccurrence.readFromCsv("");
assertThat(occurrences).isEmpty();
}
@Test
public void readCsvFileReturnsAnEmptyListIfInputOnlyHasTheHeaderRow() throws Exception {
String csv = "Site,Longitude,Latitude,Precision,Country,Disease,Occurrence Date,Title,Summary,URL\n";
List<CsvDiseaseOccurrence> occurrences = CsvDiseaseOccurrence.readFromCsv(csv);
assertThat(occurrences).isEmpty();
}
@Test
public void readCsvFileReadsOneUnterminatedValidLineSuccessfully() throws Exception {
String csv = "Site,Longitude,Latitude,Precision,Country,Disease,Occurrence Date,Title,Summary,URL\n" +
"\"Scott County, Kentucky, United States\"";
List<CsvDiseaseOccurrence> occurrences = CsvDiseaseOccurrence.readFromCsv(csv);
assertThat(occurrences).hasSize(1);
assertThat(occurrences.get(0).getSite()).isEqualTo("Scott County, Kentucky, United States");
}
@Test
public void readCsvFileReadsOneLineAndOneUnterminatedLineSuccessfully() throws Exception {
String csv = "Site,Longitude,Latitude,Precision,Country,Disease,Occurrence Date,Title,Summary,URL\n" +
"\"Scott County, Kentucky, United States\"\n" +
"Chelyabinsk Oblast";
List<CsvDiseaseOccurrence> occurrences = CsvDiseaseOccurrence.readFromCsv(csv);
assertThat(occurrences).hasSize(2);
assertThat(occurrences.get(0).getSite()).isEqualTo("Scott County, Kentucky, United States");
assertThat(occurrences.get(1).getSite()).isEqualTo("Chelyabinsk Oblast");
}
@Test
public void readCsvFileReadsValidLinesSuccessfully() throws Exception {
// The CSV reader allows:
// * double-quoted fields (there must be no whitespace around the double quotes or the parser can get confused)
// * whitespace around fields
// * missing columns (but not extra columns)
// * any valid value in the Double columns
// * Windows, Unix or Mac line separators
// There must be a header line, the contents of which are ignored (the column order is fixed).
// Arrange
String csv =
"Site,Longitude,Latitude,Precision,Country,Disease,Occurrence Date,Feed,Alert Title,Summary,URL,Redundant Extra Header Column\n" +
"\" Ingombota, Luanda, Angola \", 13.22884, -8.8179,PRECISE, Angola , Cholera ,\"30/06/2006\",SEEG data 2014,\"PRO/EDR> Cholera, diarrhea & dysentery update 2006 (27)\",,http://promedmail.org/direct.php?id=20060630.1807\r\n" +
"Bangladesh,,23,COUNTRY,Bangladesh,Smallpox,2007,SEEG data 2014,\"Small pox: State alert to stay till WHO confirmation\",\"AGARTALA: The central government has sounded a health alert in India's northeast asking authorities to take immediate precautionary measures following reports of a smallpox outbreak in Bangladesh and Myanmar, officials said Monday. 'Following the\",\"http://c.moreover.com/click/here.pl?r962376995\"\r" +
"831274,00021.58105000,\"-9.5989\",precise,Indonesia,P. falciparum,2006,Malaria Atlas Project human infection data 2014\n";
// Act
List<CsvDiseaseOccurrence> occurrences = CsvDiseaseOccurrence.readFromCsv(csv);
// Assert
assertThat(occurrences).hasSize(3);
assertThat(occurrences.get(0)).isEqualTo(new CsvDiseaseOccurrence("Ingombota, Luanda, Angola", 13.22884,
-8.8179, "PRECISE", "Angola", "Cholera", "30/06/2006", "SEEG data 2014",
"PRO/EDR> Cholera, diarrhea & dysentery update 2006 (27)", null,
"http://promedmail.org/direct.php?id=20060630.1807"));
assertThat(occurrences.get(1)).isEqualTo(new CsvDiseaseOccurrence("Bangladesh", null, 23.0, "COUNTRY",
"Bangladesh", "Smallpox", "2007", "SEEG data 2014", "Small pox: State alert to stay till WHO confirmation",
"AGARTALA: The central government has sounded a health alert in India's northeast asking authorities to take immediate precautionary measures following reports of a smallpox outbreak in Bangladesh and Myanmar, officials said Monday. 'Following the",
"http://c.moreover.com/click/here.pl?r962376995"));
assertThat(occurrences.get(2)).isEqualTo(new CsvDiseaseOccurrence("831274", 21.58105, -9.5989, "precise",
"Indonesia", "P. falciparum", "2006", "Malaria Atlas Project human infection data 2014", null, null, null));
}
@Test(expected = IOException.class)
public void readCsvFileThrowsExceptionIfTooManyColumns() throws Exception {
String csv = "Site,Longitude,Latitude,Precision,Country,Disease,Occurrence Date,Feed,Alert Title,Summary,URL\n" +
"My site,10,20,PRECISE,England,Dengue,2012,My feed,My title,My summary,My URL,Extra column\n";
CsvDiseaseOccurrence.readFromCsv(csv);
}
@Test(expected = IOException.class)
public void readCsvFileThrowsExceptionOnInvalidDouble() throws Exception {
String csv = "Site,Longitude,Latitude,Precision,Country,Disease,Occurrence Date,Title,Summary,URL\n" +
"My site,Invalid Double,20,PRECISE,England,Dengue,2012,My title,My summary,My URL\n";
CsvDiseaseOccurrence.readFromCsv(csv);
}
@Test(expected = IOException.class)
public void readCsvFileThrowsExceptionOnInvalidDouble2() throws Exception {
String csv = "Site,Longitude,Latitude,Precision,Country,Disease,Occurrence Date,Title,Summary,URL\n" +
"My site,\"1,4\",20,PRECISE,England,Dengue,2012,My title,My summary,My URL\n";
CsvDiseaseOccurrence.readFromCsv(csv);
}
}