/**
* 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.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 static org.junit.Assert.assertTrue;
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.api.ProviderService;
import org.openmrs.module.radiology.report.RadiologyReport;
import org.openmrs.module.radiology.report.RadiologyReportSearchCriteria;
import org.openmrs.module.radiology.report.RadiologyReportService;
import org.openmrs.module.radiology.report.RadiologyReportStatus;
import org.openmrs.module.webservices.rest.SimpleObject;
import org.openmrs.module.webservices.rest.web.RequestContext;
import org.openmrs.module.webservices.rest.web.RestConstants;
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 RadiologyReportSearchHandler}.
*/
public class RadiologyReportSearchHandlerComponentTest extends MainResourceControllerTest {
protected static final String TEST_DATASET = "RadiologyReportSearchHandlerComponentTestDataset.xml";
private static final String RADIOLOGY_REPORT_UUID_OF_VOIDED = "90765170-473f-11e6-beb8-9e71128cae77";
private static final String DATE_AFTER_REPORT_DATES = "2016-07-02";
private static final String DATE_BEFORE_REPORT_DATES = "2016-05-28";
private static final String DATE_BETWEEN_REPORT_DATES = "2016-06-15";
private static final String PROVIDER_WITH_RADIOLOGY_REPORTS = "c2299800-cca9-11e0-9572-0800200c9a66";
private static final String PROVIDER_WITHOUT_RADIOLOGY_REPORTS = "550e8400-e29b-11d4-a716-446655440000";
private static final String RADIOLOGY_REPORT_UUID = "82d3fb80-e403-4b9b-982c-22161ec29811";
@Autowired
RadiologyReportService radiologyReportService;
@Autowired
ProviderService providerService;
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
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 "radiologyreport";
}
/**
* @see MainResourceControllerTest#getAllCount()
*/
@Override
public long getAllCount() {
return 0;
}
/**
* @see MainResourceControllerTest#getUuid()
*/
@Override
public String getUuid() {
return RADIOLOGY_REPORT_UUID;
}
/**
* @see MainResourceControllerTest#shouldGetAll()
*/
@Override
@Test(expected = ResourceDoesNotSupportOperationException.class)
public void shouldGetAll() throws Exception {
deserialize(handle(request(RequestMethod.GET, getURI())));
}
@Test
public void shouldReturnAllRadiologyReportsIncludingDiscontinuedMatchingTheSearchQueryIfIncludeAllIsSet()
throws Exception {
MockHttpServletRequest request = request(RequestMethod.GET, getURI());
request.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_PRINCIPAL_RESULT_INTERPRETER,
PROVIDER_WITH_RADIOLOGY_REPORTS);
request.setParameter(RestConstants.REQUEST_PROPERTY_FOR_INCLUDE_ALL, "true");
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(3));
assertThat(PropertyUtils.getProperty(hits.get(2), "uuid"), is(RADIOLOGY_REPORT_UUID_OF_VOIDED));
assertThat(PropertyUtils.getProperty(hits.get(2), "voided"), is(true));
}
@Test
public void shouldReturnAllRadiologyReportsWithReportDateAfterOrEqualToFromDateIfOnlyDateFromWasSpecified()
throws Exception {
MockHttpServletRequest request = request(RequestMethod.GET, getURI());
request.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_DATE_FROM, DATE_BETWEEN_REPORT_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(1));
assertNull(PropertyUtils.getProperty(result, "totalCount"));
RadiologyReportSearchCriteria radiologyReportSearchCriteria =
new RadiologyReportSearchCriteria.Builder().fromDate(format.parse(DATE_BETWEEN_REPORT_DATES))
.build();
assertThat(PropertyUtils.getProperty(hits.get(0), "date"),
is(resultFormat.format(radiologyReportService.getRadiologyReports(radiologyReportSearchCriteria)
.get(0)
.getDate())));
assertThat(PropertyUtils.getProperty(hits.get(0), "voided"), is(false));
}
@Test
public void shouldReturnAllRadiologyReportsWithReportDateBeforeOrEqualToToDateIfOnlyDateToWasSpecified()
throws Exception {
MockHttpServletRequest request = request(RequestMethod.GET, getURI());
request.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_DATE_TO, DATE_BETWEEN_REPORT_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(1));
assertNull(PropertyUtils.getProperty(result, "totalCount"));
RadiologyReportSearchCriteria radiologyReportSearchCriteria =
new RadiologyReportSearchCriteria.Builder().toDate(format.parse(DATE_BETWEEN_REPORT_DATES))
.build();
assertThat(PropertyUtils.getProperty(hits.get(0), "date"),
is(resultFormat.format(radiologyReportService.getRadiologyReports(radiologyReportSearchCriteria)
.get(0)
.getDate())));
assertThat(PropertyUtils.getProperty(hits.get(0), "voided"), is(false));
}
/**
* @see RadiologyReportSearchHandler#search(RequestContext)
*/
@Test
public void shouldReturnAllRadiologyReportsWithinGivenDateRangeIfDateToAndDateFromAreSpecified() throws Exception {
MockHttpServletRequest request = request(RequestMethod.GET, getURI());
request.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_DATE_FROM, DATE_BEFORE_REPORT_DATES);
request.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_DATE_TO, DATE_AFTER_REPORT_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"));
RadiologyReportSearchCriteria radiologyReportSearchCriteria =
new RadiologyReportSearchCriteria.Builder().fromDate(format.parse(DATE_BEFORE_REPORT_DATES))
.toDate(format.parse(DATE_AFTER_REPORT_DATES))
.build();
List<RadiologyReport> radiologyReports = radiologyReportService.getRadiologyReports(radiologyReportSearchCriteria);
assertThat(PropertyUtils.getProperty(hits.get(0), "date"), is(resultFormat.format(radiologyReports.get(0)
.getDate())));
assertThat(PropertyUtils.getProperty(hits.get(1), "date"), is(resultFormat.format(radiologyReports.get(1)
.getDate())));
assertThat(PropertyUtils.getProperty(hits.get(0), "voided"), is(false));
assertThat(PropertyUtils.getProperty(hits.get(1), "voided"), is(false));
}
@Test
public void shouldReturnEmptySearchResultIfNoReportIsInDateRange() throws Exception {
MockHttpServletRequest request = request(RequestMethod.GET, getURI());
request.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_DATE_FROM, DATE_AFTER_REPORT_DATES);
SimpleObject result = deserialize(handle(request));
assertNotNull(result);
List<Object> hits = (List<Object>) result.get("results");
assertTrue(hits.isEmpty());
}
@Test
public void shouldReturnAllRadiologyReportsForGivenPrincipalResultsInterpreter() throws Exception {
MockHttpServletRequest request = request(RequestMethod.GET, getURI());
request.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_PRINCIPAL_RESULT_INTERPRETER,
PROVIDER_WITH_RADIOLOGY_REPORTS);
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));
assertThat(PropertyUtils.getProperty(hits.get(0), "voided"), is(false));
assertThat(PropertyUtils.getProperty(hits.get(1), "voided"), is(false));
}
/**
* @see RadiologyReportSearchHandler#search(RequestContext)
*/
@Test
public void shouldReturnEmptySearchResultIfNoReportExistsForPrincipalResultsInterpreter() throws Exception {
MockHttpServletRequest request = request(RequestMethod.GET, getURI());
request.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_PRINCIPAL_RESULT_INTERPRETER,
PROVIDER_WITHOUT_RADIOLOGY_REPORTS);
SimpleObject result = deserialize(handle(request));
assertNotNull(result);
List<Object> hits = (List<Object>) result.get("results");
assertTrue(hits.isEmpty());
}
@Test
public void shouldReturnEmptySearchResultIfPrincipalResultsInterpreterCannotBeFound() throws Exception {
MockHttpServletRequest request = request(RequestMethod.GET, getURI());
request.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_PRINCIPAL_RESULT_INTERPRETER, "wrong_uuid");
SimpleObject result = deserialize(handle(request));
assertNotNull(result);
List<Object> hits = (List<Object>) result.get("results");
assertTrue(hits.isEmpty());
}
@Test
public void shouldReturnAllRadiologyReportsWithGivenStatus() throws Exception {
MockHttpServletRequest request = request(RequestMethod.GET, getURI());
request.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_STATUS, "COMPLETED");
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));
assertThat(PropertyUtils.getProperty(hits.get(0), "status"), is(RadiologyReportStatus.COMPLETED.toString()));
assertThat(PropertyUtils.getProperty(hits.get(1), "status"), is(RadiologyReportStatus.COMPLETED.toString()));
}
@Test
public void shouldReturnEmptySearchResultIfNoReportExistsForGivenStatus() throws Exception {
MockHttpServletRequest request = request(RequestMethod.GET, getURI());
request.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_STATUS, "DRAFT");
SimpleObject result = deserialize(handle(request));
assertNotNull(result);
List<Object> hits = (List<Object>) result.get("results");
assertTrue(hits.isEmpty());
}
@Test
public void shouldThrowIllegalArgumentExceptionIfReportStatusDoesntExist() throws Exception {
expectedException.expect(IllegalArgumentException.class);
MockHttpServletRequest request = request(RequestMethod.GET, getURI());
request.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_STATUS, "wrong_status");
deserialize(handle(request));
}
@Test
public void shouldReturnAllRadiologyReportsMatchingTheSearchQueryAndTotalCountIfRequested() throws Exception {
MockHttpServletRequest requestDateRangeWithOneReport = request(RequestMethod.GET, getURI());
requestDateRangeWithOneReport.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_DATE_FROM,
DATE_BETWEEN_REPORT_DATES);
requestDateRangeWithOneReport.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_TOTAL_COUNT, "true");
SimpleObject resultDateRangeWithOneReport = deserialize(handle(requestDateRangeWithOneReport));
assertNotNull(resultDateRangeWithOneReport);
assertThat(PropertyUtils.getProperty(resultDateRangeWithOneReport, "totalCount"), is(1));
MockHttpServletRequest requestDateRangeWithTwoReport = request(RequestMethod.GET, getURI());
requestDateRangeWithTwoReport.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_DATE_FROM,
DATE_BEFORE_REPORT_DATES);
requestDateRangeWithTwoReport.setParameter(RadiologyReportSearchHandler.REQUEST_PARAM_TOTAL_COUNT, "true");
SimpleObject resultDateRangeWithTwoReport = deserialize(handle(requestDateRangeWithTwoReport));
assertNotNull(resultDateRangeWithTwoReport);
assertThat(PropertyUtils.getProperty(resultDateRangeWithTwoReport, "totalCount"), is(2));
}
}