/** * 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.order.web.search; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.List; import org.apache.commons.beanutils.PropertyUtils; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.openmrs.Order.Urgency; import org.openmrs.api.PatientService; import org.openmrs.module.radiology.order.RadiologyOrder; import org.openmrs.module.radiology.order.RadiologyOrderSearchCriteria; import org.openmrs.module.radiology.order.RadiologyOrderService; import org.openmrs.module.webservices.rest.SimpleObject; import org.openmrs.module.webservices.rest.test.Util; import org.openmrs.module.webservices.rest.web.RequestContext; import org.openmrs.module.webservices.rest.web.representation.Representation; import org.openmrs.module.webservices.rest.web.response.ResourceDoesNotSupportOperationException; import org.openmrs.module.webservices.rest.web.v1_0.controller.MainResourceControllerTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.web.bind.annotation.RequestMethod; /** * Tests {@link RadiologyOrderSearchHandler}. */ public class RadiologyOrderSearchHandlerComponentTest extends MainResourceControllerTest { protected static final String TEST_DATASET = "RadiologyOrderSearchHandlerComponentTestDataset.xml"; private static final String ACCESSION_NUMBER_WITH_ORDER = "4"; private static final String ACCESSION_NUMBER_WITH_NO_ORDER = "6"; private static final String UNKNOWN_PATIENT = "99999999-9999-9999-9999-9999999999999"; private static final String PATIENT_WITH_NO_ORDER = "0f1f7d08-076b-4fc6-acac-4bb91515141e7"; private static final String PATIENT_WITH_ONE_ORDER = "72ff0770-fc9e-11e5-9e59-08002719a237"; private static final String PATIENT_WITH_TWO_ORDERS = "5631b434-78aa-102b-91a0-001e378eb67e"; private static final String DATE_AFTER_ORDER_EFFECTIVE_START_DATES = "2015-02-04 13:00:00"; private static final String DATE_BEFORE_ORDER_EFFECTIVE_START_DATES = "2015-02-01 00:00:00"; private static final String DATE_BETWEEN_ORDER_EFFECTIVE_START_DATES = "2015-02-03 12:00:00"; private static final String RADIOLOGY_ORDER_UUID = "1bae735a-fca0-11e5-9e59-08002719a237"; @Autowired PatientService patientService; @Autowired RadiologyOrderService radiologyOrderService; DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); DateFormat resultFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); @Rule public ExpectedException expectedException = ExpectedException.none(); @Before public void setUp() throws Exception { executeDataSet(TEST_DATASET); } /** * @see MainResourceControllerTest#getURI() */ @Override public String getURI() { return "radiologyorder"; } /** * @see MainResourceControllerTest#getAllCount() */ @Override public long getAllCount() { return 0; } /** * @see MainResourceControllerTest#getUuid() */ @Override public String getUuid() { return RADIOLOGY_ORDER_UUID; } /** * @see MainResourceControllerTest#shouldGetAll() */ @Override @Test(expected = ResourceDoesNotSupportOperationException.class) public void shouldGetAll() throws Exception { deserialize(handle(request(RequestMethod.GET, getURI()))); } /** * @see RadiologyOrderSearchHandler#search(RequestContext) */ @Test public void shouldReturnAllRadiologyOrdersForGivenAccessionNumber() throws Exception { MockHttpServletRequest requestAccessionNumberWithOrder = request(RequestMethod.GET, getURI()); requestAccessionNumberWithOrder.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_ACCESSION_NUMBER, ACCESSION_NUMBER_WITH_ORDER); requestAccessionNumberWithOrder.setParameter("v", Representation.FULL.getRepresentation()); SimpleObject resultAccessionNumberWithOrder = deserialize(handle(requestAccessionNumberWithOrder)); assertNotNull(resultAccessionNumberWithOrder); List<Object> hits = (List<Object>) resultAccessionNumberWithOrder.get("results"); assertThat(hits.size(), is(1)); assertThat(PropertyUtils.getProperty(hits.get(0), "accessionNumber"), is(ACCESSION_NUMBER_WITH_ORDER)); assertNull(PropertyUtils.getProperty(resultAccessionNumberWithOrder, "totalCount")); } /** * @see RadiologyOrderSearchHandler#search(RequestContext) */ @Test public void shouldReturnEmptySearchResultIfNoRadiologyOrderExistsForGivenAccessionNumber() throws Exception { MockHttpServletRequest requestAccessionNumberWithNoOrders = request(RequestMethod.GET, getURI()); requestAccessionNumberWithNoOrders.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_ACCESSION_NUMBER, ACCESSION_NUMBER_WITH_NO_ORDER); SimpleObject resultAccessionNumberWithNoOrders = deserialize(handle(requestAccessionNumberWithNoOrders)); assertNotNull(resultAccessionNumberWithNoOrders); List<Object> hits = (List<Object>) resultAccessionNumberWithNoOrders.get("results"); assertThat(hits.size(), is(0)); } /** * @see RadiologyOrderSearchHandler#search(RequestContext) */ @Test public void shouldReturnAllRadiologyOrdersForGivenPatient() throws Exception { MockHttpServletRequest requestPatientWithOneOrder = request(RequestMethod.GET, getURI()); requestPatientWithOneOrder.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_PATIENT, PATIENT_WITH_ONE_ORDER); requestPatientWithOneOrder.setParameter("v", Representation.FULL.getRepresentation()); SimpleObject resultPatientWithOneOrder = deserialize(handle(requestPatientWithOneOrder)); assertNotNull(resultPatientWithOneOrder); List<Object> hits = (List<Object>) resultPatientWithOneOrder.get("results"); assertThat(hits.size(), is(1)); final RadiologyOrderSearchCriteria radiologyOrderSearchCriteria = new RadiologyOrderSearchCriteria.Builder() .withPatient(patientService.getPatientByUuid(PATIENT_WITH_ONE_ORDER)) .build(); assertThat(PropertyUtils.getProperty(hits.get(0), "uuid"), is(radiologyOrderService.getRadiologyOrders(radiologyOrderSearchCriteria) .get(0) .getUuid())); assertNull(PropertyUtils.getProperty(resultPatientWithOneOrder, "totalCount")); MockHttpServletRequest requestPatientWithTwoOrders = request(RequestMethod.GET, getURI()); requestPatientWithTwoOrders.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_PATIENT, PATIENT_WITH_TWO_ORDERS); requestPatientWithTwoOrders.setParameter("v", Representation.FULL.getRepresentation()); SimpleObject resultPatientWithTwoOrders = deserialize(handle(requestPatientWithTwoOrders)); assertNotNull(resultPatientWithTwoOrders); assertThat(Util.getResultsSize(resultPatientWithTwoOrders), is(2)); hits = (List<Object>) resultPatientWithTwoOrders.get("results"); assertThat(hits.size(), is(2)); assertNull(PropertyUtils.getProperty(resultPatientWithTwoOrders, "totalCount")); } /** * @see RadiologyOrderSearchHandler#search(RequestContext) */ @Test public void shouldReturnEmptySearchResultIfPatientCannotBeFound() throws Exception { MockHttpServletRequest requestUnknownPatient = request(RequestMethod.GET, getURI()); requestUnknownPatient.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_PATIENT, UNKNOWN_PATIENT); SimpleObject resultUnknownPatient = deserialize(handle(requestUnknownPatient)); assertNotNull(resultUnknownPatient); List<Object> hits = (List<Object>) resultUnknownPatient.get("results"); assertThat(hits.size(), is(0)); } /** * @see RadiologyOrderSearchHandler#search(RequestContext) */ @Test public void shouldReturnEmptySearchResultIfPatientHasNoRadiologyOrders() throws Exception { MockHttpServletRequest requestPatientWithNoOrder = request(RequestMethod.GET, getURI()); requestPatientWithNoOrder.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_PATIENT, PATIENT_WITH_NO_ORDER); SimpleObject resultPatientWithNoOrder = deserialize(handle(requestPatientWithNoOrder)); assertNotNull(resultPatientWithNoOrder); List<Object> hits = (List<Object>) resultPatientWithNoOrder.get("results"); assertThat(hits.size(), is(0)); } /** * @see RadiologyOrderSearchHandler#search(RequestContext) * specified */ @Test public void search_shouldReturnAllRadiologyOrdersWithEffectiveOrderStartDateAfterOrEqualToFromDateIfOnlyFromDateIsSpecified() throws Exception { MockHttpServletRequest request = request(RequestMethod.GET, getURI()); request.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_EFFECTIVE_START_DATE_FROM, DATE_BETWEEN_ORDER_EFFECTIVE_START_DATES); request.setParameter("v", Representation.FULL.getRepresentation()); SimpleObject result = deserialize(handle(request)); assertNotNull(result); List<Object> hits = (List<Object>) result.get("results"); assertThat(hits.size(), is(2)); assertNull(PropertyUtils.getProperty(result, "totalCount")); RadiologyOrderSearchCriteria radiologyOrderSearchCriteria = new RadiologyOrderSearchCriteria.Builder() .fromEffectiveStartDate(format.parse(DATE_BETWEEN_ORDER_EFFECTIVE_START_DATES)) .build(); List<RadiologyOrder> radiologyOrders = radiologyOrderService.getRadiologyOrders(radiologyOrderSearchCriteria); for (int i = 0; i < hits.size(); i++) { if (PropertyUtils.getProperty(hits.get(i), "urgency") .equals("ON_SCHEDULED_DATE")) { assertThat(PropertyUtils.getProperty(hits.get(i), "scheduledDate"), is(resultFormat.format(radiologyOrders.get(i) .getScheduledDate()))); } else { assertThat(PropertyUtils.getProperty(hits.get(i), "dateActivated"), is(resultFormat.format(radiologyOrders.get(i) .getDateActivated()))); } } } /** * @see RadiologyOrderSearchHandler#search(RequestContext) * specified */ @Test public void search_shouldReturnAllRadiologyOrdersWithEffectiveOrderStartDateBeforeOrEqualToToDateIfOnlyToDateIsSpecified() throws Exception { MockHttpServletRequest request = request(RequestMethod.GET, getURI()); request.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_EFFECTIVE_START_DATE_TO, DATE_BETWEEN_ORDER_EFFECTIVE_START_DATES); request.setParameter("v", Representation.FULL.getRepresentation()); SimpleObject result = deserialize(handle(request)); assertNotNull(result); List<Object> hits = (List<Object>) result.get("results"); assertThat(hits.size(), is(2)); assertNull(PropertyUtils.getProperty(result, "totalCount")); RadiologyOrderSearchCriteria radiologyOrderSearchCriteria = new RadiologyOrderSearchCriteria.Builder() .toEffectiveStartDate(format.parse(DATE_BETWEEN_ORDER_EFFECTIVE_START_DATES)) .build(); List<RadiologyOrder> radiologyOrders = radiologyOrderService.getRadiologyOrders(radiologyOrderSearchCriteria); for (int i = 0; i < hits.size(); i++) { if (PropertyUtils.getProperty(hits.get(i), "urgency") .equals("ON_SCHEDULED_DATE")) { assertThat(PropertyUtils.getProperty(hits.get(i), "scheduledDate"), is(resultFormat.format(radiologyOrders.get(i) .getScheduledDate()))); } else { assertThat(PropertyUtils.getProperty(hits.get(i), "dateActivated"), is(resultFormat.format(radiologyOrders.get(i) .getDateActivated()))); } } } /** * @see RadiologyOrderSearchHandler#search(RequestContext) * specified */ @Test public void search_shouldReturnAllRadiologyOrdersWithEffectiveOrderStartDateInGivenDateRangeIfToDateAndFromDateAreSpecified() throws Exception { MockHttpServletRequest request = request(RequestMethod.GET, getURI()); request.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_EFFECTIVE_START_DATE_FROM, DATE_BEFORE_ORDER_EFFECTIVE_START_DATES); request.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_EFFECTIVE_START_DATE_TO, DATE_AFTER_ORDER_EFFECTIVE_START_DATES); request.setParameter("v", Representation.FULL.getRepresentation()); SimpleObject result = deserialize(handle(request)); assertNotNull(result); List<Object> hits = (List<Object>) result.get("results"); assertThat(hits.size(), is(4)); assertNull(PropertyUtils.getProperty(result, "totalCount")); RadiologyOrderSearchCriteria radiologyOrderSearchCriteria = new RadiologyOrderSearchCriteria.Builder() .fromEffectiveStartDate(format.parse(DATE_BEFORE_ORDER_EFFECTIVE_START_DATES)) .toEffectiveStartDate(format.parse(DATE_AFTER_ORDER_EFFECTIVE_START_DATES)) .build(); List<RadiologyOrder> radiologyOrders = radiologyOrderService.getRadiologyOrders(radiologyOrderSearchCriteria); for (int i = 0; i < hits.size(); i++) { if (PropertyUtils.getProperty(hits.get(i), "urgency") .equals("ON_SCHEDULED_DATE")) { assertThat(PropertyUtils.getProperty(hits.get(i), "scheduledDate"), is(resultFormat.format(radiologyOrders.get(i) .getScheduledDate()))); } else { assertThat(PropertyUtils.getProperty(hits.get(i), "dateActivated"), is(resultFormat.format(radiologyOrders.get(i) .getDateActivated()))); } } } /** * @see RadiologyOrderSearchHandler#search(RequestContext) */ @Test public void shouldReturnEmptySearchResultIfNoEffectiveOrderStartIsInDateRange() throws Exception { MockHttpServletRequest request = request(RequestMethod.GET, getURI()); request.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_EFFECTIVE_START_DATE_FROM, DATE_AFTER_ORDER_EFFECTIVE_START_DATES); request.setParameter("v", Representation.FULL.getRepresentation()); SimpleObject result = deserialize(handle(request)); assertNotNull(result); List<Object> hits = (List<Object>) result.get("results"); assertThat(hits.size(), is(0)); assertNull(PropertyUtils.getProperty(result, "totalCount")); } /** * @see RadiologyOrderSearchHandler#search(RequestContext) */ @Test public void shouldReturnAllRadiologyOrdersForGivenUrgency() throws Exception { MockHttpServletRequest requestUrgencyWithOneOrder = request(RequestMethod.GET, getURI()); requestUrgencyWithOneOrder.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_URGENCY, Urgency.ON_SCHEDULED_DATE.toString()); requestUrgencyWithOneOrder.setParameter("v", Representation.FULL.getRepresentation()); SimpleObject resultUrgencyWithOneOrder = deserialize(handle(requestUrgencyWithOneOrder)); assertNotNull(resultUrgencyWithOneOrder); List<Object> hits = (List<Object>) resultUrgencyWithOneOrder.get("results"); assertThat(hits.size(), is(1)); assertThat(PropertyUtils.getProperty(hits.get(0), "urgency"), is(Urgency.ON_SCHEDULED_DATE.toString())); assertNull(PropertyUtils.getProperty(resultUrgencyWithOneOrder, "totalCount")); MockHttpServletRequest requestUrgencyWithThreeOrders = request(RequestMethod.GET, getURI()); requestUrgencyWithThreeOrders.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_URGENCY, Urgency.ROUTINE.toString()); requestUrgencyWithThreeOrders.setParameter("v", Representation.FULL.getRepresentation()); SimpleObject resultUrgencyWithThreeOrders = deserialize(handle(requestUrgencyWithThreeOrders)); assertNotNull(resultUrgencyWithThreeOrders); hits = (List<Object>) resultUrgencyWithThreeOrders.get("results"); assertThat(hits.size(), is(3)); for (int i = 0; i < hits.size(); i++) { assertThat(PropertyUtils.getProperty(hits.get(i), "urgency"), is(Urgency.ROUTINE.toString())); } assertNull(PropertyUtils.getProperty(resultUrgencyWithThreeOrders, "totalCount")); } /** * @see RadiologyOrderSearchHandler#search(RequestContext) */ @Test public void shouldReturnEmptySearchResultIfNoRadiologyOrderExistsForGivenUrgency() throws Exception { MockHttpServletRequest requestUrgencyWithNoOrders = request(RequestMethod.GET, getURI()); requestUrgencyWithNoOrders.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_URGENCY, Urgency.STAT.toString()); SimpleObject resultUrgencyWithNoOrders = deserialize(handle(requestUrgencyWithNoOrders)); assertNotNull(resultUrgencyWithNoOrders); List<Object> hits = (List<Object>) resultUrgencyWithNoOrders.get("results"); assertThat(hits.size(), is(0)); assertNull(PropertyUtils.getProperty(resultUrgencyWithNoOrders, "totalCount")); } /** * @see RadiologyOrderSearchHandler#search(RequestContext) */ @Test public void shouldThrowIllegalArgumentExceptionIfUrgencyDoesntExist() throws Exception { expectedException.expect(IllegalArgumentException.class); MockHttpServletRequest requestUrgencyWithNoOrders = request(RequestMethod.GET, getURI()); requestUrgencyWithNoOrders.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_URGENCY, "wrong_urgency"); deserialize(handle(requestUrgencyWithNoOrders)); } /** * @see RadiologyOrderSearchHandler#search(RequestContext) */ @Test public void shouldReturnAllRadiologyOrdersMatchingTheSearchQueryAndTotalCountIfRequested() throws Exception { MockHttpServletRequest requestPatientAndUrgencyWithOneOrder = request(RequestMethod.GET, getURI()); requestPatientAndUrgencyWithOneOrder.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_PATIENT, PATIENT_WITH_ONE_ORDER); requestPatientAndUrgencyWithOneOrder.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_URGENCY, Urgency.ROUTINE.toString()); requestPatientAndUrgencyWithOneOrder.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_TOTAL_COUNT, "true"); SimpleObject resultPatientAndUrgencyWithOneOrder = deserialize(handle(requestPatientAndUrgencyWithOneOrder)); assertNotNull(resultPatientAndUrgencyWithOneOrder); assertThat(PropertyUtils.getProperty(resultPatientAndUrgencyWithOneOrder, "totalCount"), is(1)); MockHttpServletRequest requestPatientAndUrgencyWithTwoOrders = request(RequestMethod.GET, getURI()); requestPatientAndUrgencyWithTwoOrders.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_PATIENT, PATIENT_WITH_TWO_ORDERS); requestPatientAndUrgencyWithOneOrder.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_URGENCY, Urgency.ROUTINE.toString()); requestPatientAndUrgencyWithTwoOrders.setParameter(RadiologyOrderSearchHandler.REQUEST_PARAM_TOTAL_COUNT, "true"); SimpleObject resultPatientAndUrgencyWithTwoOrders = deserialize(handle(requestPatientAndUrgencyWithTwoOrders)); assertNotNull(resultPatientAndUrgencyWithTwoOrders); assertThat(PropertyUtils.getProperty(resultPatientAndUrgencyWithTwoOrders, "totalCount"), is(2)); } }