package uk.ac.ox.zoo.seeg.abraid.mp.dataacquisition.acquirers.csv;
import org.junit.Test;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.LocationPrecision;
import uk.ac.ox.zoo.seeg.abraid.mp.dataacquisition.acquirers.DataAcquisitionException;
import uk.ac.ox.zoo.seeg.abraid.mp.dataacquisition.acquirers.csv.domain.CsvDiseaseOccurrence;
import static com.googlecode.catchexception.CatchException.catchException;
import static com.googlecode.catchexception.CatchException.caughtException;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests the CsvDiseaseOccurrenceValidator class.
*
* Copyright (c) 2014 University of Oxford
*/
public class CsvDiseaseOccurrenceValidatorTest {
@Test
public void validatorIsSuccessfulWithValidOccurrence() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
CsvDiseaseOccurrenceValidator validator = new CsvDiseaseOccurrenceValidator(occurrence);
validator.validate();
}
@Test
public void validatorFailsIfSiteIsMissing() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
occurrence.setSite("");
validateAndExpectFailure(occurrence, "Site is missing");
}
@Test
public void validatorFailsIfSiteIsTooLong() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
occurrence.setSite(fillString(1001));
validateAndExpectFailure(occurrence, "Site is too long (maximum 1000 characters)");
}
@Test
public void validatorFailsIfLongitudeIsMissing() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
occurrence.setLongitude(null);
validateAndExpectFailure(occurrence, "Longitude is missing");
}
@Test
public void validatorFailsIfLongitudeIsTooLow() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
occurrence.setLongitude(-180.00001);
validateAndExpectFailure(occurrence, "Longitude is -180.00001, which is out of range (-180.00000 to 180.00000)");
}
@Test
public void validatorFailsIfLongitudeIsTooHigh() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
occurrence.setLongitude(180.00001);
validateAndExpectFailure(occurrence, "Longitude is 180.00001, which is out of range (-180.00000 to 180.00000)");
}
@Test
public void validatorFailsIfLatitudeIsMissing() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
occurrence.setLatitude(null);
validateAndExpectFailure(occurrence, "Latitude is missing");
}
@Test
public void validatorFailsIfLatitudeIsTooLow() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
occurrence.setLatitude(-90.00001);
validateAndExpectFailure(occurrence, "Latitude is -90.00001, which is out of range (-90.00000 to 90.00000)");
}
@Test
public void validatorFailsIfLatitudeIsTooHigh() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
occurrence.setLatitude(90.00001);
validateAndExpectFailure(occurrence, "Latitude is 90.00001, which is out of range (-90.00000 to 90.00000)");
}
@Test
public void validatorFailsIfPrecisionIsMissing() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
occurrence.setPrecision(null);
validateAndExpectFailure(occurrence, "Precision is missing");
}
@Test
public void validatorFailsIfCountryNameIsMissing() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
occurrence.setCountryName(" ");
validateAndExpectFailure(occurrence, "Country is missing");
}
@Test
public void validatorFailsIfDiseaseGroupNameIsMissing() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
occurrence.setDiseaseGroupName(" ");
validateAndExpectFailure(occurrence, "Disease is missing");
}
@Test
public void validatorFailsIfOccurrenceDateIsMissing() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
occurrence.setOccurrenceDate(" ");
validateAndExpectFailure(occurrence, "Occurrence date is missing");
}
@Test
public void validatorFailsIfUrlIsTooLong() {
CsvDiseaseOccurrence occurrence = createValidCsvDiseaseOccurrence();
occurrence.setUrl(fillString(2001));
validateAndExpectFailure(occurrence, "URL is too long (maximum 2000 characters)");
}
private void validateAndExpectFailure(CsvDiseaseOccurrence occurrence, String errorMessage) {
CsvDiseaseOccurrenceValidator validator = new CsvDiseaseOccurrenceValidator(occurrence);
catchException(validator).validate();
assertThat(caughtException()).isInstanceOf(DataAcquisitionException.class);
assertThat(caughtException()).hasMessage(errorMessage);
}
private CsvDiseaseOccurrence createValidCsvDiseaseOccurrence() {
CsvDiseaseOccurrence occurrence = new CsvDiseaseOccurrence();
occurrence.setSite(fillString(1000));
occurrence.setLongitude(51.75042);
occurrence.setLatitude(-1.24759);
occurrence.setPrecision(LocationPrecision.PRECISE.name());
occurrence.setCountryName("United Kingdom");
occurrence.setDiseaseGroupName("Dengue");
occurrence.setOccurrenceDate("10/09/2014");
occurrence.setFeedName("SEEG Data 2014");
occurrence.setAlertTitle("Disease occurrence title");
return occurrence;
}
private String fillString(int numberOfCharacters) {
return new String(new char[numberOfCharacters]).replace("\0", "A");
}
}