package uk.ac.ox.zoo.seeg.abraid.mp.common.dto.json; import com.fasterxml.jackson.databind.ObjectWriter; import org.joda.time.DateTime; import org.junit.Test; import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.*; import uk.ac.ox.zoo.seeg.abraid.mp.testutils.AbstractDiseaseExtentGeoJsonTests; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.util.ArrayList; 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 the GeoJsonDiseaseExtentFeatureProperties class. * Copyright (c) 2014 University of Oxford */ public class GeoJsonDiseaseExtentFeaturePropertiesTest extends AbstractDiseaseExtentGeoJsonTests { @Test public void constructorForGeoJsonDiseaseExtentFeaturePropertiesBindsParametersCorrectly() throws Exception { // Arrange String adminUnitName = "Admin Unit"; String validatorDiseaseExtentClassName = "foo2"; AdminUnitDiseaseExtentClass adminUnitDiseaseExtentClass = new AdminUnitDiseaseExtentClass( createAdminUnitGlobal(101, adminUnitName), new DiseaseGroup(), new DiseaseExtentClass("Not Used"), new DiseaseExtentClass(validatorDiseaseExtentClassName), 0); // Act GeoJsonDiseaseExtentFeatureProperties result = new GeoJsonDiseaseExtentFeatureProperties(adminUnitDiseaseExtentClass, new ArrayList<AdminUnitReview>()); // Assert assertThat(result.getName()).isEqualTo(adminUnitName); assertThat(result.getDiseaseExtentClass()).isEqualTo(validatorDiseaseExtentClassName); assertThat(result.getOccurrenceCount()).isEqualTo(0); assertThat(result.getNeedsReview()).isTrue(); // since the admin unit has never been reviewed } @Test public void formatDisplayStringRemovesUnderscoreAndCapitalisesCorrectly() { // Arrange String inputName = "POSSIBLE_PRESENCE"; String outputName = "Possible presence"; AdminUnitDiseaseExtentClass adminUnitDiseaseExtentClass = new AdminUnitDiseaseExtentClass( defaultAdminUnitGlobal(), new DiseaseGroup(), new DiseaseExtentClass("NotUSED"), new DiseaseExtentClass(inputName), 0); // Act GeoJsonDiseaseExtentFeatureProperties result = new GeoJsonDiseaseExtentFeatureProperties(adminUnitDiseaseExtentClass, new ArrayList<AdminUnitReview>()); // Assert assertThat(result.getDiseaseExtentClass()).isEqualTo(outputName); } @Test public void serializingAGeoJsonDiseaseExtentFeaturePropertiesGivesCorrectOutput() throws Exception { // Arrange GeoJsonDiseaseExtentFeatureProperties obj = new GeoJsonDiseaseExtentFeatureProperties( new AdminUnitDiseaseExtentClass( defaultAdminUnitGlobal(), new DiseaseGroup(), new DiseaseExtentClass("NotUSED"), new DiseaseExtentClass("POSSIBLE_PRESENCE"), 0), new ArrayList<AdminUnitReview>() ); AbraidJsonObjectMapper objectMapper = new AbraidJsonObjectMapper(); OutputStream stream = new ByteArrayOutputStream(); ObjectWriter writer = objectMapper.writer(); // Act writer.writeValue(stream, obj); // Assert assertThat(stream.toString()).isEqualTo("{\"name\":\"Admin Unit\",\"diseaseExtentClass\":\"Possible presence\",\"occurrenceCount\":0,\"needsReview\":true}"); } @Test public void getComparisonDateReturnsNullIfBothDatesAreNull() { testGetComparisonDate(null, null, null); } @Test public void getComparisonDateReturnsLastExtentGenerationDateIfAutomaticModelRunsStartDateIsNull() { DateTime lastExtentGenerationDate = DateTime.now(); testGetComparisonDate(lastExtentGenerationDate, null, lastExtentGenerationDate); } @Test public void getComparisonDateReturnsAutomaticModelRunsStartDateIfLastExtentGenerationDateIsNull() { DateTime automaticModelRunsStartDate = DateTime.now(); testGetComparisonDate(null, automaticModelRunsStartDate, automaticModelRunsStartDate); } @Test public void getComparisonDateReturnsLastExtentGenerationDateIfLaterThanAutomaticModelRunsStartDate() { DateTime lastExtentGenerationDate = DateTime.now(); DateTime automaticModelRunsStartDate = DateTime.now().minusDays(1); testGetComparisonDate(lastExtentGenerationDate, automaticModelRunsStartDate, lastExtentGenerationDate); } @Test public void getComparisonDateReturnsAutomaticModelRunsStartDateIfLaterThanLastExtentGenerationDate() { DateTime automaticModelRunsStartDate = DateTime.now(); DateTime lastExtentGenerationDate = DateTime.now().minusDays(1); testGetComparisonDate(lastExtentGenerationDate, automaticModelRunsStartDate, automaticModelRunsStartDate); } private void testGetComparisonDate(DateTime lastExtentGenerationDate, DateTime automaticModelRunsStartDate, DateTime expectedComparisonDate) { AdminUnitDiseaseExtentClass adminUnitDiseaseExtentClass = defaultAdminUnitDiseaseExtentClassWithoutReview(); GeoJsonDiseaseExtentFeatureProperties properties = new GeoJsonDiseaseExtentFeatureProperties(adminUnitDiseaseExtentClass, new ArrayList<AdminUnitReview>()); DiseaseGroup diseaseGroup = mock(DiseaseGroup.class); when(diseaseGroup.getLastExtentGenerationDate()).thenReturn(lastExtentGenerationDate); when(diseaseGroup.getAutomaticModelRunsStartDate()).thenReturn(automaticModelRunsStartDate); DateTime comparisonDate = properties.getComparisonDate(diseaseGroup); assertThat(comparisonDate).isEqualTo(expectedComparisonDate); } @Test public void needsReviewIsTrueIfAdminUnitDiseaseExtentClassHasNeverBeenReviewedAndComparisonDateIsNull() { testNeedsReview(null); } @Test public void needsReviewIsTrueIfAdminUnitDiseaseExtentClassHasNeverBeenReviewedAndComparisonDateIsNotNull() { testNeedsReview(DateTime.now()); } private void testNeedsReview(DateTime comparisonDate) { // Arrange AdminUnitDiseaseExtentClass adminUnitDiseaseExtentClass = new AdminUnitDiseaseExtentClass( new AdminUnitGlobal(), mockDiseaseGroupWithComparisonDate(comparisonDate), new DiseaseExtentClass("name"), new DiseaseExtentClass("name"), 0 ); // Act GeoJsonDiseaseExtentFeatureProperties result = new GeoJsonDiseaseExtentFeatureProperties(adminUnitDiseaseExtentClass, new ArrayList<AdminUnitReview>()); // Assert assertThat(result.getNeedsReview()).isTrue(); } private DiseaseGroup mockDiseaseGroupWithComparisonDate(DateTime comparisonDate) { DiseaseGroup diseaseGroup = mock(DiseaseGroup.class); when(diseaseGroup.getAutomaticModelRunsStartDate()).thenReturn(comparisonDate); when(diseaseGroup.getLastExtentGenerationDate()).thenReturn(null); return diseaseGroup; } @Test public void needsReviewIsFalseIfAdminUnitDiseaseExtentClassHasBeenReviewedAndComparisonDateIsNull() { // Arrange List<AdminUnitReview> reviews = new ArrayList<>(); AdminUnitDiseaseExtentClass extentClass = defaultAdminUnitDiseaseExtentClassWithReview(reviews, null); // Act GeoJsonDiseaseExtentFeatureProperties result = new GeoJsonDiseaseExtentFeatureProperties(extentClass, reviews); // Assert assertThat(result.getNeedsReview()).isFalse(); } @Test public void needsReviewIsTrueIfReviewedDateIsBeforeComparisonDate() { // Arrange List<AdminUnitReview> reviews = new ArrayList<>(); AdminUnitDiseaseExtentClass extentClass = defaultAdminUnitDiseaseExtentClassWithReview(reviews, true); // Act GeoJsonDiseaseExtentFeatureProperties result = new GeoJsonDiseaseExtentFeatureProperties(extentClass, reviews); // Assert assertThat(result.getNeedsReview()).isTrue(); } @Test public void needsReviewIsFalseIfReviewedDateIsAfterComparisonDate() { // Arrange List<AdminUnitReview> reviews = new ArrayList<>(); AdminUnitDiseaseExtentClass extentClass = defaultAdminUnitDiseaseExtentClassWithReview(reviews, false); // Act GeoJsonDiseaseExtentFeatureProperties result = new GeoJsonDiseaseExtentFeatureProperties(extentClass, reviews); // Assert assertThat(result.getNeedsReview()).isFalse(); } }