/**
* 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));
}
}