package gov.samhsa.consent2share.web.controller; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; import gov.samhsa.consent2share.common.AuthenticatedUser; import gov.samhsa.consent2share.common.UserContext; import gov.samhsa.consent2share.service.dto.CodeSystemDto; import gov.samhsa.consent2share.service.dto.ConceptCodeDto; import gov.samhsa.consent2share.service.dto.ConceptCodeVSCSDto; import gov.samhsa.consent2share.service.dto.ValueSetDto; import gov.samhsa.consent2share.service.valueset.CodeSystemNotFoundException; import gov.samhsa.consent2share.service.valueset.CodeSystemService; import gov.samhsa.consent2share.service.valueset.CodeSystemVersionNotFoundException; import gov.samhsa.consent2share.service.valueset.ConceptCodeNotFoundException; import gov.samhsa.consent2share.service.valueset.ConceptCodeService; import gov.samhsa.consent2share.service.valueset.ValueSetNotFoundException; import gov.samhsa.consent2share.service.valueset.ValueSetService; import gov.samhsa.consent2share.web.controller.ConceptCodeController; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; @RunWith(MockitoJUnitRunner.class) public class ConceptCodeControllerTest { @InjectMocks ConceptCodeController conceptCodeController; @Mock ConceptCodeService conceptCodeService; @Mock CodeSystemService codeSystemService; @Mock ValueSetService valueSetService; @Mock UserContext userContext; MockMvc mockMvc; @Before public void setUp(){ mockMvc = MockMvcBuilders.standaloneSetup(this.conceptCodeController).build(); } @Test public void testGetConceptCodeList() throws Exception{ ConceptCodeVSCSDto conceptCodeVSCSDto = mock(ConceptCodeVSCSDto.class); List<CodeSystemDto> codeSystems = (List<CodeSystemDto>) mock(List.class); List<ValueSetDto> valueSets = (List<ValueSetDto>) mock(List.class); when(conceptCodeService.create()).thenReturn(conceptCodeVSCSDto); when(codeSystemService.findAll()).thenReturn(codeSystems); when(valueSetService.findAllWithoutDeletable()).thenReturn(valueSets); mockMvc.perform(get("/sysadmin/conceptCodeList")) .andExpect(status().isOk()) .andExpect(model().attribute("conceptCodeVSCSDto", conceptCodeVSCSDto)) .andExpect(model().attribute("codeSystems", codeSystems)) .andExpect(model().attribute("valueSets", valueSets)) .andExpect(view().name("views/sysadmin/conceptCodeList")); } @Test public void testAjaxGetAllConceptCodes() throws Exception{ List<ConceptCodeDto> conceptCodes = conceptCodeService.findAll(); when(conceptCodeService.findAll()).thenReturn(conceptCodes); mockMvc.perform(get("/sysadmin/conceptCode/ajaxGetAllConceptCodes")) .andExpect(status().isOk()) .andExpect(content().contentType("application/json;charset=UTF-8")); } @Test public void testAjaxSearchConceptCode_By_Name() throws Exception{ List<ConceptCodeDto> conceptCodes= new ArrayList<ConceptCodeDto>(); Map<String, Object> pagedconceptCodes = new HashMap<String, Object>(); ConceptCodeDto ccdto=new ConceptCodeDto(); ccdto.setName("disorder"); conceptCodes.add(ccdto); when(conceptCodeService.findAllByName(anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(pagedconceptCodes); mockMvc.perform(get("/sysadmin/conceptCode/ajaxSearchConceptCode/pageNumber/0/searchCategory/name/searchTerm/D/codeSystem/LOINC/codeSystemVersion/2014/valueSetName/Alcohol-Ethanol-Toxicology-LOINC")) .andExpect(status().isOk()) .andExpect(content().contentType("application/json;charset=UTF-8")); } @Test public void testAjaxSearchConceptCode_By_Code() throws Exception{ ConceptCodeDto ccdto=new ConceptCodeDto(); ccdto.setCode("disorder"); when(conceptCodeService.findAllByName(anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(mock(Map.class)); mockMvc.perform(get("/sysadmin/conceptCode/ajaxSearchConceptCode/pageNumber/0/searchCategory/code/searchTerm/3/codeSystem/LOINC/codeSystemVersion/2014/valueSetName/Alcohol-Ethanol-Toxicology-LOINC")) .andExpect(status().isOk()) .andExpect(content().contentType("application/json;charset=UTF-8")); } @Test public void testGetConceptCodeAdd() throws Exception{ ConceptCodeVSCSDto conceptCodeVSCDto = mock(ConceptCodeVSCSDto.class); when(conceptCodeService.create()).thenReturn(conceptCodeVSCDto); ConceptCodeDto conceptCodeDto = new ConceptCodeDto(); conceptCodeDto.setCode("code"); conceptCodeDto.setName("name"); mockMvc.perform(get("/sysadmin/conceptCodeAdd.html") .sessionAttr("conceptCodeDto", conceptCodeDto)) .andExpect(status().isOk()) .andExpect(view().name("views/sysadmin/conceptCodeAdd")); } @Test public void testGetConceptCodeAdd_throwValueSetNotFoundException() throws Exception{ when(conceptCodeService.create()).thenThrow(new ValueSetNotFoundException()); ConceptCodeDto conceptCodeDto = new ConceptCodeDto(); conceptCodeDto.setCode("code"); conceptCodeDto.setName("name"); mockMvc.perform(get("/sysadmin/conceptCodeAdd.html") .sessionAttr("conceptCodeDto", conceptCodeDto)) .andExpect(status().isOk()) .andExpect(view().name("views/sysadmin/conceptCodeList")); } @Test public void testGetConceptCodeAdd_throwCodeSystemNotFoundException() throws Exception{ when(conceptCodeService.create()).thenThrow(new CodeSystemNotFoundException()); ConceptCodeDto conceptCodeDto = new ConceptCodeDto(); conceptCodeDto.setCode("code"); conceptCodeDto.setName("name"); mockMvc.perform(get("/sysadmin/conceptCodeAdd.html") .sessionAttr("conceptCodeDto", conceptCodeDto)) .andExpect(status().isOk()) .andExpect(view().name("views/sysadmin/conceptCodeList")); } @Test public void testGetConceptCodeAdd_throwException() throws Exception{ when(conceptCodeService.create()).thenThrow(new CodeSystemVersionNotFoundException()); ConceptCodeDto conceptCodeDto = new ConceptCodeDto(); conceptCodeDto.setCode("code"); conceptCodeDto.setName("name"); mockMvc.perform(get("/sysadmin/conceptCodeAdd.html") .sessionAttr("conceptCodeDto", conceptCodeDto)) .andExpect(status().isOk()) .andExpect(view().name("views/sysadmin/conceptCodeList")); } @Test public void testCreatedConceptCodeForm() throws Exception{ ConceptCodeDto conceptCodeDto=new ConceptCodeDto(); AuthenticatedUser currentUser=mock(AuthenticatedUser.class); when(userContext.getCurrentUser()).thenReturn(currentUser); final String username="username"; when(currentUser.getUsername()).thenReturn(username); when(conceptCodeService.create(any(ConceptCodeDto.class))).thenReturn(conceptCodeDto); mockMvc.perform(post("/sysadmin/conceptCode/create") .contentType(MediaType.APPLICATION_FORM_URLENCODED) .param("name","name") .param("code","code")) .andExpect(status().isFound()) .andExpect(view().name("redirect:../conceptCodeList?panelState=addnew")); } @Test public void testCreatedConceptCodeForm_ThrowCodeSystemNotFoundException() throws Exception{ AuthenticatedUser currentUser=mock(AuthenticatedUser.class); when(userContext.getCurrentUser()).thenReturn(currentUser); final String username="username"; when(currentUser.getUsername()).thenReturn(username); when(conceptCodeService.create(any(ConceptCodeDto.class))).thenThrow(new CodeSystemNotFoundException()); mockMvc.perform(post("/sysadmin/conceptCode/create") .contentType(MediaType.APPLICATION_FORM_URLENCODED) .param("name","ConceptCodeCatName") .param("code","ConceptCodeCatCode")) .andExpect(status().isFound()) .andExpect(view().name("redirect:../conceptCodeAdd.html?panelState=addnew")); } @Test public void testCreatedConceptCodeForm_ThrowValueSetNotFoundException() throws Exception{ AuthenticatedUser currentUser=mock(AuthenticatedUser.class); when(userContext.getCurrentUser()).thenReturn(currentUser); final String username="username"; when(currentUser.getUsername()).thenReturn(username); when(conceptCodeService.create(any(ConceptCodeDto.class))).thenThrow(new ValueSetNotFoundException()); mockMvc.perform(post("/sysadmin/conceptCode/create") .contentType(MediaType.APPLICATION_FORM_URLENCODED) .param("name","ConceptCodeCatName") .param("code","ConceptCodeCatCode")) .andExpect(status().isFound()) .andExpect(view().name("redirect:../conceptCodeAdd.html?panelState=addnew")); } @Test public void testCreatedConceptCodeForm_DataIntegrityViolationException() throws Exception{ AuthenticatedUser currentUser=mock(AuthenticatedUser.class); when(userContext.getCurrentUser()).thenReturn(currentUser); final String username="username"; when(currentUser.getUsername()).thenReturn(username); when(conceptCodeService.create(any(ConceptCodeDto.class))).thenThrow(new DataIntegrityViolationException("DataIntegrityViolationException")); mockMvc.perform(post("/sysadmin/conceptCode/create") .contentType(MediaType.APPLICATION_FORM_URLENCODED) .param("name","ConceptCodeCatName") .param("code","ConceptCodeCatCode")) .andExpect(status().isFound()) .andExpect(view().name("redirect:../conceptCodeAdd.html?panelState=addnew")); } @Test public void testDeleteConceptCode() throws Exception{ ConceptCodeDto deleted=new ConceptCodeDto(); deleted.setCode("TESTCODE"); deleted.setName("Test Name"); when(conceptCodeService.delete(anyLong())).thenReturn(deleted); mockMvc.perform(delete("/sysadmin/conceptCode/delete/1")) .andExpect(content().string("ConceptCode with Code: TESTCODE and Name: Test Name is deleted Successfully.")); } @Test public void testDeleteConceptCode_throwException() throws Exception{ when(conceptCodeService.delete(anyLong())).thenThrow(new ConceptCodeNotFoundException()); mockMvc.perform(delete("/sysadmin/conceptCode/delete/1")) .andExpect(status().isInternalServerError()) .andExpect(content().string("Deleted conceptCode was not found.")); } @Test public void testDeleteConceptCode_withPost() throws Exception{ ConceptCodeDto deleted=new ConceptCodeDto(); when(conceptCodeService.delete(anyLong())).thenReturn(deleted); mockMvc.perform(post("/sysadmin/conceptCode/delete/1")) .andExpect(status().isMethodNotAllowed()); } @Test public void testEditConceptCode() throws Exception{ ConceptCodeDto editConceptCodeDto=new ConceptCodeDto(); when(conceptCodeService.findById(anyLong())).thenReturn(editConceptCodeDto); mockMvc.perform(get("/sysadmin/conceptCode/edit/1")) .andExpect(status().isOk()) .andExpect(model().attribute("conceptCodeDto", editConceptCodeDto)) .andExpect(view().name("views/sysadmin/conceptCodeEdit")); } @Test public void testEditConceptCode2() throws Exception{ ConceptCodeDto editConceptCodeDto=null; when(conceptCodeService.findById(anyLong())).thenReturn(editConceptCodeDto); mockMvc.perform(get("/sysadmin/conceptCode/edit/1")) .andExpect(model().attribute("conceptCodeDto", editConceptCodeDto)) .andExpect(view().name("redirect:../../conceptCodeList")); } @Test public void testEditConceptCodeForm_Post() throws Exception{ ConceptCodeDto editConceptCodeDto=new ConceptCodeDto(); editConceptCodeDto.setId((long) 1); editConceptCodeDto.setCode("code"); editConceptCodeDto.setName("name"); AuthenticatedUser currentUser=mock(AuthenticatedUser.class); when(userContext.getCurrentUser()).thenReturn(currentUser); when(conceptCodeService.update(any(ConceptCodeDto.class))).thenReturn(editConceptCodeDto); mockMvc.perform(post("/sysadmin/conceptCode/edit/1") .param("code", "code") .param("name", "name")) .andExpect(view().name("redirect:../../conceptCodeList")); } @Test public void testEditConceptCodeForm_Post_throwException() throws Exception{ ConceptCodeDto editConceptCodeDto=new ConceptCodeDto(); editConceptCodeDto.setId((long) 1); editConceptCodeDto.setCode("code"); editConceptCodeDto.setName("name"); AuthenticatedUser currentUser=mock(AuthenticatedUser.class); when(userContext.getCurrentUser()).thenReturn(currentUser); when(conceptCodeService.update(any(ConceptCodeDto.class))).thenThrow(new ConceptCodeNotFoundException()); mockMvc.perform(post("/sysadmin/conceptCode/edit/1") .param("code", "code") .param("name", "name")) .andExpect(view().name("redirect:../../conceptCodeList")); } @Test public void testValueSetBatchUpload() throws Exception{ // List<ConceptCodeDto> conceptCodeDtos=(List<ConceptCodeDto>) mock(List.class); // List<CodeSystemDto> codeSystems = (List<CodeSystemDto>) mock(List.class); // List<ValueSetDto> valueSets = (List<ValueSetDto>) mock(List.class); // // when(conceptCodeService.findAll()).thenReturn(conceptCodeDtos); // when(codeSystemService.findAll()).thenReturn(codeSystems); // when(valueSetService.findAll()).thenReturn(valueSets); // // mockMvc.perform(post("/sysadmin/conceptCode/batchUpload")) // .andExpect(status().isOk()) // .andExpect(model().attribute("conceptCodeDtos",conceptCodeDtos)) // .andExpect(view().name("views/sysadmin/conceptCodeList")); // // // MockMultipartFile file = new MockMultipartFile("file", "orig", null, "bar".getBytes()); // mockMvc.perform(fileUpload("/sysadmin/conceptCode/batchUpload").file(file) // .param("name", "mocked_name") // .param("description", "mocked_description") // .param("documentType", "mocked_type")) // .andExpect(view().name("redirect:../conceptCodeList")); // mockMvc.perform(post("/form")) // .andExpect(status.isOk()) // .andExpect(redirectedUrl("/person/1")) // .andExpect(model().size(1)) // .andExpect(model().attributeExists("person")) // .andExpect(flash().attributeCount(1)) // .andExpect(flash().attribute("message", "success!")); } }