package uk.ac.ox.zoo.seeg.abraid.mp.publicsite.web.admin.covariates;
import org.apache.commons.io.FileUtils;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
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.dto.json.JsonCovariateConfiguration;
import uk.ac.ox.zoo.seeg.abraid.mp.common.dto.json.JsonCovariateSubFile;
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.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Tests for CovariatesControllerValidator.
* Copyright (c) 2015 University of Oxford
*/
public class CovariatesControllerValidatorTest extends BaseCovariatesControllerTests {
@Rule
public TemporaryFolder testFolder = new TemporaryFolder(); ///CHECKSTYLE:SUPPRESS VisibilityModifier
@Test
public void validateCovariateUploadRejectsNullFile() throws Exception {
// Arrange
CovariatesControllerValidator target = new CovariatesControllerValidator(mock(CovariateService.class), mock(DiseaseService.class));
// Act
Collection<String> result = target.validateCovariateUpload("name", "qualifier", null, "subdir", null, "path");
// Assert
assertThat(result).contains("File missing.");
}
@Test
public void validateCovariateUploadRejectsEmptyFile() throws Exception {
// Arrange
CovariatesControllerValidator target = new CovariatesControllerValidator(mock(CovariateService.class), mock(DiseaseService.class));
MockMultipartFile emptyFile = new MockMultipartFile(" ", new byte[0]);
// Act
Collection<String> result = target.validateCovariateUpload("name", "qualifier", null, "subdir", emptyFile, "path");
// Assert
assertThat(result).contains("File missing.");
}
@Test
public void validateCovariateUploadRejectsNullName() throws Exception {
// Arrange
CovariatesControllerValidator target = new CovariatesControllerValidator(mock(CovariateService.class), mock(DiseaseService.class));
// Act
Collection<String> result = target.validateCovariateUpload(null, "qualifier", null, "subdir", null, "path");
// Assert
assertThat(result).contains("Name missing.");
}
@Test
public void validateCovariateUploadRejectsEmptyName() throws Exception {
// Arrange
CovariatesControllerValidator target = new CovariatesControllerValidator(mock(CovariateService.class), mock(DiseaseService.class));
// Act
Collection<String> result = target.validateCovariateUpload("", "qualifier", null, "subdir", null, "path");
// Assert
assertThat(result).contains("Name missing.");
}
@Test
public void validateCovariateUploadAllowsEmptyNameForSubCovariate() throws Exception {
// Arrange
CovariateService covariateService = mock(CovariateService.class);
CovariatesControllerValidator target = new CovariatesControllerValidator(covariateService, mock(DiseaseService.class));
when(covariateService.getCovariateFileById(1)).thenReturn(mock(CovariateFile.class));
// Act
Collection<String> result = target.validateCovariateUpload("", "qualifier", 1, "subdir", null, "path");
// Assert
assertThat(result).doesNotContain("Name missing.");
}
@Test
public void validateCovariateUploadRejectsInvalidParentId() throws Exception {
// Arrange
CovariatesControllerValidator target = new CovariatesControllerValidator(mock(CovariateService.class), mock(DiseaseService.class));
// Act
Collection<String> result = target.validateCovariateUpload("name", "qualifier", 1, "subdir", null, "path");
// Assert
assertThat(result).contains("Parent ID not valid.");
}
@Test
public void validateCovariateUploadRejectsEmptyQualifier() throws Exception {
// Arrange
CovariatesControllerValidator target = new CovariatesControllerValidator(mock(CovariateService.class), mock(DiseaseService.class));
// Act
Collection<String> result = target.validateCovariateUpload("name", "", null, "subdir", null, "path");
// Assert
assertThat(result).contains("Qualifier missing.");
}
@Test
public void validateCovariateUploadRejectsNullSubdirectory() throws Exception {
// Arrange
CovariatesControllerValidator target = new CovariatesControllerValidator(mock(CovariateService.class), mock(DiseaseService.class));
// Act
Collection<String> result = target.validateCovariateUpload("name", "qualifier", null, null, null, "path");
// Assert
assertThat(result).contains("Subdirectory missing.");
}
@Test
public void validateCovariateUploadRejectsEmptySubdirectory() throws Exception {
// Arrange
CovariatesControllerValidator target = new CovariatesControllerValidator(mock(CovariateService.class), mock(DiseaseService.class));
// Act
Collection<String> result = target.validateCovariateUpload("name", "qualifier", null, "", null, "path");
// Assert
assertThat(result).contains("Subdirectory missing.");
}
@Test
public void validateCovariateUploadRejectsInvalidSubdirectory() throws Exception {
// Arrange
CovariatesControllerValidator target = new CovariatesControllerValidator(mock(CovariateService.class), mock(DiseaseService.class));
Collection<String> result;
// Act/Assert
result = target.validateCovariateUpload("name", "qualifier", null, "./a/../b", null, "path");
assertThat(result).contains("Subdirectory not valid.");
result = target.validateCovariateUpload("name", "qualifier", null, "./a/./b", null, "path");
assertThat(result).contains("Subdirectory not valid.");
result = target.validateCovariateUpload("name", "qualifier", null, "./a//b", null, "path");
assertThat(result).contains("Subdirectory not valid.");
result = target.validateCovariateUpload("name", "qualifier", null, "./a\\b", null, "path");
assertThat(result).contains("Subdirectory not valid.");
}
@Test
public void validateCovariateUploadRejectsNonUniqueName() throws Exception {
// Arrange
CovariateService covariateService = mock(CovariateService.class);
CovariatesControllerValidator target = new CovariatesControllerValidator(covariateService, mock(DiseaseService.class));
CovariateFile covariateFile = mock(CovariateFile.class);
when(covariateService.getAllCovariateFiles()).thenReturn(Arrays.asList(covariateFile));
when(covariateFile.getName()).thenReturn("not unique");
// Act
Collection<String> result = target.validateCovariateUpload("not unique", "qualifier", null, "subdir", null, "path");
// Assert
assertThat(result).contains("Name not unique.");
}
@Test
public void validateCovariateUploadRejectsPrexistingPath() throws Exception {
// Arrange
CovariateService covariateService = mock(CovariateService.class);
CovariatesControllerValidator target = new CovariatesControllerValidator(covariateService, mock(DiseaseService.class));
when(covariateService.getAllCovariateFiles()).thenReturn(new ArrayList<CovariateFile>());
MockMultipartFile file = new MockMultipartFile(" ", new byte[1]);
File existing = testFolder.newFile();
FileUtils.write(existing, "exists");
when(covariateService.getCovariateDirectory()).thenReturn(testFolder.getRoot().getAbsolutePath());
// Act
Collection<String> result = target.validateCovariateUpload("name", "qualifier", null, "subdir", file, existing.toString());
// Assert
assertThat(result).contains("File already exists.");
}
@Test
public void validateCovariateUploadRejectsPathNotUnderCovariateDirectory() throws Exception {
// Arrange
CovariateService covariateService = mock(CovariateService.class);
when(covariateService.getAllCovariateFiles()).thenReturn(new ArrayList<CovariateFile>());
MockMultipartFile file = new MockMultipartFile(" ", new byte[1]);
String path = Paths.get(testFolder.getRoot().toString(), "asdfas").toFile().getAbsolutePath();
String covdir = testFolder.newFolder().getAbsolutePath();
when(covariateService.getCovariateDirectory()).thenReturn(covdir);
CovariatesControllerValidator target = new CovariatesControllerValidator(covariateService, mock(DiseaseService.class));
// Act
Collection<String> result = target.validateCovariateUpload("name", "qualifier", null, "subdir", file, path);
// Assert
assertThat(result).contains("Target path not valid.");
}
@Test
public void validateCovariateUploadAcceptsValidParameters() throws Exception {
// Arrange
CovariateService covariateService = mock(CovariateService.class);
when(covariateService.getAllCovariateFiles()).thenReturn(new ArrayList<CovariateFile>());
MockMultipartFile file = new MockMultipartFile(" ", new byte[1]);
String path = Paths.get(testFolder.getRoot().toString(), "asdfas").toFile().getAbsolutePath();
String covdir = testFolder.getRoot().getAbsolutePath();
when(covariateService.getCovariateDirectory()).thenReturn(covdir);
when(covariateService.getCovariateDirectory()).thenReturn(covdir);
CovariatesControllerValidator target = new CovariatesControllerValidator(covariateService, mock(DiseaseService.class));
// Act
Collection<String> result = target.validateCovariateUpload("name", "qualifier", null, "subdir", file, path);
// Assert
assertThat(result).hasSize(0);
}
@Test
public void validateCovariateConfigurationRejectsNull() throws Exception {
// Arrange
CovariatesControllerValidator target = new CovariatesControllerValidator(mock(CovariateService.class), mock(DiseaseService.class));
// Act
Collection<String> result = target.validateCovariateConfiguration(null);
// Assert
assertThat(result).contains("'files' is null.");
}
@Test
public void validateCovariateConfigurationRejectsNullFiles() throws Exception {
// Arrange
JsonCovariateConfiguration config = mock(JsonCovariateConfiguration.class);
when(config.getFiles()).thenReturn(null);
CovariatesControllerValidator target = new CovariatesControllerValidator(mock(CovariateService.class), mock(DiseaseService.class));
// Act
Collection<String> result = target.validateCovariateConfiguration(config);
// Assert
assertThat(result).contains("'files' is null.");
}
@Test
public void validateCovariateConfigurationRejectsNewSubFile() throws Exception {
// Arrange
JsonCovariateConfiguration config = createValidMockConfig();
CovariateService covariateService = createMockCovariateService(testFolder.getRoot());
DiseaseService diseaseService = createMockDiseaseService();
CovariatesControllerValidator target = new CovariatesControllerValidator(covariateService, diseaseService);
config.getFiles().get(0).getSubFiles().add(createMockJsonCovariateSubFile(11, "Wrong", "foo"));
// Act
Collection<String> result = target.validateCovariateConfiguration(config);
// Assert
assertThat(result).contains("Unexpected file or subfile listed or missing.");
}
@Test
public void validateCovariateConfigurationRejectsUnknownSubFile() throws Exception {
// Arrange
JsonCovariateConfiguration config = createValidMockConfig();
CovariateService covariateService = createMockCovariateService(testFolder.getRoot());
DiseaseService diseaseService = createMockDiseaseService();
CovariatesControllerValidator target = new CovariatesControllerValidator(covariateService, diseaseService);
when(config.getFiles().get(0).getSubFiles().get(0).getId()).thenReturn(111);
// Act
Collection<String> result = target.validateCovariateConfiguration(config);
// Assert
assertThat(result).contains("Unexpected file or subfile listed or missing.");
}
@Test
public void validateCovariateConfigurationRejectsMissingSubFile() throws Exception {
// Arrange
JsonCovariateConfiguration config = createValidMockConfig();
CovariateService covariateService = createMockCovariateService(testFolder.getRoot());
DiseaseService diseaseService = createMockDiseaseService();
CovariatesControllerValidator target = new CovariatesControllerValidator(covariateService, diseaseService);
config.getFiles().get(0).getSubFiles().remove(0);
// Act
Collection<String> result = target.validateCovariateConfiguration(config);
// Assert
assertThat(result).contains("Unexpected file or subfile listed or missing.");
}
@Test
public void validateCovariateConfigurationRejectsNewCovariate() throws Exception {
// Arrange
JsonCovariateConfiguration config = createValidMockConfig();
CovariateService covariateService = createMockCovariateService(testFolder.getRoot());
DiseaseService diseaseService = createMockDiseaseService();
CovariatesControllerValidator target = new CovariatesControllerValidator(covariateService, diseaseService);
config.getFiles().add(createMockJsonCovariateFile(11, "Wrong", false, new ArrayList<Integer>(), new ArrayList<JsonCovariateSubFile>()));
// Act
Collection<String> result = target.validateCovariateConfiguration(config);
// Assert
assertThat(result).contains("Unexpected file or subfile listed or missing.");
}
@Test
public void validateCovariateConfigurationRejectsUnknownCovariate() throws Exception {
// Arrange
JsonCovariateConfiguration config = createValidMockConfig();
CovariateService covariateService = createMockCovariateService(testFolder.getRoot());
DiseaseService diseaseService = createMockDiseaseService();
CovariatesControllerValidator target = new CovariatesControllerValidator(covariateService, diseaseService);
when(config.getFiles().get(0).getId()).thenReturn(111);
// Act
Collection<String> result = target.validateCovariateConfiguration(config);
// Assert
assertThat(result).contains("Unexpected file or subfile listed or missing.");
}
@Test
public void validateCovariateConfigurationRejectsMissingCovariate() throws Exception {
// Arrange
JsonCovariateConfiguration config = createValidMockConfig();
CovariateService covariateService = createMockCovariateService(testFolder.getRoot());
DiseaseService diseaseService = createMockDiseaseService();
CovariatesControllerValidator target = new CovariatesControllerValidator(covariateService, diseaseService);
config.getFiles().remove(0);
// Act
Collection<String> result = target.validateCovariateConfiguration(config);
// Assert
assertThat(result).contains("Unexpected file or subfile listed or missing.");
}
@Test
public void validateCovariateConfigurationRejectsDuplicateEnabledDiseases() throws Exception {
// Arrange
JsonCovariateConfiguration config = createValidMockConfig();
CovariateService covariateService = createMockCovariateService(testFolder.getRoot());
DiseaseService diseaseService = createMockDiseaseService();
CovariatesControllerValidator target = new CovariatesControllerValidator(covariateService, diseaseService);
config.getFiles().get(0).getEnabled().add(22);
// Act
Collection<String> result = target.validateCovariateConfiguration(config);
// Assert
assertThat(result).contains("Enabled disease ids contains duplicates.");
}
@Test
public void validateCovariateConfigurationRejectsUnknownEnabledDiseases() throws Exception {
// Arrange
JsonCovariateConfiguration config = createValidMockConfig();
CovariateService covariateService = createMockCovariateService(testFolder.getRoot());
DiseaseService diseaseService = createMockDiseaseService();
CovariatesControllerValidator target = new CovariatesControllerValidator(covariateService, diseaseService);
config.getFiles().get(0).getEnabled().add(23);
// Act
Collection<String> result = target.validateCovariateConfiguration(config);
// Assert
assertThat(result).contains("One or more files specify usage for an unknown disease id.");
}
}