package uk.ac.ox.zoo.seeg.abraid.mp.publicsite.web.tools;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.ui.Model;
import org.springframework.web.multipart.MultipartFile;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.DiseaseGroup;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.Expert;
import uk.ac.ox.zoo.seeg.abraid.mp.common.dto.json.AbraidJsonObjectMapper;
import uk.ac.ox.zoo.seeg.abraid.mp.common.dto.json.JsonFileUploadResponse;
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 uk.ac.ox.zoo.seeg.abraid.mp.publicsite.domain.JsonParentDiseaseGroup;
import uk.ac.ox.zoo.seeg.abraid.mp.publicsite.security.CurrentUserService;
import uk.ac.ox.zoo.seeg.abraid.mp.testutils.GeneralTestUtils;
import java.util.Arrays;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.*;
/**
* Tests the UploadCsvController class.
*
* Copyright (c) 2014 University of Oxford
*/
public class UploadCsvControllerTest {
private CurrentUserService currentUserService;
private ExpertService expertService;
private DiseaseService diseaseService;
private UploadCsvControllerHelperAsyncWrapper uploadCsvControllerHelperAsyncWrapper;
private UploadCsvController controller;
private static final String USER_EMAIL_ADDRESS = "user@test.com";
private DiseaseGroup diseaseGroup;
private AbraidJsonObjectMapper objectMapper;
@Before
public void setUp() {
currentUserService = mock(CurrentUserService.class);
expertService = mock(ExpertService.class);
diseaseService = mock(DiseaseService.class);
diseaseGroup = mock(DiseaseGroup.class);
when(diseaseService.getDiseaseGroupById(87)).thenReturn(diseaseGroup);
objectMapper = mock(AbraidJsonObjectMapper.class);
uploadCsvControllerHelperAsyncWrapper = mock(UploadCsvControllerHelperAsyncWrapper.class);
controller = new UploadCsvController(
currentUserService, expertService, diseaseService, objectMapper, uploadCsvControllerHelperAsyncWrapper);
setUpCurrentUserService();
}
private void setUpCurrentUserService() {
when(currentUserService.getCurrentUserId()).thenReturn(1);
Expert expert = mock(Expert.class);
when(expertService.getExpertById(1)).thenReturn(expert);
when(expert.getEmail()).thenReturn(USER_EMAIL_ADDRESS);
}
@Test
public void showCSVPageTemplatesCorrectly() throws Exception {
// Arrange
List<DiseaseGroup> diseaseGroups = Arrays.asList(createDisease(2, "b"), createDisease(3, "a"));
when(diseaseService.getAllDiseaseGroups()).thenReturn(diseaseGroups);
ArgumentCaptor<List<JsonParentDiseaseGroup>> captor = GeneralTestUtils.captorForListClass();
when(objectMapper.writeValueAsString(captor.capture())).thenReturn("correctDiseaseGroups");
// Act
Model model = mock(Model.class);
String template = controller.showCSVPage(model);
// Assert
assertThat(template).isEqualTo("tools/uploadcsv");
verify(model).addAttribute("diseaseGroups", "correctDiseaseGroups");
List<JsonParentDiseaseGroup> jsonDto = captor.getValue();
assertThat(jsonDto.get(0).getId()).isEqualTo(3);
assertThat(jsonDto.get(0).getName()).isEqualTo("a");
assertThat(jsonDto.get(1).getId()).isEqualTo(2);
assertThat(jsonDto.get(1).getName()).isEqualTo("b");
}
private DiseaseGroup createDisease(int id, String name) {
DiseaseGroup mock = mock(DiseaseGroup.class);
when(mock.getId()).thenReturn(id);
when(mock.getName()).thenReturn(name);
return mock;
}
@Test
public void uploadCsvFileReturnsBadRequestIfFileIsNull() throws Exception {
// Act
ResponseEntity<JsonFileUploadResponse> responseEntity = controller.uploadCsvFile(null, false, false, 87);
// Assert
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST);
assertThat(responseEntity.getBody().getStatus()).isEqualTo(JsonFileUploadResponse.FAIL);
}
@Test
public void uploadCsvFileReturnsBadRequestIfFileIsEmpty() throws Exception {
// Arrange
MultipartFile file = new MockMultipartFile("filename", new byte[] {});
// Act
ResponseEntity<JsonFileUploadResponse> responseEntity = controller.uploadCsvFile(file, false, false, 87);
// Assert
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST);
assertThat(responseEntity.getBody().getStatus()).isEqualTo(JsonFileUploadResponse.FAIL);
}
@Test
public void uploadCsvFileReturnsBadRequestBiasDataSetWithInvalidDiseaseID() throws Exception {
// Arrange
byte[] csv = "Test CSV".getBytes();
String filename = "filename.csv";
String filePath = "/path/to/filename.csv";
MultipartFile file = new MockMultipartFile(filename, filePath, MediaType.APPLICATION_OCTET_STREAM_VALUE, csv);
// Act
ResponseEntity<JsonFileUploadResponse> responseEntity = controller.uploadCsvFile(file, true, false, -87);
// Assert
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST);
assertThat(responseEntity.getBody().getStatus()).isEqualTo(JsonFileUploadResponse.FAIL);
}
@Test
public void uploadCsvFileReturnsOKIfSuccessful() throws Exception {
uploadCsvFileSuccessful(false, false, 87);
}
@Test
public void uploadGoldStandardCsvFileReturnsOKIfSuccessful() throws Exception {
uploadCsvFileSuccessful(false, true, 87);
}
@Test
public void uploadBiasCsvFileReturnsOKIfSuccessful() throws Exception {
uploadCsvFileSuccessful(true, false, 87);
}
private void uploadCsvFileSuccessful(boolean isBias, boolean isGoldStandard, int biasDisease) throws Exception {
// Arrange
byte[] csv = "Test CSV".getBytes();
String filename = "filename.csv";
String filePath = "/path/to/filename.csv";
MultipartFile file = new MockMultipartFile(filename, filePath, MediaType.APPLICATION_OCTET_STREAM_VALUE, csv);
DiseaseGroup expectedDisease = isBias ? diseaseGroup : null;
// Act
ResponseEntity<JsonFileUploadResponse> responseEntity = controller.uploadCsvFile(file, isBias, isGoldStandard, biasDisease);
// Assert
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(responseEntity.getBody().getStatus()).isEqualTo(JsonFileUploadResponse.SUCCESS);
verify(uploadCsvControllerHelperAsyncWrapper).acquireCsvData(eq(csv), eq(isBias), eq(isGoldStandard),
eq(expectedDisease), eq(USER_EMAIL_ADDRESS), eq(filePath));
}
@Test
public void purgeBiasDataReturnsBadRequestWithInvalidDiseaseID() throws Exception {
// Act
ResponseEntity responseEntity = controller.purgeBiasData(-87);
// Assert
verify(diseaseService, never()).deleteBiasDiseaseOccurrencesForDisease(diseaseGroup);
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST);
}
@Test
public void purgeBiasDataReturnsNoContentIfSuccessful() throws Exception {
// Act
ResponseEntity responseEntity = controller.purgeBiasData(87);
// Assert
verify(diseaseService).deleteBiasDiseaseOccurrencesForDisease(diseaseGroup);
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT);
}
}