/** * This Source Code Form is subject to the terms of the Mozilla Public License, * v. 2.0. If a copy of the MPL was not distributed with this file, You can * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. * * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS * graphic logo is a trademark of OpenMRS Inc. */ package org.openmrs.module.radiology.report.web; import static org.hamcrest.collection.IsMapContaining.hasKey; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import javax.servlet.http.HttpServletRequest; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.openmrs.api.APIException; import org.openmrs.module.radiology.order.RadiologyOrder; import org.openmrs.module.radiology.report.RadiologyReport; import org.openmrs.module.radiology.report.RadiologyReportService; import org.openmrs.module.radiology.report.RadiologyReportStatus; import org.openmrs.module.radiology.report.RadiologyReportValidator; import org.openmrs.module.radiology.test.RadiologyTestData; import org.openmrs.test.BaseContextMockTest; import org.openmrs.web.WebConstants; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpSession; import org.springframework.validation.BindingResult; import org.springframework.web.servlet.ModelAndView; /** * Tests {@link RadiologyReportFormController}. */ public class RadiologyReportFormControllerTest extends BaseContextMockTest { @Mock private RadiologyReportService radiologyReportService; @Mock private RadiologyReportValidator radiologyReportValidator; @InjectMocks private RadiologyReportFormController radiologyReportFormController = new RadiologyReportFormController(); @Test public void shouldCreateANewRadiologyReportForGivenRadiologyOrderAndRedirectToItsRadiologyReportForm() { // given RadiologyReport mockRadiologyReport = RadiologyTestData.getMockRadiologyReport1(); RadiologyOrder mockRadiologyOrder = mockRadiologyReport.getRadiologyOrder(); when(radiologyReportService.createRadiologyReport(mockRadiologyOrder)).thenReturn(mockRadiologyReport); ModelAndView modelAndView = radiologyReportFormController.createRadiologyReport(mockRadiologyOrder); verify(radiologyReportService, times(1)).createRadiologyReport(mockRadiologyOrder); verifyNoMoreInteractions(radiologyReportService); assertNotNull(modelAndView); assertThat(modelAndView.getViewName(), is("redirect:/module/radiology/radiologyReport.form?reportId=" + mockRadiologyReport.getId())); } @Test public void shouldPopulateModelAndViewWithGivenRadiologyReport() { // given RadiologyReport mockRadiologyReport = RadiologyTestData.getMockRadiologyReport1(); ModelAndView modelAndView = radiologyReportFormController.getRadiologyReportFormWithExistingRadiologyReport(mockRadiologyReport); assertNotNull(modelAndView); assertThat(modelAndView.getViewName(), is(RadiologyReportFormController.RADIOLOGY_REPORT_FORM_VIEW)); assertThat(modelAndView.getModelMap(), hasKey("radiologyOrder")); RadiologyOrder radiologyOrder = (RadiologyOrder) modelAndView.getModelMap() .get("radiologyOrder"); assertThat(radiologyOrder, is(mockRadiologyReport.getRadiologyOrder())); RadiologyReport radiologyReport = (RadiologyReport) modelAndView.getModelMap() .get("radiologyReport"); assertNotNull(radiologyReport); assertThat(radiologyReport, is(mockRadiologyReport)); VoidRadiologyReportRequest voidRadiologyReportRequest = (VoidRadiologyReportRequest) modelAndView.getModelMap() .get("voidRadiologyReportRequest"); assertNotNull(voidRadiologyReportRequest); } @Test public void shouldSaveGivenRadiologyReportAndSetHttpSessionAttributeOpenmrsMessageToReportDraftSavedAndRedirectToItsReportForm() { // given RadiologyReport mockRadiologyReport = RadiologyTestData.getMockRadiologyReport1(); MockHttpServletRequest mockRequest = new MockHttpServletRequest(); mockRequest.addParameter("saveRadiologyReportDraft", "saveRadiologyReportDraft"); MockHttpSession mockSession = new MockHttpSession(); mockRequest.setSession(mockSession); ModelAndView modelAndView = radiologyReportFormController.saveRadiologyReportDraft(mockRequest, mockRadiologyReport); verify(radiologyReportService, times(1)).saveRadiologyReportDraft(mockRadiologyReport); verifyNoMoreInteractions(radiologyReportService); assertNotNull(modelAndView); assertThat(modelAndView.getViewName(), is("redirect:/module/radiology/radiologyReport.form?reportId=" + mockRadiologyReport.getReportId())); assertThat((String) mockSession.getAttribute(WebConstants.OPENMRS_MSG_ATTR), is("radiology.RadiologyReport.savedDraft")); } @Test public void shouldNotRedirectAndSetSessionAttributeWithOpenmrsErrorIfApiExceptionIsThrownBySaveRadiologyReportDraft() throws Exception { // given RadiologyReport mockRadiologyReport = RadiologyTestData.getMockRadiologyReport1(); MockHttpServletRequest mockRequest = new MockHttpServletRequest(); mockRequest.addParameter("saveRadiologyReportDraft", "saveRadiologyReportDraft"); MockHttpSession mockSession = new MockHttpSession(); mockRequest.setSession(mockSession); when(radiologyReportService.saveRadiologyReportDraft(mockRadiologyReport)) .thenThrow(new APIException("RadiologyReport.cannot.saveDraft.already.reported")); ModelAndView modelAndView = radiologyReportFormController.saveRadiologyReportDraft(mockRequest, mockRadiologyReport); verify(radiologyReportService, times(1)).saveRadiologyReportDraft(mockRadiologyReport); verifyNoMoreInteractions(radiologyReportService); assertNotNull(modelAndView); assertThat(modelAndView.getViewName(), is(RadiologyReportFormController.RADIOLOGY_REPORT_FORM_VIEW)); assertThat(modelAndView.getModelMap(), hasKey("radiologyOrder")); RadiologyOrder radiologyOrder = (RadiologyOrder) modelAndView.getModelMap() .get("radiologyOrder"); assertThat(radiologyOrder, is(mockRadiologyReport.getRadiologyOrder())); RadiologyReport radiologyReport = (RadiologyReport) modelAndView.getModelMap() .get("radiologyReport"); assertNotNull(radiologyReport); assertThat(radiologyReport, is(mockRadiologyReport)); VoidRadiologyReportRequest voidRadiologyReportRequest = (VoidRadiologyReportRequest) modelAndView.getModelMap() .get("voidRadiologyReportRequest"); assertNotNull(voidRadiologyReportRequest); assertThat((String) mockSession.getAttribute(WebConstants.OPENMRS_ERROR_ATTR), is("RadiologyReport.cannot.saveDraft.already.reported")); } /** * @see RadiologyReportFormController#voidRadiologyReport(HttpServletRequest, RadiologyReport, VoidRadiologyReportRequest, BindingResult) * to its report form */ @Test public void voidRadiologyReport_shouldVoidGivenRadiologyReportAndSetHttpSessionAttributeOpenmrsMessageToReportVoidedAndRedirectToItsReportForm() { // given RadiologyReport mockRadiologyReport = RadiologyTestData.getMockRadiologyReport1(); VoidRadiologyReportRequest voidRadiologyReportRequest = new VoidRadiologyReportRequest(); voidRadiologyReportRequest.setVoidReason("selected wrong order"); BindingResult bindingResult = mock(BindingResult.class); MockHttpServletRequest mockRequest = new MockHttpServletRequest(); mockRequest.addParameter("voidRadiologyReport", "voidRadiologyReport"); MockHttpSession mockSession = new MockHttpSession(); mockRequest.setSession(mockSession); ModelAndView modelAndView = radiologyReportFormController.voidRadiologyReport(mockRequest, mockRadiologyReport, voidRadiologyReportRequest, bindingResult); verify(radiologyReportService, times(1)).voidRadiologyReport(mockRadiologyReport, voidRadiologyReportRequest.getVoidReason()); verifyNoMoreInteractions(radiologyReportService); assertNotNull(modelAndView); assertThat(modelAndView.getViewName(), is("redirect:/module/radiology/radiologyReport.form?reportId=" + mockRadiologyReport.getReportId())); assertThat((String) mockSession.getAttribute(WebConstants.OPENMRS_MSG_ATTR), is("radiology.RadiologyReport.voided")); } @Test public void shouldNotVoidAndNotRedirectGivenInvalidRadiologyReportRequest() { // given RadiologyReport mockRadiologyReport = RadiologyTestData.getMockRadiologyReport1(); VoidRadiologyReportRequest voidRadiologyReportRequest = new VoidRadiologyReportRequest(); voidRadiologyReportRequest.setVoidReason("selected wrong order"); BindingResult bindingResult = mock(BindingResult.class); MockHttpServletRequest mockRequest = new MockHttpServletRequest(); mockRequest.addParameter("voidRadiologyReport", "voidRadiologyReport"); MockHttpSession mockSession = new MockHttpSession(); mockRequest.setSession(mockSession); when(bindingResult.hasErrors()).thenReturn(true); ModelAndView modelAndView = radiologyReportFormController.voidRadiologyReport(mockRequest, mockRadiologyReport, voidRadiologyReportRequest, bindingResult); verifyZeroInteractions(radiologyReportService); assertNotNull(modelAndView); assertThat(modelAndView.getViewName(), is(RadiologyReportFormController.RADIOLOGY_REPORT_FORM_VIEW)); assertThat(modelAndView.getModelMap(), hasKey("radiologyOrder")); RadiologyOrder radiologyOrder = (RadiologyOrder) modelAndView.getModelMap() .get("radiologyOrder"); assertThat(radiologyOrder, is(mockRadiologyReport.getRadiologyOrder())); RadiologyReport radiologyReport = (RadiologyReport) modelAndView.getModelMap() .get("radiologyReport"); assertNotNull(radiologyReport); assertThat(radiologyReport, is(mockRadiologyReport)); } @Test public void shouldNotRedirectAndSetHttpSessionAttributeWithOpenmrsErrorIfApiExceptionIsThrownByVoidRadiologyReport() { // given RadiologyReport mockRadiologyReport = RadiologyTestData.getMockRadiologyReport1(); VoidRadiologyReportRequest voidRadiologyReportRequest = new VoidRadiologyReportRequest(); voidRadiologyReportRequest.setVoidReason("selected wrong order"); BindingResult bindingResult = mock(BindingResult.class); MockHttpServletRequest mockRequest = new MockHttpServletRequest(); mockRequest.addParameter("voidRadiologyReport", "voidRadiologyReport"); MockHttpSession mockSession = new MockHttpSession(); mockRequest.setSession(mockSession); when(radiologyReportService.voidRadiologyReport(mockRadiologyReport, voidRadiologyReportRequest.getVoidReason())) .thenThrow(new APIException("RadiologyReport.cannot.void.completed")); ModelAndView modelAndView = radiologyReportFormController.voidRadiologyReport(mockRequest, mockRadiologyReport, voidRadiologyReportRequest, bindingResult); verify(radiologyReportService, times(1)).voidRadiologyReport(mockRadiologyReport, voidRadiologyReportRequest.getVoidReason()); verifyNoMoreInteractions(radiologyReportService); assertNotNull(modelAndView); assertThat(modelAndView.getViewName(), is(RadiologyReportFormController.RADIOLOGY_REPORT_FORM_VIEW)); assertThat(modelAndView.getModelMap(), hasKey("radiologyOrder")); RadiologyOrder radiologyOrder = (RadiologyOrder) modelAndView.getModelMap() .get("radiologyOrder"); assertThat(radiologyOrder, is(mockRadiologyReport.getRadiologyOrder())); RadiologyReport radiologyReport = (RadiologyReport) modelAndView.getModelMap() .get("radiologyReport"); assertNotNull(radiologyReport); assertThat(radiologyReport, is(mockRadiologyReport)); assertThat((String) mockSession.getAttribute(WebConstants.OPENMRS_ERROR_ATTR), is("RadiologyReport.cannot.void.completed")); } @Test public void shouldCompleteGivenRadiologyReportIfValidAndSetHttpSessionAttributeOpenmrsMessageToReportCompletedAndRedirectToItsReportForm() { // given RadiologyReport mockRadiologyReport = RadiologyTestData.getMockRadiologyReport1(); mockRadiologyReport.setPrincipalResultsInterpreter(RadiologyTestData.getMockProvider1()); RadiologyReport mockCompletedRadiologyReport = mockRadiologyReport; mockCompletedRadiologyReport.setStatus(RadiologyReportStatus.COMPLETED); BindingResult reportErrors = mock(BindingResult.class); when(radiologyReportService.saveRadiologyReport(mockRadiologyReport)).thenReturn(mockCompletedRadiologyReport); MockHttpServletRequest mockRequest = new MockHttpServletRequest(); mockRequest.addParameter("completeRadiologyReport", "completeRadiologyReport"); MockHttpSession mockSession = new MockHttpSession(); mockRequest.setSession(mockSession); ModelAndView modelAndView = radiologyReportFormController.completeRadiologyReport(mockRequest, mockRadiologyReport, reportErrors); verify(radiologyReportService, times(1)).saveRadiologyReport(mockRadiologyReport); verifyNoMoreInteractions(radiologyReportService); assertNotNull(modelAndView); assertThat(modelAndView.getViewName(), is("redirect:/module/radiology/radiologyReport.form?reportId=" + mockCompletedRadiologyReport.getReportId())); assertThat((String) mockSession.getAttribute(WebConstants.OPENMRS_MSG_ATTR), is("radiology.RadiologyReport.completed")); } @Test public void shouldNotCompleteGivenRadiologyReportIfItIsNotValid() { // given RadiologyReport mockRadiologyReport = RadiologyTestData.getMockRadiologyReport1(); mockRadiologyReport.setPrincipalResultsInterpreter(null); BindingResult reportErrors = mock(BindingResult.class); when(reportErrors.hasErrors()).thenReturn(true); MockHttpServletRequest mockRequest = new MockHttpServletRequest(); mockRequest.addParameter("completeRadiologyReport", "completeRadiologyReport"); MockHttpSession mockSession = new MockHttpSession(); mockRequest.setSession(mockSession); ModelAndView modelAndView = radiologyReportFormController.completeRadiologyReport(mockRequest, mockRadiologyReport, reportErrors); verifyZeroInteractions(radiologyReportService); assertNotNull(modelAndView); assertThat(modelAndView.getViewName(), is(RadiologyReportFormController.RADIOLOGY_REPORT_FORM_VIEW)); assertThat(modelAndView.getModelMap(), hasKey("radiologyOrder")); RadiologyOrder radiologyOrder = (RadiologyOrder) modelAndView.getModelMap() .get("radiologyOrder"); assertNotNull(radiologyOrder); assertThat(mockRadiologyReport.getRadiologyOrder(), is(radiologyOrder)); assertThat(modelAndView.getModelMap(), hasKey("radiologyReport")); RadiologyReport radiologyReport = (RadiologyReport) modelAndView.getModelMap() .get("radiologyReport"); assertNotNull(radiologyReport); assertThat(radiologyReport.getStatus(), is(RadiologyReportStatus.DRAFT)); VoidRadiologyReportRequest voidRadiologyReportRequest = (VoidRadiologyReportRequest) modelAndView.getModelMap() .get("voidRadiologyReportRequest"); assertNotNull(voidRadiologyReportRequest); } @Test public void shouldNotRedirectAndSetSessionAttributeWithOpenmrsErrorIfApiExceptionIsThrownByCompleteRadiologyReport() throws Exception { // given RadiologyReport mockRadiologyReport = RadiologyTestData.getMockRadiologyReport1(); MockHttpServletRequest mockRequest = new MockHttpServletRequest(); mockRequest.addParameter("completeRadiologyReport", "completeRadiologyReport"); MockHttpSession mockSession = new MockHttpSession(); mockRequest.setSession(mockSession); BindingResult reportErrors = mock(BindingResult.class); when(radiologyReportService.saveRadiologyReport(mockRadiologyReport)) .thenThrow(new APIException("RadiologyReport.cannot.complete.reported")); ModelAndView modelAndView = radiologyReportFormController.completeRadiologyReport(mockRequest, mockRadiologyReport, reportErrors); verify(radiologyReportService, times(1)).saveRadiologyReport(mockRadiologyReport); verifyNoMoreInteractions(radiologyReportService); assertNotNull(modelAndView); assertThat(modelAndView.getViewName(), is(RadiologyReportFormController.RADIOLOGY_REPORT_FORM_VIEW)); assertThat(modelAndView.getModelMap(), hasKey("radiologyOrder")); RadiologyOrder radiologyOrder = (RadiologyOrder) modelAndView.getModelMap() .get("radiologyOrder"); assertThat(radiologyOrder, is(mockRadiologyReport.getRadiologyOrder())); RadiologyReport radiologyReport = (RadiologyReport) modelAndView.getModelMap() .get("radiologyReport"); assertNotNull(radiologyReport); assertThat(radiologyReport, is(mockRadiologyReport)); VoidRadiologyReportRequest voidRadiologyReportRequest = (VoidRadiologyReportRequest) modelAndView.getModelMap() .get("voidRadiologyReportRequest"); assertNotNull(voidRadiologyReportRequest); assertThat((String) mockSession.getAttribute(WebConstants.OPENMRS_ERROR_ATTR), is("RadiologyReport.cannot.complete.reported")); } }