package uk.ac.ox.zoo.seeg.abraid.mp.common.dao;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import uk.ac.ox.zoo.seeg.abraid.mp.common.AbstractCommonSpringIntegrationTests;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests the ModelRunDao class.
* Copyright (c) 2014 University of Oxford
*/
public class ModelRunDaoTest extends AbstractCommonSpringIntegrationTests {
@Autowired
private ModelRunDao modelRunDao;
@Autowired
private DiseaseGroupDao diseaseGroupDao;
@Autowired
private CovariateFileDao covariateFileDao;
@Autowired
private DiseaseOccurrenceDao diseaseOccurrenceDao;
@Autowired
private AdminUnitGlobalDao adminUnitGlobalDao;
@Autowired
private AdminUnitTropicalDao adminUnitTropicalDao;
@Autowired
private DiseaseExtentClassDao diseaseExtentClassDao;
private ModelRun modelRunDengue1;
private ModelRun modelRunDengue2;
private ModelRun modelRunDengue3;
private ModelRun modelRunDengue4;
private ModelRun modelRunDengue5;
private ModelRun modelRunDengue6;
private ModelRun modelRunMalarias1;
@Before
public void setUp() {
modelRunDengue1 = createModelRun("dengue 1", 87, ModelRunStatus.IN_PROGRESS, "host1", "2014-07-01", null);
modelRunDengue2 = createModelRun("dengue 2", 87, ModelRunStatus.COMPLETED, "host1", "2014-07-01", "2014-07-04");
modelRunDengue3 = createModelRun("dengue 3", 87, ModelRunStatus.COMPLETED, "host3", "2014-07-03", "2014-07-03");
modelRunDengue4 = createModelRun("dengue 4", 87, ModelRunStatus.IN_PROGRESS, "host2", "2014-07-05", null);
modelRunDengue5 = createModelRun("dengue 5", 87, ModelRunStatus.FAILED, "host3", "2014-07-06", "2014-07-05");
modelRunMalarias1 = createModelRun("malarias 1", 202, ModelRunStatus.COMPLETED, "host3", "2014-07-07", "2014-07-08");
}
@Test
public void saveAndReloadModelRunByName() {
// Arrange
String name = "test name";
int diseaseGroupId = 87;
String requestServer = "requestServer";
DateTime requestDate = DateTime.now().minusHours(4);
DateTime responseDate = DateTime.now();
String outputText = "output text";
String errorText = "error text";
DateTime batchStartDate = DateTime.now().minusHours(6).minusDays(1);
DateTime batchEndDate = DateTime.now().minusHours(6);
DateTime batchingCompletionDate = DateTime.now().plusHours(2);
DateTime occurrenceDataRangeStartDate = DateTime.now().minusHours(9);
DateTime occurrenceDataRangeEndDate = DateTime.now().minusHours(8);
int batchedOccurrenceCount = 1000;
DiseaseGroup diseaseGroup = diseaseGroupDao.getById(diseaseGroupId);
ModelRun modelRun = new ModelRun(name, diseaseGroup, requestServer, requestDate,
occurrenceDataRangeStartDate, occurrenceDataRangeEndDate);
modelRun.setResponseDate(responseDate);
modelRun.setOutputText(outputText);
modelRun.setErrorText(errorText);
modelRun.setBatchStartDate(batchStartDate);
modelRun.setBatchEndDate(batchEndDate);
modelRun.setBatchingCompletedDate(batchingCompletionDate);
modelRun.setBatchOccurrenceCount(batchedOccurrenceCount);
modelRunDao.save(modelRun);
// Act
flushAndClear();
// Assert
modelRun = modelRunDao.getByName(name);
assertThat(modelRun).isNotNull();
assertThat(modelRun.getName()).isEqualTo(name);
assertThat(modelRun.getStatus()).isEqualTo(ModelRunStatus.IN_PROGRESS);
assertThat(modelRun.getDiseaseGroupId()).isEqualTo(diseaseGroupId);
assertThat(modelRun.getDiseaseGroup()).isEqualTo(diseaseGroup);
assertThat(modelRun.getRequestServer()).isEqualTo(requestServer);
assertThat(modelRun.getRequestDate()).isEqualTo(requestDate);
assertThat(modelRun.getOutputText()).isEqualTo(outputText);
assertThat(modelRun.getErrorText()).isEqualTo(errorText);
assertThat(modelRun.getBatchStartDate()).isEqualTo(batchStartDate);
assertThat(modelRun.getBatchEndDate()).isEqualTo(batchEndDate);
assertThat(modelRun.getBatchingCompletedDate()).isEqualTo(batchingCompletionDate);
assertThat(modelRun.getBatchOccurrenceCount()).isEqualTo(batchedOccurrenceCount);
assertThat(modelRun.getOccurrenceDataRangeStartDate()).isEqualTo(occurrenceDataRangeStartDate);
assertThat(modelRun.getOccurrenceDataRangeEndDate()).isEqualTo(occurrenceDataRangeEndDate);
}
@Test
public void saveAndLoadCascadesToSubmodelStatistics() {
// Arrange
ModelRun run = createModelRun("name");
modelRunDao.save(run);
flushAndClear();
run = modelRunDao.getByName("name");
List<SubmodelStatistic> submodelStatistics = new ArrayList<>();
submodelStatistics.add(createSubmodelStatistic(run));
submodelStatistics.add(createSubmodelStatistic(run));
submodelStatistics.add(createSubmodelStatistic(run));
run.setSubmodelStatistics(submodelStatistics);
modelRunDao.save(run);
flushAndClear();
// Act
run = modelRunDao.getByName("name");
// Assert
assertThat(run.getSubmodelStatistics()).hasSize(3);
}
@Test
public void saveAndLoadCascadesToInputDiseaseOccurrences() {
// Arrange
ModelRun run = createModelRun("name");
List<DiseaseOccurrence> occurrences = diseaseOccurrenceDao.getAll().subList(0, 6);
run.setInputDiseaseOccurrences(occurrences);
modelRunDao.save(run);
flushAndClear();
// Act
run = modelRunDao.getByName("name");
// Assert
assertThat(run.getInputDiseaseOccurrences()).hasSize(occurrences.size());
DiseaseOccurrence[] occurrences2 = new DiseaseOccurrence[occurrences.size()];
occurrences2 = occurrences.toArray(occurrences2);
assertThat(run.getInputDiseaseOccurrences()).containsOnly(occurrences2);
}
@Test
public void saveAndLoadCascadesToInputDiseaseExtent() {
// Arrange
ModelRun run = createModelRun("name");
List<ModelRunAdminUnitDiseaseExtentClass> extent = Arrays.asList(
createAdminUnitDiseaseExtentClass(run, DiseaseExtentClass.ABSENCE, 194, null),
createAdminUnitDiseaseExtentClass(run, DiseaseExtentClass.POSSIBLE_ABSENCE, 30, null),
createAdminUnitDiseaseExtentClass(run, DiseaseExtentClass.PRESENCE, null, 906)
);
run.setInputDiseaseExtent(extent);
modelRunDao.save(run);
flushAndClear();
// Act
run = modelRunDao.getByName("name");
// Assert
assertThat(run.getInputDiseaseExtent()).hasSize(extent.size());
ModelRunAdminUnitDiseaseExtentClass[] extent2 = new ModelRunAdminUnitDiseaseExtentClass[extent.size()];
extent2 = extent.toArray(extent2);
assertThat(run.getInputDiseaseExtent()).containsOnly(extent2);
}
@Test
public void saveAndLoadCascadesToCovariateInfluence() {
// Arrange
ModelRun run = createModelRun("name");
modelRunDao.save(run);
flushAndClear();
run = modelRunDao.getByName("name");
List<CovariateInfluence> covariateInfluences = new ArrayList<>();
covariateInfluences.add(createCovariateInfluence(createCovariateFile(1), run));
covariateInfluences.add(createCovariateInfluence(createCovariateFile(2), run));
covariateInfluences.add(createCovariateInfluence(createCovariateFile(3), run));
run.setCovariateInfluences(covariateInfluences);
modelRunDao.save(run);
flushAndClear();
// Act
run = modelRunDao.getByName("name");
// Assert
assertThat(run.getCovariateInfluences()).hasSize(3);
}
@Test
public void saveAndLoadCascadesToEffectCurveCovariateInfluence() {
// Arrange
ModelRun run = createModelRun("name");
modelRunDao.save(run);
flushAndClear();
run = modelRunDao.getByName("name");
List<EffectCurveCovariateInfluence> effectCurveCovariateInfluences = new ArrayList<>();
effectCurveCovariateInfluences.add(createEffectCurveCovariateInfluence(createCovariateFile(1), run));
effectCurveCovariateInfluences.add(createEffectCurveCovariateInfluence(createCovariateFile(2), run));
effectCurveCovariateInfluences.add(createEffectCurveCovariateInfluence(createCovariateFile(3), run));
run.setEffectCurveCovariateInfluences(effectCurveCovariateInfluences);
modelRunDao.save(run);
flushAndClear();
// Act
run = modelRunDao.getByName("name");
// Assert
assertThat(run.getEffectCurveCovariateInfluences()).hasSize(3);
}
@Test
public void getLastRequestedModelRunReturnsNullIfNoModelRuns() {
// Arrange
int diseaseGroupId = 87;
// Act
ModelRun modelRun = modelRunDao.getLastRequestedModelRun(diseaseGroupId);
// Assert
assertThat(modelRun).isNull();
}
@Test
public void getLastRequestedModelRunIgnoresIDsAndDoesNotRequireResponseDateToBeSet() {
// Arrange
int diseaseGroupId = 87;
modelRunDao.save(modelRunDengue2);
modelRunDao.save(modelRunDengue4);
modelRunDao.save(modelRunDengue3);
modelRunDao.save(modelRunDengue1);
modelRunDao.save(modelRunMalarias1);
// Act
ModelRun modelRun = modelRunDao.getLastRequestedModelRun(diseaseGroupId);
// Assert
assertThat(modelRun).isEqualTo(modelRunDengue4);
}
@Test
public void getLastRequestedModelRunDoesNotRequireResponseDateToBeNull() {
// Arrange
int diseaseGroupId = 87;
modelRunDao.save(modelRunMalarias1);
modelRunDao.save(modelRunDengue2);
modelRunDao.save(modelRunDengue4);
modelRunDao.save(modelRunDengue5);
modelRunDao.save(modelRunDengue3);
modelRunDao.save(modelRunDengue1);
// Act
ModelRun modelRun = modelRunDao.getLastRequestedModelRun(diseaseGroupId);
// Assert
assertThat(modelRun).isEqualTo(modelRunDengue5);
}
@Test
public void getMostRecentlyRequestedModelRunWhichCompletedReturnsNullIfNoModelRuns() {
// Arrange
int diseaseGroupId = 87;
// Act
ModelRun modelRun = modelRunDao.getMostRecentlyRequestedModelRunWhichCompleted(diseaseGroupId);
// Assert
assertThat(modelRun).isNull();
}
@Test
public void getMostRecentlyRequestedModelRunWhichCompletedReturnsNullIfNoCompletedModelRuns() {
// Arrange
int diseaseGroupId = 87;
modelRunDao.save(modelRunMalarias1);
modelRunDao.save(modelRunDengue4);
modelRunDao.save(modelRunDengue5);
modelRunDao.save(modelRunDengue1);
// Act
ModelRun modelRun = modelRunDao.getMostRecentlyRequestedModelRunWhichCompleted(diseaseGroupId);
// Assert
assertThat(modelRun).isNull();
}
@Test
public void getMostRecentlyRequestedModelRunWhichCompletedReturnsCorrectValueIfCompletedModelRuns() {
// Arrange
int diseaseGroupId = 87;
saveStandardRuns();
// Act
ModelRun modelRun = modelRunDao.getMostRecentlyRequestedModelRunWhichCompleted(diseaseGroupId);
// Assert
assertThat(modelRun).isEqualTo(modelRunDengue3);
}
@Test
public void getMostRecentlyFinishedModelRunWhichCompletedReturnsNullIfNoModelRuns() {
// Arrange
int diseaseGroupId = 87;
// Act
ModelRun modelRun = modelRunDao.getMostRecentlyFinishedModelRunWhichCompleted(diseaseGroupId);
// Assert
assertThat(modelRun).isNull();
}
@Test
public void getMostRecentlyFinishedModelRunWhichCompletedReturnsNullIfNoCompletedModelRuns() {
// Arrange
int diseaseGroupId = 87;
modelRunDao.save(modelRunMalarias1);
modelRunDao.save(modelRunDengue4);
modelRunDao.save(modelRunDengue5);
modelRunDao.save(modelRunDengue1);
// Act
ModelRun modelRun = modelRunDao.getMostRecentlyFinishedModelRunWhichCompleted(diseaseGroupId);
// Assert
assertThat(modelRun).isNull();
}
@Test
public void getMostRecentlyFinishedModelRunWhichCompletedReturnsNullIfCompletedModelRunHasNoResponseDate() {
// Arrange
int diseaseGroupId = 87;
modelRunDengue2.setResponseDate(null);
modelRunDao.save(modelRunDengue2);
// Act
ModelRun modelRun = modelRunDao.getMostRecentlyFinishedModelRunWhichCompleted(diseaseGroupId);
// Assert
assertThat(modelRun).isNull();
}
@Test
public void getMostRecentlyFinishedModelRunWhichCompletedReturnsCorrectValueIfCompletedModelRuns() {
// Arrange
int diseaseGroupId = 87;
saveStandardRuns();
// Act
ModelRun modelRun = modelRunDao.getMostRecentlyFinishedModelRunWhichCompleted(diseaseGroupId);
// Assert
assertThat(modelRun).isEqualTo(modelRunDengue2);
}
@Test
public void getCompletedModelRunsForDisplayReturnsCorrectCompletedModelRuns() {
// Arrange
DiseaseGroup dengue = diseaseGroupDao.getById(87);
dengue.setAutomaticModelRunsStartDate(new DateTime(2014, 7, 2, 0, 0)); // Chosen to be between 2 model runs
diseaseGroupDao.save(dengue);
modelRunDao.save(modelRunDengue1); // Not for display: IN_PROGRESS
modelRunDao.save(modelRunDengue2); // Not for display: Requested before automaticModelRunsStartDate
modelRunDao.save(modelRunDengue3); // For display: Requested after automaticModelRunsStartDate
modelRunDao.save(modelRunDengue4); // Not for display: IN_PROGRESS
modelRunDao.save(modelRunDengue5); // Not for display: FAILED
modelRunDao.save(modelRunMalarias1); // For display: COMPLETED and automaticModelRunsStartDate is null
// Act
Collection<ModelRun> modelRuns = modelRunDao.getCompletedModelRunsForDisplay();
// Assert
assertThat(modelRuns).containsOnly(modelRunDengue3, modelRunMalarias1);
}
@Test
public void getCompletedModelRunsForDisplayReturnsEmptyIfNoCompletedModelRuns() {
// Arrange
modelRunDao.save(modelRunDengue4);
modelRunDao.save(modelRunDengue5);
modelRunDao.save(modelRunDengue1);
// Act
Collection<ModelRun> modelRuns = modelRunDao.getCompletedModelRunsForDisplay();
// Assert
assertThat(modelRuns).isEmpty();
}
@Test
public void hasBatchingEverCompletedReturnsFalseIfNoBatchCompletedDatesExistForTheDiseaseGroup() {
// Arrange
modelRunMalarias1.setBatchingCompletedDate(DateTime.now());
modelRunDao.save(modelRunMalarias1);
// Act
boolean result = modelRunDao.hasBatchingEverCompleted(87);
// Assert
assertThat(result).isFalse();
}
@Test
public void hasBatchingEverCompletedReturnsTrueIfAtLeastOneBatchCompletedDateExists() {
// Arrange
modelRunDengue3.setBatchingCompletedDate(DateTime.now());
modelRunDao.save(modelRunDengue3);
// Act
boolean result = modelRunDao.hasBatchingEverCompleted(87);
// Assert
assertThat(result).isTrue();
}
@Test
public void getModelRunRequestServersByUsageGetsCorrectlyOrderedServers() {
// Arrange
modelRunDao.save(modelRunDengue1);
modelRunDao.save(modelRunDengue2);
modelRunDao.save(modelRunDengue3);
modelRunDao.save(modelRunDengue4);
modelRunDao.save(modelRunDengue5);
modelRunDao.save(modelRunMalarias1);
// Act
List<String> result = modelRunDao.getModelRunRequestServersByUsage();
// Assert
assertThat(result).hasSize(3);
assertThat(result.get(0)).isEqualTo("host3");
assertThat(result.get(1)).isEqualTo("host2");
assertThat(result.get(2)).isEqualTo("host1");
}
@Test
public void getModelRunsForDiseaseGroupGetsCorrectSetOfModelRuns() {
// Arrange
modelRunDao.save(modelRunDengue1);
modelRunDao.save(modelRunDengue2);
modelRunDao.save(modelRunDengue3);
modelRunDao.save(modelRunDengue4);
modelRunDao.save(modelRunDengue5);
modelRunDao.save(modelRunMalarias1);
// Act
Collection<ModelRun> result = modelRunDao.getModelRunsForDiseaseGroup(87);
// Assert
assertThat(result).hasSize(5);
assertThat(result).contains(modelRunDengue1);
assertThat(result).contains(modelRunDengue2);
assertThat(result).contains(modelRunDengue3);
assertThat(result).contains(modelRunDengue4);
assertThat(result).contains(modelRunDengue5);
}
private void saveStandardRuns() {
modelRunDao.save(modelRunMalarias1);
modelRunDao.save(modelRunDengue1);
modelRunDao.save(modelRunDengue2);
modelRunDao.save(modelRunDengue3);
modelRunDao.save(modelRunDengue4);
modelRunDao.save(modelRunDengue5);
}
@Test
public void getFilteredModelRunsReturnsCorrectSetWithoutFilters() {
// Arrange
setModelRunStartDates("2014-07-02", "2014-07-02");
saveStandardRuns();
// Act
Collection<ModelRun> modelRuns = modelRunDao.getFilteredModelRuns(null, null, null, null);
// Assert
assertThat(modelRuns).containsOnly(modelRunDengue3, modelRunMalarias1); // Only completed automatic runs
}
@Test
public void getFilteredModelRunsReturnsCorrectSetWithNameFilter() {
// Arrange
setModelRunStartDates("2014-06-28", "2014-07-02");
saveStandardRuns();
// Act
Collection<ModelRun> modelRuns = modelRunDao.getFilteredModelRuns("dengue 2", null, null, null);
// Assert
assertThat(modelRuns).containsOnly(modelRunDengue2);
}
@Test
public void getFilteredModelRunsReturnsCorrectSetWithDiseaseFilter() {
// Arrange
setModelRunStartDates("2014-06-28", "2014-07-02");
saveStandardRuns();
// Act
Collection<ModelRun> modelRuns = modelRunDao.getFilteredModelRuns(null, 87, null, null);
// Assert
assertThat(modelRuns).containsOnly(modelRunDengue2, modelRunDengue3);
}
@Test
public void getFilteredModelRunsReturnsCorrectSetWithMinDateFilter() {
// Arrange
setModelRunStartDates("2014-06-28", "2014-07-02");
saveStandardRuns();
// Act
Collection<ModelRun> modelRuns = modelRunDao.getFilteredModelRuns(null, null, new LocalDate("2014-07-04"), null);
// Assert
assertThat(modelRuns).containsExactly(modelRunMalarias1, modelRunDengue2);
}
@Test
public void getFilteredModelRunsReturnsCorrectSetWithMaxDateFilter() {
// Arrange
setModelRunStartDates("2014-06-28", "2014-07-02");
saveStandardRuns();
// Act
Collection<ModelRun> modelRuns = modelRunDao.getFilteredModelRuns(null, null, null, new LocalDate("2014-07-03"));
// Assert
assertThat(modelRuns).containsOnly(modelRunDengue3);
}
@Test
public void getFilteredModelRunsReturnsCorrectSetWithNormalFilters() {
// Arrange
setModelRunStartDates("2014-06-28", "2014-07-02");
saveStandardRuns();
// Act
Collection<ModelRun> modelRuns = modelRunDao.getFilteredModelRuns(null, 87, new LocalDate("2014-07-03"), new LocalDate("2014-07-03"));
// Assert
assertThat(modelRuns).containsOnly(modelRunDengue3);
}
private void setModelRunStartDates(String dengueDate, String malariaDate) {
int diseaseGroupId = 87;
DiseaseGroup dengue = diseaseGroupDao.getById(diseaseGroupId);
DiseaseGroup malaria = diseaseGroupDao.getById(202);
dengue.setAutomaticModelRunsStartDate(new DateTime(dengueDate));
malaria.setAutomaticModelRunsStartDate(new DateTime(malariaDate));
diseaseGroupDao.save(dengue);
diseaseGroupDao.save(malaria);
}
private ModelRunAdminUnitDiseaseExtentClass createAdminUnitDiseaseExtentClass(
ModelRun run, String diseaseExtentClass,
Integer adminUnitTropicalGaul, Integer adminUnitGlobalGaul) {
ModelRunAdminUnitDiseaseExtentClass value = new ModelRunAdminUnitDiseaseExtentClass();
value.setModelRun(run);
value.setDiseaseExtentClass(diseaseExtentClassDao.getByName(diseaseExtentClass));
value.setAdminUnitGlobal(adminUnitGlobalGaul == null ? null : adminUnitGlobalDao.getByGaulCode(adminUnitGlobalGaul));
value.setAdminUnitTropical(adminUnitTropicalGaul == null ? null : adminUnitTropicalDao.getByGaulCode(adminUnitTropicalGaul));
return value;
}
private SubmodelStatistic createSubmodelStatistic(ModelRun modelRun) {
SubmodelStatistic submodelStatistic = new SubmodelStatistic();
submodelStatistic.setModelRun(modelRun);
return submodelStatistic;
}
private CovariateInfluence createCovariateInfluence(CovariateFile covariateFile, ModelRun modelRun) {
CovariateInfluence covariateInfluence = new CovariateInfluence();
covariateInfluence.setModelRun(modelRun);
covariateInfluence.setCovariateFile(covariateFile);
covariateInfluence.setMeanInfluence(1.0);
covariateInfluence.setLowerQuantile(2.0);
covariateInfluence.setUpperQuantile(3.0);
return covariateInfluence;
}
private EffectCurveCovariateInfluence createEffectCurveCovariateInfluence(CovariateFile covariateFile, ModelRun modelRun) {
EffectCurveCovariateInfluence effectCurveCovariateInfluence = new EffectCurveCovariateInfluence();
effectCurveCovariateInfluence.setModelRun(modelRun);
effectCurveCovariateInfluence.setCovariateFile(covariateFile);
effectCurveCovariateInfluence.setMeanInfluence(1.0);
effectCurveCovariateInfluence.setLowerQuantile(2.0);
effectCurveCovariateInfluence.setUpperQuantile(3.0);
effectCurveCovariateInfluence.setCovariateValue(4.0);
return effectCurveCovariateInfluence;
}
private ModelRun createModelRun(String name) {
return new ModelRun(name, diseaseGroupDao.getById(87), "host", DateTime.now(), DateTime.now(), DateTime.now());
}
private ModelRun createModelRun(String name, int diseaseGroupId, ModelRunStatus status, String requestServer,
String requestDate, String responseDate) {
ModelRun modelRun = new ModelRun(name, diseaseGroupDao.getById(diseaseGroupId), requestServer, new LocalDate(requestDate).toDateTimeAtStartOfDay(), DateTime.now(), DateTime.now());
modelRun.setStatus(status);
modelRun.setResponseDate(new LocalDate(responseDate).toDateTimeAtStartOfDay());
return modelRun;
}
private CovariateFile createCovariateFile(int idx) {
CovariateFile covariate = new CovariateFile("name" + idx, false, false, "info" + idx);
CovariateSubFile covariateSubFile = new CovariateSubFile(covariate, null, "file" + idx);
covariate.setFiles(Arrays.asList(covariateSubFile));
covariateFileDao.save(covariate);
return covariate;
}
}