package uk.ac.ox.zoo.seeg.abraid.mp.common.service.workflow.support.extent; import org.joda.time.DateTime; 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.ExpertService; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * Tests for DiseaseExtentGenerationInputDataSelector. * Copyright (c) 2015 University of Oxford */ public class DiseaseExtentGenerationInputDataSelectorTest { private DiseaseService diseaseService; private ExpertService expertService; private DiseaseGroup diseaseGroup; private Integer diseaseGroupId = 87; private DateTime minimumOccurrenceDate = DateTime.now().minusYears(1); private Double minimumValidationWeighting = 0.2; private List<? extends AdminUnitGlobalOrTropical> adminUnits = Arrays.asList(mock(AdminUnitGlobal.class)); @Before public void setUp() { diseaseService = mock(DiseaseService.class); expertService = mock(ExpertService.class); diseaseGroup = mock(DiseaseGroup.class); when(diseaseGroup.getId()).thenReturn(diseaseGroupId); when(diseaseGroup.isGlobal()).thenReturn(false); DiseaseExtent parameters = mock(DiseaseExtent.class); when(diseaseGroup.getDiseaseExtentParameters()).thenReturn(parameters); when(diseaseGroup.getDiseaseExtentParameters().getMinValidationWeighting()).thenReturn(minimumValidationWeighting); } @Test public void selectForValidatorExtentPicksCorrectDataForManualInitialRun() throws Exception { // Arrange DiseaseExtentGenerationInputDataSelector dataSelector = new DiseaseExtentGenerationInputDataSelector( diseaseService, expertService); Collection<DiseaseExtentClass> diseaseExtentClasses = setUpExtentClasses(); Collection<AdminUnitReview> reviews = setUpReviews(); Collection<DiseaseOccurrence> occurrences = setUpOccurrences(null, null, false); // Act DiseaseExtentGenerationInputData result = dataSelector.selectForValidatorExtent(diseaseGroup, adminUnits, true, DiseaseProcessType.MANUAL, minimumOccurrenceDate); // Assert assertThat(result.getDiseaseExtentClasses()).isSameAs(diseaseExtentClasses); assertThat(result.getAdminUnits()).isSameAs(adminUnits); assertThat(result.getReviews()).isSameAs(reviews); assertThat(result.getOccurrences()).isSameAs(occurrences); } @Test public void selectForValidatorExtentPicksCorrectDataForManualRun() throws Exception { // Arrange DiseaseExtentGenerationInputDataSelector dataSelector = new DiseaseExtentGenerationInputDataSelector( diseaseService, expertService); Collection<DiseaseExtentClass> diseaseExtentClasses = setUpExtentClasses(); Collection<AdminUnitReview> reviews = setUpReviews(); Collection<DiseaseOccurrence> occurrences = setUpOccurrences(minimumValidationWeighting, null, false); // Act DiseaseExtentGenerationInputData result = dataSelector.selectForValidatorExtent(diseaseGroup, adminUnits, false, DiseaseProcessType.MANUAL, minimumOccurrenceDate); // Assert assertThat(result.getDiseaseExtentClasses()).isSameAs(diseaseExtentClasses); assertThat(result.getAdminUnits()).isSameAs(adminUnits); assertThat(result.getReviews()).isSameAs(reviews); assertThat(result.getOccurrences()).isSameAs(occurrences); } @Test public void selectForValidatorExtentPicksCorrectDataForManualInitialGoldStandardRun() throws Exception { // Arrange DiseaseExtentGenerationInputDataSelector dataSelector = new DiseaseExtentGenerationInputDataSelector( diseaseService, expertService); Collection<DiseaseExtentClass> diseaseExtentClasses = setUpExtentClasses(); Collection<AdminUnitReview> reviews = setUpReviews(); Collection<DiseaseOccurrence> occurrences = setUpOccurrences(null, null, true); // Act DiseaseExtentGenerationInputData result = dataSelector.selectForValidatorExtent(diseaseGroup, adminUnits, true, DiseaseProcessType.MANUAL_GOLD_STANDARD, minimumOccurrenceDate); // Assert assertThat(result.getDiseaseExtentClasses()).isSameAs(diseaseExtentClasses); assertThat(result.getAdminUnits()).isSameAs(adminUnits); assertThat(result.getReviews()).isSameAs(reviews); assertThat(result.getOccurrences()).isSameAs(occurrences); } @Test public void selectForValidatorExtentPicksCorrectDataForManualGoldStandardRun() throws Exception { // Arrange DiseaseExtentGenerationInputDataSelector dataSelector = new DiseaseExtentGenerationInputDataSelector( diseaseService, expertService); Collection<DiseaseExtentClass> diseaseExtentClasses = setUpExtentClasses(); Collection<AdminUnitReview> reviews = setUpReviews(); Collection<DiseaseOccurrence> occurrences = setUpOccurrences(minimumValidationWeighting, null, true); // Act DiseaseExtentGenerationInputData result = dataSelector.selectForValidatorExtent(diseaseGroup, adminUnits, false, DiseaseProcessType.MANUAL_GOLD_STANDARD, minimumOccurrenceDate); // Assert assertThat(result.getDiseaseExtentClasses()).isSameAs(diseaseExtentClasses); assertThat(result.getAdminUnits()).isSameAs(adminUnits); assertThat(result.getReviews()).isSameAs(reviews); assertThat(result.getOccurrences()).isSameAs(occurrences); } @Test public void selectForValidatorExtentPicksCorrectDataForAutoRun() throws Exception { // Arrange DiseaseExtentGenerationInputDataSelector dataSelector = new DiseaseExtentGenerationInputDataSelector( diseaseService, expertService); Collection<DiseaseExtentClass> diseaseExtentClasses = setUpExtentClasses(); Collection<AdminUnitReview> reviews = setUpReviews(); Collection<DiseaseOccurrence> occurrences = setUpOccurrences(minimumValidationWeighting, minimumOccurrenceDate, false); // Act DiseaseExtentGenerationInputData result = dataSelector.selectForValidatorExtent(diseaseGroup, adminUnits, false, DiseaseProcessType.AUTOMATIC, minimumOccurrenceDate); // Assert assertThat(result.getDiseaseExtentClasses()).isSameAs(diseaseExtentClasses); assertThat(result.getAdminUnits()).isSameAs(adminUnits); assertThat(result.getReviews()).isSameAs(reviews); assertThat(result.getOccurrences()).isSameAs(occurrences); } @Test public void selectForValidatorExtentPicksCorrectDataForAutoInitialRun() throws Exception { // Arrange DiseaseExtentGenerationInputDataSelector dataSelector = new DiseaseExtentGenerationInputDataSelector( diseaseService, expertService); Collection<DiseaseExtentClass> diseaseExtentClasses = setUpExtentClasses(); Collection<AdminUnitReview> reviews = setUpReviews(); Collection<DiseaseOccurrence> occurrences = setUpOccurrences(null, null, false); // Act DiseaseExtentGenerationInputData result = dataSelector.selectForValidatorExtent(diseaseGroup, adminUnits, true, DiseaseProcessType.AUTOMATIC, minimumOccurrenceDate); // Assert assertThat(result.getDiseaseExtentClasses()).isSameAs(diseaseExtentClasses); assertThat(result.getAdminUnits()).isSameAs(adminUnits); assertThat(result.getReviews()).isSameAs(reviews); assertThat(result.getOccurrences()).isSameAs(occurrences); } @Test public void selectForModellingExtentWhenPreviousOccurrencesPresent() throws Exception { // Arrange DiseaseExtentGenerationInputDataSelector dataSelector = new DiseaseExtentGenerationInputDataSelector( diseaseService, expertService); Collection<DiseaseExtentClass> diseaseExtentClasses = new ArrayList<>(); Collection<AdminUnitReview> reviews = new ArrayList<>(); Collection<DiseaseOccurrence> validatorOccurrences = new ArrayList<>(); DiseaseExtentGenerationInputData validatorExtentData = new DiseaseExtentGenerationInputData(diseaseExtentClasses, adminUnits, reviews, validatorOccurrences); Collection<DiseaseOccurrence> modellingOccurrences = new ArrayList<>(); modellingOccurrences.add(mock(DiseaseOccurrence.class)); when(diseaseGroup.getDiseaseExtentParameters().getLastValidatorExtentUpdateInputOccurrences()).thenReturn(modellingOccurrences); // Act DiseaseExtentGenerationInputData result = dataSelector.selectForModellingExtent(diseaseGroup, validatorExtentData); // Assert assertThat(result.getDiseaseExtentClasses()).isSameAs(diseaseExtentClasses); assertThat(result.getAdminUnits()).isSameAs(adminUnits); assertThat(result.getReviews()).isSameAs(reviews); assertThat(result.getOccurrences()).isSameAs(modellingOccurrences); } @Test public void selectForModellingExtentWhenPreviousOccurrencesNotPresent() throws Exception { // Arrange DiseaseExtentGenerationInputDataSelector dataSelector = new DiseaseExtentGenerationInputDataSelector( diseaseService, expertService); Collection<DiseaseExtentClass> diseaseExtentClasses = new ArrayList<>(); Collection<AdminUnitReview> reviews = new ArrayList<>(); Collection<DiseaseOccurrence> validatorOccurrences = new ArrayList<>(); DiseaseExtentGenerationInputData validatorExtentData = new DiseaseExtentGenerationInputData(diseaseExtentClasses, adminUnits, reviews, validatorOccurrences); Collection<DiseaseOccurrence> modellingOccurrences = new ArrayList<>(); when(diseaseGroup.getDiseaseExtentParameters().getLastValidatorExtentUpdateInputOccurrences()).thenReturn(modellingOccurrences); // Act DiseaseExtentGenerationInputData result = dataSelector.selectForModellingExtent(diseaseGroup, validatorExtentData); // Assert assertThat(result.getDiseaseExtentClasses()).isSameAs(diseaseExtentClasses); assertThat(result.getAdminUnits()).isSameAs(adminUnits); assertThat(result.getReviews()).isSameAs(reviews); assertThat(result.getOccurrences()).isSameAs(validatorOccurrences); } private Collection<DiseaseExtentClass> setUpExtentClasses() { ArrayList<DiseaseExtentClass> expectation = new ArrayList<>(); when(diseaseService.getAllDiseaseExtentClasses()).thenReturn(expectation); return expectation; } private Collection<DiseaseOccurrence> setUpOccurrences(Double expectedMinimumValidationWeighting, DateTime expectedMinimumOccurrenceDate, boolean expectedOnlyGoldStandard) { ArrayList<DiseaseOccurrence> expectation = new ArrayList<>(); when(diseaseService.getDiseaseOccurrencesForDiseaseExtent( diseaseGroupId, expectedMinimumValidationWeighting, expectedMinimumOccurrenceDate, expectedOnlyGoldStandard)).thenReturn(expectation); return expectation; } private Collection<AdminUnitReview> setUpReviews() { ArrayList<AdminUnitReview> expectation = new ArrayList<>(); when(expertService.getCurrentAdminUnitReviewsForDiseaseGroup(diseaseGroupId)).thenReturn(expectation); return expectation; } }