package uk.ac.ox.zoo.seeg.abraid.mp.modeloutputhandler.web;
import org.joda.time.DateTime;
import org.joda.time.DateTimeUtils;
import org.junit.Before;
import org.junit.Test;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.*;
import uk.ac.ox.zoo.seeg.abraid.mp.common.service.core.DiseaseService;
import uk.ac.ox.zoo.seeg.abraid.mp.common.service.core.ModelRunService;
import uk.ac.ox.zoo.seeg.abraid.mp.common.service.workflow.DiseaseOccurrenceValidationService;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
/**
* Tests the DiseaseOccurrenceHandler class.
*
* Copyright (c) 2014 University of Oxford
*/
public class BatchingHandlerHelperTest {
private BatchingHandlerHelper helper;
private DiseaseService diseaseService;
private ModelRunService modelRunService;
private DiseaseOccurrenceValidationService diseaseOccurrenceValidationService;
@Before
public void setUp() {
diseaseService = mock(DiseaseService.class);
modelRunService = mock(ModelRunService.class);
diseaseOccurrenceValidationService = mock(DiseaseOccurrenceValidationService.class);
helper = new BatchingHandlerHelper(diseaseService, modelRunService,
diseaseOccurrenceValidationService);
DateTimeUtils.setCurrentMillisFixed(DateTime.now().getMillis());
}
@Test
public void handleValidationParametersHasNoEffectIfModelIncomplete() {
// Arrange
int diseaseGroupId = 87;
ModelRun modelRun = createModelRun(diseaseGroupId, ModelRunStatus.FAILED);
DiseaseGroup diseaseGroup = new DiseaseGroup(diseaseGroupId);
when(modelRunService.getModelRunByName(modelRun.getName())).thenReturn(modelRun);
when(diseaseService.getDiseaseGroupById(diseaseGroupId)).thenReturn(diseaseGroup);
// Act
DateTime batchingInitialisationDate = helper.handle(modelRun);
// Assert
assertThat(batchingInitialisationDate).isNull();
verify(modelRunService, never()).hasBatchingEverCompleted(anyInt());
verify(diseaseService, never()).getDiseaseOccurrencesByDiseaseGroupId(anyInt());
verify(diseaseService, never()).getDiseaseOccurrencesForBatching(anyInt(), any(DateTime.class), any(DateTime.class));
verify(diseaseOccurrenceValidationService, never()).addValidationParameters(anyListOf(DiseaseOccurrence.class));
verify(diseaseService, never()).saveDiseaseOccurrence(any(DiseaseOccurrence.class));
verify(modelRunService, never()).saveModelRun(any(ModelRun.class));
}
@Test
public void handleValidationParametersHasNoEffectIfDiseaseGroupIsNotBeingSetUp() {
// Arrange
int diseaseGroupId = 87;
ModelRun modelRun = createModelRun(diseaseGroupId, ModelRunStatus.COMPLETED);
DiseaseGroup diseaseGroup = new DiseaseGroup(diseaseGroupId);
diseaseGroup.setAutomaticModelRunsStartDate(DateTime.now());
when(modelRunService.getModelRunByName(modelRun.getName())).thenReturn(modelRun);
when(diseaseService.getDiseaseGroupById(diseaseGroupId)).thenReturn(diseaseGroup);
// Act
DateTime batchingInitialisationDate = helper.handle(modelRun);
// Assert
assertThat(batchingInitialisationDate).isNull();
verify(modelRunService, never()).hasBatchingEverCompleted(anyInt());
verify(diseaseService, never()).getDiseaseOccurrencesByDiseaseGroupId(anyInt());
verify(diseaseService, never()).getDiseaseOccurrencesForBatching(anyInt(), any(DateTime.class), any(DateTime.class));
verify(diseaseOccurrenceValidationService, never()).addValidationParameters(anyListOf(DiseaseOccurrence.class));
verify(diseaseService, never()).saveDiseaseOccurrence(any(DiseaseOccurrence.class));
verify(modelRunService, never()).saveModelRun(any(ModelRun.class));
}
@Test
public void handleValidationParametersInitialisesBatchingIfBatchingHasNeverCompleted() {
// Arrange
int diseaseGroupId = 87;
ModelRun modelRun = createModelRun(diseaseGroupId, ModelRunStatus.COMPLETED);
modelRun.setBatchStartDate(DateTime.now().minusDays(1));
modelRun.setBatchEndDate(DateTime.now());
DiseaseGroup diseaseGroup = new DiseaseGroup(diseaseGroupId);
DiseaseOccurrence occurrence1 = new DiseaseOccurrence();
occurrence1.setStatus(DiseaseOccurrenceStatus.READY);
occurrence1.setFinalWeighting(0.5);
DiseaseOccurrence occurrence2 = new DiseaseOccurrence();
occurrence2.setStatus(DiseaseOccurrenceStatus.READY);
occurrence2.setFinalWeightingExcludingSpatial(0.7);
List<DiseaseOccurrence> occurrences = Arrays.asList(occurrence1, occurrence2);
when(modelRunService.getModelRunByName(modelRun.getName())).thenReturn(modelRun);
when(diseaseService.getDiseaseGroupById(diseaseGroupId)).thenReturn(diseaseGroup);
when(modelRunService.hasBatchingEverCompleted(diseaseGroupId)).thenReturn(false);
when(diseaseService.getDiseaseOccurrencesForBatchingInitialisation(diseaseGroupId)).thenReturn(occurrences);
// Act
DateTime batchingInitialisationDate = helper.handle(modelRun);
// Assert
assertThat(batchingInitialisationDate).isEqualTo(DateTime.now());
verify(diseaseService).saveDiseaseOccurrence(same(occurrence1));
verify(diseaseService).saveDiseaseOccurrence(same(occurrence2));
assertThat(occurrence1.getFinalWeighting()).isNull();
assertThat(occurrence2.getFinalWeightingExcludingSpatial()).isNull();
}
@Test
public void handleValidationParametersDoesNotInitialiseBatchingIfBatchingHasCompleted() {
// Arrange
int diseaseGroupId = 87;
ModelRun modelRun = createModelRun(diseaseGroupId, ModelRunStatus.COMPLETED);
modelRun.setBatchStartDate(DateTime.now().minusDays(1));
modelRun.setBatchEndDate(DateTime.now());
DiseaseGroup diseaseGroup = new DiseaseGroup(diseaseGroupId);
when(modelRunService.getModelRunByName(modelRun.getName())).thenReturn(modelRun);
when(diseaseService.getDiseaseGroupById(diseaseGroupId)).thenReturn(diseaseGroup);
when(modelRunService.hasBatchingEverCompleted(diseaseGroupId)).thenReturn(true);
// Act
DateTime batchingInitialisationDate = helper.handle(modelRun);
// Assert
assertThat(batchingInitialisationDate).isNull();
verify(modelRunService).hasBatchingEverCompleted(eq(diseaseGroupId));
verify(diseaseService, never()).getDiseaseOccurrencesByDiseaseGroupId(anyInt());
verify(diseaseService, never()).saveDiseaseOccurrence(any(DiseaseOccurrence.class));
}
@Test
public void handleValidationParametersDoesNotBatchIfThereIsNoBatchEndDate() {
// Arrange
int diseaseGroupId = 87;
ModelRun modelRun = createModelRun(diseaseGroupId, ModelRunStatus.COMPLETED);
DiseaseGroup diseaseGroup = new DiseaseGroup(diseaseGroupId);
when(modelRunService.getModelRunByName(modelRun.getName())).thenReturn(modelRun);
when(diseaseService.getDiseaseGroupById(diseaseGroupId)).thenReturn(diseaseGroup);
// Act
DateTime batchingInitialisationDate = helper.handle(modelRun);
// Assert
assertThat(batchingInitialisationDate).isNull();
verify(modelRunService, never()).hasBatchingEverCompleted(anyInt());
verify(diseaseService, never()).getDiseaseOccurrencesForBatching(anyInt(), any(DateTime.class), any(DateTime.class));
verify(diseaseOccurrenceValidationService, never()).addValidationParameters(anyListOf(DiseaseOccurrence.class));
verify(diseaseService, never()).saveDiseaseOccurrence(any(DiseaseOccurrence.class));
verify(modelRunService, never()).saveModelRun(any(ModelRun.class));
}
@Test
public void handlingSucceedsIfThereAreNoOccurrencesToBatch() {
// Arrange
int diseaseGroupId = 87;
DateTime batchStartDate = new DateTime("2012-11-13T00:00:00.000");
DateTime batchEndDate = new DateTime("2012-11-14T23:59:59.999");
ModelRun modelRun = createModelRun(diseaseGroupId, ModelRunStatus.COMPLETED);
modelRun.setBatchStartDate(batchStartDate);
modelRun.setBatchEndDate(batchEndDate);
DiseaseGroup diseaseGroup = new DiseaseGroup(diseaseGroupId);
diseaseGroup.setName("Dengue");
when(modelRunService.getModelRunByName(modelRun.getName())).thenReturn(modelRun);
when(diseaseService.getDiseaseGroupById(diseaseGroupId)).thenReturn(diseaseGroup);
when(modelRunService.hasBatchingEverCompleted(diseaseGroupId)).thenReturn(false);
when(diseaseService.getDiseaseOccurrencesForBatching(diseaseGroupId, batchStartDate, batchEndDate))
.thenReturn(new ArrayList<DiseaseOccurrence>());
// Act
DateTime batchingInitialisationDate = helper.handle(modelRun);
// Assert
assertThat(batchingInitialisationDate).isEqualTo(DateTime.now());
verify(diseaseService).getDiseaseOccurrencesForBatching(
eq(diseaseGroupId), eq(batchStartDate), eq(batchEndDate));
verify(diseaseOccurrenceValidationService, never()).addValidationParameters(anyListOf(DiseaseOccurrence.class));
verify(diseaseService, never()).saveDiseaseOccurrence(any(DiseaseOccurrence.class));
verify(modelRunService).saveModelRun(modelRun);
}
@Test
public void handlingSucceedsIfThereAreOccurrencesToBatch() {
// Arrange
int diseaseGroupId = 87;
DateTime batchStartDate = new DateTime("2013-07-29T00:00:00.000");
DateTime batchEndDate = new DateTime("2013-07-30T23:59:59.999");
ModelRun modelRun = createModelRun(diseaseGroupId, ModelRunStatus.COMPLETED);
modelRun.setBatchStartDate(batchStartDate);
modelRun.setBatchEndDate(batchEndDate);
DiseaseGroup diseaseGroup = new DiseaseGroup(diseaseGroupId);
diseaseGroup.setName("Dengue");
DiseaseOccurrence occurrence1 = new DiseaseOccurrence();
DiseaseOccurrence occurrence2 = new DiseaseOccurrence();
List<DiseaseOccurrence> occurrences = Arrays.asList(occurrence1, occurrence2);
when(modelRunService.getModelRunByName(modelRun.getName())).thenReturn(modelRun);
when(diseaseService.getDiseaseGroupById(diseaseGroupId)).thenReturn(diseaseGroup);
when(modelRunService.hasBatchingEverCompleted(diseaseGroupId)).thenReturn(false);
when(diseaseService.getDiseaseOccurrencesForBatching(diseaseGroupId, batchStartDate, batchEndDate))
.thenReturn(occurrences);
// Act
DateTime batchingInitialisationDate = helper.handle(modelRun);
// Assert
assertThat(batchingInitialisationDate).isEqualTo(DateTime.now());
verify(diseaseService).getDiseaseOccurrencesForBatching(
eq(diseaseGroupId), eq(batchStartDate), eq(batchEndDate));
verify(diseaseOccurrenceValidationService).addValidationParameters(same(occurrences));
verify(diseaseService).saveDiseaseOccurrence(same(occurrence1));
verify(diseaseService).saveDiseaseOccurrence(same(occurrence2));
verify(modelRunService).saveModelRun(modelRun);
}
@Test
public void continueBatchingInitialisationDoesNothingIfBatchingInitialisationDateIsNull() {
// Arrange
int diseaseGroupId = 87;
// Act
helper.continueBatchingInitialisation(diseaseGroupId, null);
// Assert
verify(diseaseService, never()).getDiseaseOccurrencesByDiseaseGroupIdAndStatuses(anyInt(),
any(DiseaseOccurrenceStatus.class));
verify(diseaseService, never()).saveDiseaseOccurrence(any(DiseaseOccurrence.class));
}
@Test
public void continueBatchingInitialisationSavesOccurrencesAfterInitialisationDate() {
// Arrange
int diseaseGroupId = 87;
DiseaseOccurrence occurrence1 = createDiseaseOccurrence(-1);
DiseaseOccurrence occurrence2 = createDiseaseOccurrence(0);
DiseaseOccurrence occurrence3 = createDiseaseOccurrence(1);
List<DiseaseOccurrence> occurrences = Arrays.asList(occurrence1, occurrence2, occurrence3);
// Act
when(diseaseService.getDiseaseOccurrencesForBatchingInitialisation(diseaseGroupId)).thenReturn(occurrences);
helper.continueBatchingInitialisation(diseaseGroupId, DateTime.now());
// Assert
assertThat(occurrence1.getStatus()).isEqualTo(DiseaseOccurrenceStatus.READY);
assertThat(occurrence2.getStatus()).isEqualTo(DiseaseOccurrenceStatus.AWAITING_BATCHING);
assertThat(occurrence3.getStatus()).isEqualTo(DiseaseOccurrenceStatus.AWAITING_BATCHING);
verify(diseaseService, never()).saveDiseaseOccurrence(same(occurrence1));
verify(diseaseService).saveDiseaseOccurrence(same(occurrence2));
verify(diseaseService).saveDiseaseOccurrence(same(occurrence3));
}
private ModelRun createModelRun(int diseaseGroupId, ModelRunStatus status) {
ModelRun modelRun = new ModelRun(1);
modelRun.setName("test");
modelRun.setDiseaseGroup(new DiseaseGroup(diseaseGroupId));
modelRun.setRequestDate(DateTime.now());
modelRun.setStatus(status);
return modelRun;
}
private DiseaseOccurrence createDiseaseOccurrence(int daysOffset) {
DiseaseOccurrence occurrence = new DiseaseOccurrence(DateTime.now().plusDays(daysOffset));
occurrence.setStatus(DiseaseOccurrenceStatus.READY);
return occurrence;
}
}