package uk.ac.ox.zoo.seeg.abraid.mp.publicsite.web.admin.covariates; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.mockito.ArgumentCaptor; import org.springframework.mock.web.MockMultipartFile; import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.CovariateFile; import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.CovariateSubFile; import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.CovariateValueBin; import uk.ac.ox.zoo.seeg.abraid.mp.common.dto.json.JsonCovariateConfiguration; import uk.ac.ox.zoo.seeg.abraid.mp.common.service.core.CovariateService; import uk.ac.ox.zoo.seeg.abraid.mp.common.service.core.DiseaseService; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static ch.lambdaj.Lambda.on; import static ch.lambdaj.Lambda.sort; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.extractProperty; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.*; import static uk.ac.ox.zoo.seeg.abraid.mp.testutils.GeneralTestUtils.captorForClass; /** * Tests for CovariatesControllerHelper. * Copyright (c) 2015 University of Oxford */ public class CovariatesControllerHelperTest extends BaseCovariatesControllerTests { @Rule public TemporaryFolder testFolder = new TemporaryFolder(); ///CHECKSTYLE:SUPPRESS VisibilityModifier private static final String TEST_DATA_PATH = "PublicSite/test/uk/ac/ox/zoo/seeg/abraid/mp/publicsite/web/admin/covariates"; @Test public void extractTargetPathReturnsCorrectPath() throws Exception { // Arrange CovariateService covariateService = createMockCovariateService(testFolder.getRoot()); CovariatesControllerHelper target = new CovariatesControllerHelperImpl(covariateService, mock(DiseaseService.class)); // Act String result = target.extractTargetPath("subdir/as", new MockMultipartFile("fn.g", "ofn.g", "application/octet-stream", new byte[0])); // Assert assertThat(result).isEqualTo(FilenameUtils.separatorsToUnix(testFolder.getRoot().getAbsolutePath()) + "/subdir/as/ofn.g"); } @Test public void getCovariateConfigurationReturnsCorrectConfig() throws Exception { // Arrange CovariateService covariateService = createMockCovariateService(testFolder.getRoot()); DiseaseService diseaseService = createMockDiseaseService(); CovariatesControllerHelper target = new CovariatesControllerHelperImpl(covariateService, diseaseService); // Act JsonCovariateConfiguration result = target.getCovariateConfiguration(); // Assert JsonCovariateConfiguration expected = createValidMockConfig(); assertThat(result.getFiles().size()).isEqualTo(4); assertThat(result.getFiles().get(0).getId()).isEqualTo(expected.getFiles().get(0).getId()); assertThat(result.getFiles().get(0).getName()).isEqualTo(expected.getFiles().get(0).getName()); assertThat(result.getFiles().get(0).getHide()).isEqualTo(expected.getFiles().get(0).getHide()); assertThat(result.getFiles().get(0).getInfo()).isEqualTo(expected.getFiles().get(0).getInfo()); assertThat(result.getFiles().get(0).getEnabled()).isEqualTo(expected.getFiles().get(0).getEnabled()); assertThat(result.getFiles().get(0).getSubFiles().size()).isEqualTo(expected.getFiles().get(0).getSubFiles().size()); assertThat(result.getFiles().get(0).getSubFiles().get(0).getId()).isEqualTo(expected.getFiles().get(0).getSubFiles().get(0).getId()); assertThat(result.getDiseases().size()).isEqualTo(2); assertThat(result.getDiseases().get(0).getId()).isEqualTo(22); } @Test public void setCovariateConfigurationUpdatesDBCorrectly() throws Exception { // Arrange CovariateService covariateService = createMockCovariateService(testFolder.getRoot()); DiseaseService diseaseService = createMockDiseaseService(); JsonCovariateConfiguration config = createValidMockConfig(); when(config.getFiles().get(0).getName()).thenReturn("new Name"); when(config.getFiles().get(0).getHide()).thenReturn(true); when(config.getFiles().get(0).getSubFiles().get(0).getQualifier()).thenReturn("qwe"); when(config.getFiles().get(0).getDiscrete()).thenReturn(true); when(config.getFiles().get(2).getEnabled()).thenReturn(Arrays.asList(22, 60)); when(config.getFiles().get(2).getInfo()).thenReturn("new"); CovariatesControllerHelper target = new CovariatesControllerHelperImpl(covariateService, diseaseService); // Act target.setCovariateConfiguration(config); // Assert CovariateFile c1 = covariateService.getAllCovariateFiles().get(0); verify(c1).setName("new Name"); verify(c1).setHide(true); verify(c1, never()).setDiscrete(true); // Read only verify(c1.getFiles().get(0)).setQualifier("qwe"); verify(covariateService).saveCovariateFile(c1); CovariateFile c2 = covariateService.getAllCovariateFiles().get(2); verify(c2).setEnabledDiseaseGroups(eq(diseaseService.getAllDiseaseGroups())); verify(c2).setInfo("new"); verify(covariateService).saveCovariateFile(c2); } @Test public void saveNewCovariateFileStoresCorrectlyForContinuousRasterIncludingHistogramData() throws Exception { // Arrange CovariateService covariateService = createMockCovariateService(testFolder.getRoot()); DiseaseService diseaseService = createMockDiseaseService(); CovariatesControllerHelper target = new CovariatesControllerHelperImpl(covariateService, diseaseService); File refFile = new File(TEST_DATA_PATH, "continuous_raster.tif"); byte[] bytes = FileUtils.readFileToByteArray(refFile); // Act target.saveNewCovariateFile("name", "qualifier", null, false, covariateService.getCovariateDirectory() + "/asd/fas", new MockMultipartFile("foo", "oof", "application/octet-stream", bytes)); // Assert assertThat(new File(covariateService.getCovariateDirectory() + "/asd/fas")).hasContentEqualTo(refFile); ArgumentCaptor<CovariateFile> captor = captorForClass(CovariateFile.class); verify(covariateService).saveCovariateFile(captor.capture()); CovariateFile saved = captor.getValue(); assertThat(saved.getName()).isEqualTo("name"); assertThat(saved.getFiles().get(0).getFile()).isEqualTo("asd/fas"); assertThat(saved.getFiles().get(0).getQualifier()).isEqualTo("qualifier"); assertThat(saved.getHide()).isEqualTo(false); assertThat(saved.getDiscrete()).isEqualTo(false); assertThat(saved.getInfo()).isEqualTo(""); assertThat(saved.getEnabledDiseaseGroups()).isNullOrEmpty(); assertThat(saved.getCovariateValueHistogramData()).hasSize(10); List<Object> sorted = sort(saved.getCovariateValueHistogramData(), on(CovariateValueBin.class).getMin()); assertThat(extractProperty("min").from(sorted)).containsExactly(0.0, 0.09996433036867529, 0.19992866073735058, 0.29989299110602585, 0.39985732147470116, 0.49982165184337646, 0.5997859822120517, 0.6997503125807271, 0.7997146429494023, 0.8996789733180776); assertThat(extractProperty("max").from(sorted)).containsExactly(0.09996433036867529, 0.19992866073735058, 0.29989299110602585, 0.39985732147470116, 0.49982165184337646, 0.5997859822120517, 0.6997503125807271, 0.7997146429494023, 0.8996789733180776, 0.9996433036867529); assertThat(extractProperty("count").from(sorted)).containsExactly(686, 130, 138, 129, 136, 131, 114, 161, 126, 130); assertThat(extractProperty("covariateFile").from(sorted)).containsExactly(saved, saved, saved, saved, saved, saved, saved, saved, saved, saved); } @Test public void saveNewCovariateFileStoresCorrectlyForDiscreteRasterIncludingHistogramData() throws Exception { // Arrange CovariateService covariateService = createMockCovariateService(testFolder.getRoot()); DiseaseService diseaseService = createMockDiseaseService(); CovariatesControllerHelper target = new CovariatesControllerHelperImpl(covariateService, diseaseService); File refFile = new File(TEST_DATA_PATH, "discrete_raster.tif"); byte[] bytes = FileUtils.readFileToByteArray(refFile); // Act target.saveNewCovariateFile("name", "qualifier", null, true, covariateService.getCovariateDirectory() + "/asd/fas", new MockMultipartFile("foo", "oof", "application/octet-stream", bytes)); // Assert assertThat(new File(covariateService.getCovariateDirectory() + "/asd/fas")).hasContentEqualTo(refFile); ArgumentCaptor<CovariateFile> captor = captorForClass(CovariateFile.class); verify(covariateService).saveCovariateFile(captor.capture()); CovariateFile saved = captor.getValue(); assertThat(saved.getName()).isEqualTo("name"); assertThat(saved.getFiles().get(0).getFile()).isEqualTo("asd/fas"); assertThat(saved.getFiles().get(0).getQualifier()).isEqualTo("qualifier"); assertThat(saved.getHide()).isEqualTo(false); assertThat(saved.getDiscrete()).isEqualTo(true); assertThat(saved.getInfo()).isEqualTo(""); assertThat(saved.getEnabledDiseaseGroups()).isNullOrEmpty(); assertThat(saved.getCovariateValueHistogramData()).hasSize(5); List<Object> sorted = sort(saved.getCovariateValueHistogramData(), on(CovariateValueBin.class).getMin()); assertThat(extractProperty("min").from(sorted)).containsExactly(0.0, 0.25, 0.5, 0.75, 1.0); assertThat(extractProperty("max").from(sorted)).containsExactly(0.0, 0.25, 0.5, 0.75, 1.0); assertThat(extractProperty("count").from(sorted)).containsExactly(557, 327, 337, 329, 331); assertThat(extractProperty("covariateFile").from(sorted)).containsExactly(saved, saved, saved, saved, saved); } @Test public void saveNewCovariateSavesFileAtCorrectLocation() throws Exception { // Arrange CovariateService covariateService = createMockCovariateService(testFolder.getRoot()); DiseaseService diseaseService = createMockDiseaseService(); CovariatesControllerHelper target = new CovariatesControllerHelperImpl(covariateService, diseaseService); File refFile = new File(TEST_DATA_PATH, "continuous_raster.tif"); byte[] bytes = FileUtils.readFileToByteArray(refFile); // Act target.saveNewCovariateFile("name", "qualifier", null, true, covariateService.getCovariateDirectory() + "/asd/fas", new MockMultipartFile("foo", "oof", "application/octet-stream", bytes)); // Assert assertThat(new File(covariateService.getCovariateDirectory() + "/asd/fas")).hasContentEqualTo(refFile); CovariateFile expectedFile = new CovariateFile("name", false, true, ""); CovariateSubFile expectedSubFile = new CovariateSubFile(expectedFile, "qualifier", "asd/fas"); expectedFile.setFiles(Arrays.asList(expectedSubFile)); verify(covariateService).saveCovariateFile(eq(expectedFile)); } @Test public void saveNewCovariateSavesSubFileCorrectly() throws Exception { // Arrange CovariateService covariateService = createMockCovariateService(testFolder.getRoot()); DiseaseService diseaseService = createMockDiseaseService(); CovariateFile parentFile = mock(CovariateFile.class); when(parentFile.getFiles()).thenReturn(new ArrayList<CovariateSubFile>()); when(covariateService.getCovariateFileById(1)).thenReturn(parentFile); CovariatesControllerHelper target = new CovariatesControllerHelperImpl(covariateService, diseaseService); File refFile = new File(TEST_DATA_PATH, "continuous_raster.tif"); byte[] bytes = FileUtils.readFileToByteArray(refFile); // Act target.saveNewCovariateFile("name", "qualifier", 1, true, covariateService.getCovariateDirectory() + "/asd/fas", new MockMultipartFile("foo", "oof", "application/octet-stream", bytes)); // Assert assertThat(new File(covariateService.getCovariateDirectory() + "/asd/fas")).hasContentEqualTo(refFile); assertThat(parentFile.getFiles().get(parentFile.getFiles().size() - 1).getQualifier()).isEqualTo("qualifier"); assertThat(parentFile.getFiles().get(parentFile.getFiles().size() - 1).getFile()).isEqualTo("asd/fas"); verify(covariateService).saveCovariateFile(parentFile); } }