package gov.samhsa.consent2share.service.clinicaldata;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import gov.samhsa.consent2share.common.AuthenticatedUser;
import gov.samhsa.consent2share.common.UserContext;
import gov.samhsa.consent2share.domain.clinicaldata.ClinicalDocumentRepository;
import gov.samhsa.consent2share.domain.patient.Patient;
import gov.samhsa.consent2share.domain.patient.PatientRepository;
import gov.samhsa.consent2share.domain.reference.ClinicalDocumentTypeCodeRepository;
import gov.samhsa.consent2share.service.dto.ClinicalDocumentDto;
import gov.samhsa.consent2share.service.dto.PatientProfileDto;
import java.util.Arrays;
import java.util.List;
import javax.validation.Validator;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.modelmapper.ModelMapper;
import org.springframework.web.multipart.MultipartFile;
/**
* The Class ClinicalDocumentServiceImplTest.
*/
@RunWith(MockitoJUnitRunner.class)
public class ClinicalDocumentServiceImplTest {
/** The clinical document repository. */
@Mock
ClinicalDocumentRepository clinicalDocumentRepository;
/** The clinical document type code repository. */
@Mock
ClinicalDocumentTypeCodeRepository clinicalDocumentTypeCodeRepository;
/** The model mapper. */
@Mock
ModelMapper modelMapper;
/** The patient repository. */
@Mock
PatientRepository patientRepository;
/** The user context. */
@Mock
UserContext userContext;
/** The validator. */
@Mock
Validator validator;
/** The sut. */
ClinicalDocumentServiceImpl sut;
/** The max file size. */
private Long maxFileSize = (long) 10000000;
/** The permitted extensions. */
private String permittedExtensions = "txt,xml";
/**
* Sets the up.
*
* @throws Exception
*/
@Before
public void setUp() throws Exception {
ClinicalDocumentServiceImpl clinicalDocumentServiceImpl = new ClinicalDocumentServiceImpl(
Long.toString(maxFileSize), permittedExtensions,
clinicalDocumentRepository, clinicalDocumentTypeCodeRepository,
modelMapper, patientRepository, userContext, validator);
clinicalDocumentServiceImpl.afterPropertiesSet();
sut = spy(clinicalDocumentServiceImpl);
}
/**
* Test is document extension permitted when extension is permitted.
*/
@Test
public void testIsDocumentExtensionPermittedWhenExtensionIsPermitted() {
MultipartFile file = mock(MultipartFile.class);
when(file.getOriginalFilename()).thenReturn("hello.xml");
assertTrue(sut.isDocumentExtensionPermitted(file));
}
/**
* Test is document extension permitted when extension is not permitted.
*/
@Test
public void testIsDocumentExtensionPermittedWhenExtensionIsNotPermitted() {
MultipartFile file = mock(MultipartFile.class);
when(file.getOriginalFilename()).thenReturn("hello.pdf");
assertFalse(sut.isDocumentExtensionPermitted(file));
}
/**
* Test is document extension permitted when file name has no extension.
*/
@Test
public void testIsDocumentExtensionPermittedWhenFileNameHasNoExtension() {
MultipartFile file = mock(MultipartFile.class);
when(file.getOriginalFilename()).thenReturn("hello");
assertFalse(sut.isDocumentExtensionPermitted(file));
}
/**
* Test is document oversized when file fits.
*/
@Test
public void testIsDocumentOversizedWhenFileFits() {
MultipartFile file = mock(MultipartFile.class);
when(file.getSize()).thenReturn((long) 10000);
assertFalse(sut.isDocumentOversized(file));
}
/**
* Test is document oversized when file is oversized.
*/
@Test
public void testIsDocumentOversizedWhenFileIsOversized() {
MultipartFile file = mock(MultipartFile.class);
when(file.getSize()).thenReturn((long) 1000000000);
assertTrue(sut.isDocumentOversized(file));
}
@Test
public void testIsDocumentBelongedToThisUserWhenAuthenticationSucceds() {
ClinicalDocumentDto clinicalDocumentDto = mock(ClinicalDocumentDto.class);
ClinicalDocumentDto patientsClinicalDocumentDto = mock(ClinicalDocumentDto.class);
AuthenticatedUser currentUser = mock(AuthenticatedUser.class);
Patient patient = mock(Patient.class);
List<ClinicalDocumentDto> clinicaldocumentDtos = Arrays
.asList(patientsClinicalDocumentDto);
doReturn("1").when(clinicalDocumentDto).getId();
doReturn("1").when(patientsClinicalDocumentDto).getId();
doReturn("Owner").when(currentUser).getUsername();
doReturn(patient).when(patientRepository).findByUsername("Owner");
doReturn(clinicaldocumentDtos).when(sut).findDtoByPatient(patient);
doReturn(currentUser).when(userContext).getCurrentUser();
assertTrue(sut.isDocumentBelongsToThisUser(clinicalDocumentDto));
}
@Test
public void testIsDocumentBelongedToThisUserWhenAuthenticationFailed() {
ClinicalDocumentDto clinicalDocumentDto = mock(ClinicalDocumentDto.class);
ClinicalDocumentDto patientsClinicalDocumentDto = mock(ClinicalDocumentDto.class);
AuthenticatedUser currentUser = mock(AuthenticatedUser.class);
Patient patient = mock(Patient.class);
List<ClinicalDocumentDto> clinicaldocumentDtos = Arrays
.asList(patientsClinicalDocumentDto);
doReturn("1").when(clinicalDocumentDto).getId();
doReturn("2").when(patientsClinicalDocumentDto).getId();
doReturn("Owner").when(currentUser).getUsername();
doReturn(patient).when(patientRepository).findByUsername("Owner");
doReturn(clinicaldocumentDtos).when(sut).findDtoByPatient(patient);
doReturn(currentUser).when(userContext).getCurrentUser();
assertFalse(sut.isDocumentBelongsToThisUser(clinicalDocumentDto));
}
@Test
public void testFindDtoByPatientDto() {
PatientProfileDto patientDto = mock(PatientProfileDto.class);
Patient patient = mock(Patient.class);
ClinicalDocumentDto clinicalDocumentDto = mock(ClinicalDocumentDto.class);
List<ClinicalDocumentDto> dtos = Arrays.asList(clinicalDocumentDto);
when(patientDto.getUsername()).thenReturn("user1");
when(patientRepository.findByUsername("user1")).thenReturn(patient);
doReturn(dtos).when(sut).findDtoByPatient(patient);
assertEquals(dtos, sut.findDtoByPatientDto(patientDto));
}
}