package uk.ac.ox.zoo.seeg.abraid.mp.dataacquisition.acquirers.healthmap;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.DiseaseOccurrence;
import uk.ac.ox.zoo.seeg.abraid.mp.common.web.JsonParserException;
import uk.ac.ox.zoo.seeg.abraid.mp.common.web.WebServiceClient;
import uk.ac.ox.zoo.seeg.abraid.mp.dataacquisition.acquirers.DataAcquisitionException;
import uk.ac.ox.zoo.seeg.abraid.mp.dataacquisition.acquirers.ManualValidationEnforcer;
import uk.ac.ox.zoo.seeg.abraid.mp.dataacquisition.acquirers.healthmap.domain.HealthMapLocation;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static com.googlecode.catchexception.CatchException.catchException;
import static com.googlecode.catchexception.CatchException.caughtException;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.*;
/**
* Integration tests for the HealthMapDataAcquirer class.
*
* Copyright (c) 2014 University of Oxford
*/
public class HealthMapDataAcquirerIntegrationTest {
private HealthMapWebService webService;
private HealthMapDataConverter dataConverter;
private HealthMapLookupData lookupData;
private ManualValidationEnforcer manualValidationEnforcer;
@Before
public void resetMocks() {
webService = new HealthMapWebService(mock(WebServiceClient.class));
dataConverter = mock(HealthMapDataConverter.class);
lookupData = mock(HealthMapLookupData.class);
manualValidationEnforcer = mock(ManualValidationEnforcer.class);
}
@Test
public void acquiresDataFromOneFile() {
// Arrange
String fileName = "DataAcquisition/test/uk/ac/ox/zoo/seeg/abraid/mp/dataacquisition/acquirers/healthmap/healthmap_json_empty.txt";
List<HealthMapLocation> locations = new ArrayList<>();
// Act
HealthMapDataAcquirer dataAcquisition = new HealthMapDataAcquirer(webService, dataConverter, lookupData, manualValidationEnforcer);
dataAcquisition.acquireDataFromFile(fileName);
// Assert
verify(dataConverter).convert(eq(locations), eq((DateTime) null));
}
@Test
public void doesNotAcquireDataFromInvalidFile() {
// Arrange
String fileName = "DataAcquisition/test/uk/ac/ox/zoo/seeg/abraid/mp/dataacquisition/acquirers/healthmap/healthmap_json_invalid.txt";
List<HealthMapLocation> locations = new ArrayList<>();
// Act
HealthMapDataAcquirer dataAcquisition = new HealthMapDataAcquirer(webService, dataConverter, lookupData, manualValidationEnforcer);
catchException(dataAcquisition).acquireDataFromFile(fileName);
// Assert
verify(dataConverter, never()).convert(eq(locations), eq((DateTime) null));
assertThat(caughtException()).isInstanceOf(DataAcquisitionException.class);
assertThat(caughtException().getCause()).isInstanceOf(JsonParserException.class);
}
@Test
public void doesNotAcquireDataFromNonExistentFile() {
// Arrange
String fileName = "DataAcquisition/test/uk/ac/ox/zoo/seeg/abraid/mp/dataacquisition/healthmap/does_not_exist.txt";
List<HealthMapLocation> locations = new ArrayList<>();
// Act
HealthMapDataAcquirer dataAcquisition = new HealthMapDataAcquirer(webService, dataConverter, lookupData, manualValidationEnforcer);
catchException(dataAcquisition).acquireDataFromFile(fileName);
// Assert
verify(dataConverter, never()).convert(eq(locations), eq((DateTime) null));
assertThat(caughtException()).isInstanceOf(DataAcquisitionException.class);
assertThat(caughtException().getCause()).isInstanceOf(IOException.class);
}
@Test
public void acquiresDataFromWebServiceCallsManualValidationEnforcerAfterSuccess() {
// Arrange
String fileName = "DataAcquisition/test/uk/ac/ox/zoo/seeg/abraid/mp/dataacquisition/acquirers/healthmap/healthmap_json_empty.txt";
List<HealthMapLocation> locations = new ArrayList<>();
Set<DiseaseOccurrence> occurrences = new HashSet<>();
when(dataConverter.convert(eq(locations), eq((DateTime) null))).thenReturn(occurrences);
// Act
HealthMapDataAcquirer dataAcquisition = new HealthMapDataAcquirer(webService, dataConverter, lookupData, manualValidationEnforcer);
dataAcquisition.acquireDataFromFile(fileName);
// Assert
verify(manualValidationEnforcer).addRandomSubsetToManualValidation(same(occurrences));
}
@Test
public void acquiresDataFromWebServiceDoesNotCallsManualValidationEnforcerAfterFailure() {
// Arrange
String fileName = "DataAcquisition/test/uk/ac/ox/zoo/seeg/abraid/mp/dataacquisition/healthmap/healthmap_json_empty.txt";
List<HealthMapLocation> locations = new ArrayList<>();
// Act
HealthMapDataAcquirer dataAcquisition = new HealthMapDataAcquirer(webService, dataConverter, lookupData, manualValidationEnforcer);
catchException(dataAcquisition).acquireDataFromFile(fileName);
// Assert
verify(dataConverter, never()).convert(eq(locations), eq((DateTime) null)); // null occurrences
// Assert
verify(manualValidationEnforcer, never()).addRandomSubsetToManualValidation(anySetOf(DiseaseOccurrence.class));
}
}