/**
* 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.webservices.rest.web.v1_0.controller.openmrs1_9;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.Encounter;
import org.openmrs.EncounterProvider;
import org.openmrs.Obs;
import org.openmrs.Visit;
import org.openmrs.api.EncounterService;
import org.openmrs.api.VisitService;
import org.openmrs.api.context.Context;
import org.openmrs.module.webservices.rest.SimpleObject;
import org.openmrs.module.webservices.rest.test.Util;
import org.openmrs.module.webservices.rest.web.ConversionUtil;
import org.openmrs.module.webservices.rest.web.RestConstants;
import org.openmrs.module.webservices.rest.web.RestTestConstants1_9;
import org.openmrs.module.webservices.rest.web.representation.Representation;
import org.openmrs.module.webservices.rest.web.v1_0.controller.MainResourceControllerTest;
import org.openmrs.util.Format;
import org.openmrs.util.Format.FORMAT_TYPE;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.web.bind.annotation.RequestMethod;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
/**
* Contains tests for the 19 ext {@link EncounterController} Overrides the failing test methods from
* the EncounterControllerTest in the rest web services modules in order to make them pass and adds
* tests specific to the visit property
*/
public class EncounterController1_9Test extends MainResourceControllerTest {
@Before
public void setup() throws Exception {
executeDataSet(RestTestConstants1_9.TEST_DATASET);
}
/**
* @see org.openmrs.module.webservices.rest.web.v1_0.controller.MainResourceControllerTest#getURI()
*/
@Override
public String getURI() {
return "encounter";
}
/**
* @see org.openmrs.module.webservices.rest.web.v1_0.controller.MainResourceControllerTest#getUuid()
*/
@Override
public String getUuid() {
return "6519d653-393b-4118-9c83-a3715b82d4ac";
}
/**
* @see org.openmrs.module.webservices.rest.web.v1_0.controller.MainResourceControllerTest#getAllCount()
*/
@Override
public long getAllCount() {
Map<Integer, List<Encounter>> allPatientEncounters = Context.getEncounterService().getAllEncounters(null);
int totalEncounters = 0;
for (Integer integer : allPatientEncounters.keySet()) {
List<Encounter> encounters = allPatientEncounters.get(integer);
if (encounters != null) {
totalEncounters = totalEncounters + encounters.size();
}
}
return totalEncounters;
}
/**
* @see org.openmrs.module.webservices.rest.web.v1_0.controller.MainResourceControllerTest#shouldGetAll()
*/
@Override
@Test(expected = Exception.class)
public void shouldGetAll() throws Exception {
super.shouldGetAll();
}
/**
* @see org.openmrs.module.webservices.rest.web.v1_0.controller.EncounterController1_9Test#createEncounter_shouldCreateEncounterWithObsAttributesUnordered()
*/
@Test
public void createEncounter_shouldCreateEncounterWithObsAttributesUnordered() throws Exception {
long before = getAllCount();
List<SimpleObject> obs = new ArrayList<SimpleObject>();
SimpleObject weight = new SimpleObject();
weight.put("value", 70);
weight.put("concept", "c607c80f-1ea9-4da3-bb88-6276ce8868dd");
obs.add(weight);
SimpleObject civilStatus = new SimpleObject();
civilStatus.put("value", "92afda7c-78c9-47bd-a841-0de0817027d4");
civilStatus.put("concept", "89ca642a-dab6-4f20-b712-e12ca4fc6d36");
obs.add(civilStatus);
SimpleObject encounter = new SimpleObject();
encounter.put("location", "9356400c-a5a2-4532-8f2b-2361b3446eb8");
encounter.put("encounterType", "61ae96f4-6afe-4351-b6f8-cd4fc383cce1");
encounter.put("encounterDatetime", "2011-01-15");
encounter.put("patient", "da7f524f-27ce-4bb2-86d6-6d1d05312bd5");
encounter.put("provider", "ba1b19c2-3ed6-4f63-b8c0-f762dc8d7562");
encounter.put("obs", obs);
MockHttpServletResponse response = handle(newPostRequest(getURI(), encounter));
SimpleObject newEncounter = deserialize(response);
Assert.assertNotNull(newEncounter);
Assert.assertEquals(before + 1, getAllCount());
List<Map<String, String>> result = (List<Map<String, String>>) newEncounter.get("obs");
Assert.assertEquals(2, result.size());
Set<String> obsDisplayValues = new HashSet<String>();
for (Map<String, String> o : result) {
obsDisplayValues.add(o.get("display"));
}
Assert.assertTrue(obsDisplayValues.contains("CIVIL STATUS: MARRIED"));
Assert.assertTrue(obsDisplayValues.contains("WEIGHT (KG): 70.0"));
}
@Test
public void createEncounter_shouldCreateEncounterWithNestedObs() throws Exception {
List<SimpleObject> obsObject = new ArrayList<SimpleObject>();
List<SimpleObject> parentGroupMembersObject = new ArrayList<SimpleObject>();
List<SimpleObject> child1GroupMembersObject = new ArrayList<SimpleObject>();
SimpleObject grandchild = new SimpleObject();
grandchild.put("value", 1);
grandchild.put("concept", "c607c80f-1ea9-4da3-bb88-6276ce8868dd");
child1GroupMembersObject.add(grandchild);
SimpleObject child = new SimpleObject();
child.put("concept", "c607c80f-1ea9-4da3-bb88-6276ce8868dd");
child.put("groupMembers", child1GroupMembersObject);
parentGroupMembersObject.add(child);
SimpleObject parent = new SimpleObject();
parent.put("concept", "c607c80f-1ea9-4da3-bb88-6276ce8868dd");
parent.put("groupMembers", parentGroupMembersObject);
obsObject.add(parent);
SimpleObject encounter = new SimpleObject();
encounter.put("location", "9356400c-a5a2-4532-8f2b-2361b3446eb8");
encounter.put("encounterType", "61ae96f4-6afe-4351-b6f8-cd4fc383cce1");
encounter.put("encounterDatetime", "2011-01-15");
encounter.put("patient", "da7f524f-27ce-4bb2-86d6-6d1d05312bd5");
encounter.put("obs", obsObject);
MockHttpServletResponse response = handle(newPostRequest(getURI(), encounter));
String newEncounterUuid = deserialize(response).get("uuid").toString();
Encounter newEncounter = Context.getEncounterService().getEncounterByUuid(newEncounterUuid);
Set<Obs> encounterObs = newEncounter.getAllObs();
Assert.assertThat(encounterObs.size(), is(1));
Obs parentObs = encounterObs.iterator().next();
Assert.assertTrue(parentObs.hasGroupMembers());
Set<Obs> parentGroupMembers = parentObs.getGroupMembers();
Assert.assertThat(parentGroupMembers.size(), is(1));
Obs childObs = parentGroupMembers.iterator().next();
Assert.assertTrue(childObs.hasGroupMembers());
Set<Obs> childGroupMembers = childObs.getGroupMembers();
Assert.assertThat(childGroupMembers.size(), is(1));
Obs grandchildObs = childGroupMembers.iterator().next();
Assert.assertThat(grandchildObs.getValueNumeric(), is(1.0));
System.out.println("");
}
@Test
public void createEncounter_shouldCreateANewEncounterWithObs() throws Exception {
long before = getAllCount();
Util.log("before = ", before);
SimpleObject post = createEncounterWithObs();
MockHttpServletResponse response = handle(newPostRequest(getURI(), post));
SimpleObject newEncounter = deserialize(response);
Assert.assertNotNull(newEncounter);
Util.log("after = ", getAllCount());
Assert.assertEquals(before + 1, getAllCount());
Util.log("created encounter with obs", newEncounter);
@SuppressWarnings("unchecked")
List<Map<String, String>> obs = (List<Map<String, String>>) newEncounter.get("obs");
Assert.assertEquals(4, obs.size());
Set<String> obsDisplayValues = new HashSet<String>();
for (Map<String, String> o : obs) {
obsDisplayValues.add(o.get("display"));
}
Assert.assertTrue(obsDisplayValues.contains("CIVIL STATUS: MARRIED"));
Assert.assertTrue(obsDisplayValues.contains("FAVORITE FOOD, NON-CODED: fried chicken"));
Assert.assertTrue(obsDisplayValues.contains("WEIGHT (KG): 70.0"));
// obs.getValueAsString() uses application Locale and hence have to do this
Calendar cal = Calendar.getInstance();
cal.set(2011, Calendar.JUNE, 21, 0, 0, 0);
String format = Format.format(cal.getTime(), Context.getLocale(), FORMAT_TYPE.TIMESTAMP);
Assert.assertTrue(obsDisplayValues.contains("DATE OF FOOD ASSISTANCE: " + format));
}
/**
* @see org.openmrs.module.webservices.rest.web.v1_0.controller.EncounterController1_9Test#getEncounter_shouldGetAFullRepresentationOfAEncounterIncludingObsGroups()
*/
@Test
public void getEncounter_shouldGetAFullRepresentationOfAEncounterIncludingObsGroups() throws Exception {
executeDataSet("encounterWithObsGroup1_9.xml");
MockHttpServletRequest req = request(RequestMethod.GET, getURI() + "/62967e68-96bb-11e0-8d6b-9b9415a91465");
req.addParameter(RestConstants.REQUEST_PROPERTY_FOR_REPRESENTATION, RestConstants.REPRESENTATION_FULL);
MockHttpServletResponse response = handle(req);
SimpleObject result = deserialize(response);
SimpleDateFormat ymd = new SimpleDateFormat("yyyy-MM-dd");
Util.log("full", result);
Assert.assertNotNull(result);
Assert.assertEquals("62967e68-96bb-11e0-8d6b-9b9415a91465", result.get("uuid"));
Assert.assertNotNull(result.get("obs"));
Assert.assertEquals("0f97e14e-cdc2-49ac-9255-b5126f8a5147", Util.getByPath(result, "obs[0]/concept/uuid"));
Assert.assertEquals("96408258-000b-424e-af1a-403919332938",
Util.getByPath(result, "obs[0]/groupMembers[0]/concept/uuid"));
Assert.assertEquals("Some text", Util.getByPath(result, "obs[0]/groupMembers[0]/value"));
Assert.assertEquals("11716f9c-1434-4f8d-b9fc-9aa14c4d6126",
Util.getByPath(result, "obs[0]/groupMembers[1]/concept/uuid"));
Assert.assertEquals(ConversionUtil.convertToRepresentation(ymd.parse("2011-06-12"), Representation.DEFAULT),
Util.getByPath(result, "obs[0]/groupMembers[1]/value"));
// make sure there's a group in the group
Assert.assertEquals("0f97e14e-cdc2-49ac-9255-b5126f8a5147",
Util.getByPath(result, "obs[0]/groupMembers[2]/concept/uuid"));
Assert.assertEquals("96408258-000b-424e-af1a-403919332938",
Util.getByPath(result, "obs[0]/groupMembers[2]/groupMembers[0]/concept/uuid"));
Assert.assertEquals("Some text", Util.getByPath(result, "obs[0]/groupMembers[2]/groupMembers[0]/value"));
Assert.assertEquals("11716f9c-1434-4f8d-b9fc-9aa14c4d6126",
Util.getByPath(result, "obs[0]/groupMembers[2]/groupMembers[1]/concept/uuid"));
Assert.assertEquals(ConversionUtil.convertToRepresentation(ymd.parse("2011-06-12"), Representation.DEFAULT),
Util.getByPath(result, "obs[0]/groupMembers[2]/groupMembers[1]/value"));
}
/**
* @see org.openmrs.module.webservices.rest.web.v1_0.controller.EncounterController1_9Test#shouldCreateAnEncounterWithObsAndOrdersOfDifferentTypes()
*/
@Test
public void shouldCreateAnEncounterWithObsAndOrdersOfDifferentTypes() throws Exception {
String foodAssistanceUuid = "0dde1358-7fcf-4341-a330-f119241a46e8";
String lunchOrderUuid = "e23733ab-787e-4096-8ba2-577a902d2c2b";
String lunchInstructions = "Give them yummy food please";
String triomuneConceptUuid = "d144d24f-6913-4b63-9660-a9108c2bebef";
String triomuneDrugUuid = "3cfcf118-931c-46f7-8ff6-7b876f0d4202";
long before = getAllCount();
SimpleObject post = createEncounterWithObs();
List<SimpleObject> orders = new ArrayList<SimpleObject>();
orders.add(SimpleObject.parseJson("{ \"type\": \"order\", \"concept\": \"" + foodAssistanceUuid
+ "\", \"orderType\": \"" + lunchOrderUuid + "\", \"instructions\": \"" + lunchInstructions + "\" }"));
orders.add(SimpleObject.parseJson("{ \"type\": \"drugorder\", \"concept\": \"" + triomuneConceptUuid
+ "\", \"drug\": \"" + triomuneDrugUuid + "\", \"dose\": \"1\", \"units\": \"tablet\" }"));
post.add("orders", orders);
SimpleObject newEncounter = deserialize(handle(newPostRequest(getURI(), post)));
Assert.assertNotNull(newEncounter);
Assert.assertEquals(before + 1, getAllCount());
Util.log("created encounter with obs and orders", newEncounter);
@SuppressWarnings("unchecked")
List<Map<String, String>> newOrders = (List<Map<String, String>>) newEncounter.get("orders");
Assert.assertEquals(2, newOrders.size());
List<String> lookFor = new ArrayList<String>(Arrays.asList("FOOD ASSISTANCE", "Triomune-30: 1.0 tablet"));
for (Map<String, String> o : newOrders) {
lookFor.remove(o.get("display"));
}
Assert.assertEquals("Did not find: " + lookFor, 0, lookFor.size());
}
@Test
public void createEncounter_shouldCreateANewEncounterWithAVisitProperty() throws Exception {
long before = getAllCount();
final String visitUuid = "1e5d5d48-6b78-11e0-93c3-18a905e044dc";
String json = "{\"visit\":\""
+ visitUuid
+ "\",\"location\":\"9356400c-a5a2-4532-8f2b-2361b3446eb8\", \"encounterType\": \"61ae96f4-6afe-4351-b6f8-cd4fc383cce1\", \"encounterDatetime\": \"2011-01-15\", \"patient\": \"da7f524f-27ce-4bb2-86d6-6d1d05312bd5\", \"provider\":\"ba1b19c2-3ed6-4f63-b8c0-f762dc8d7562\"}";
SimpleObject post = new ObjectMapper().readValue(json, SimpleObject.class);
Object newEncounterObject = deserialize(handle(newPostRequest(getURI(), post)));
Assert.assertNotNull(newEncounterObject);
Encounter newEncounter = Context.getEncounterService().getEncounterByUuid(
((SimpleObject) newEncounterObject).get("uuid").toString());
Assert.assertEquals(before + 1, getAllCount());
//the encounter should have been assigned to the visit
Assert.assertNotNull(newEncounter);
Assert.assertNotNull(newEncounter.getVisit());
Assert.assertEquals(visitUuid, newEncounter.getVisit().getUuid());
}
@Test
public void createEncounter_shouldEditVisitPropertyForAnExisitingEncounter() throws Exception {
EncounterService es = Context.getEncounterService();
VisitService vs = Context.getVisitService();
Encounter encounter = es.getEncounterByUuid(getUuid());
Visit newVisit = new Visit(encounter.getPatient(), vs.getVisitTypeByUuid(RestTestConstants1_9.VISIT_TYPE_UUID),
new SimpleDateFormat("yyyy-MM-dd").parse("2008-08-01"));
vs.saveVisit(newVisit);
String json = "{\"visit\":\"" + newVisit.getUuid() + "\"}";
SimpleObject post = new ObjectMapper().readValue(json, SimpleObject.class);
Object newEncounterObject = handle(newPostRequest(getURI() + "/" + getUuid(), post));
Assert.assertNotNull(newEncounterObject);
Encounter update = es.getEncounterByUuid(getUuid());
//the encounter should have been res assigned to the new visit
Assert.assertEquals(newVisit, update.getVisit());
}
@Test
public void createEncounter_shouldCreateEncounterWithProviders() throws Exception {
long encountersBefore = getAllCount();
//Post
SimpleObject newEncounter = deserialize(handle(newPostRequest(getURI(), createEncounterWithProviders())));
Assert.assertNotNull(newEncounter);
Assert.assertEquals(encountersBefore + 1, getAllCount());
Util.log("Created a new encounter with a list of providers with different roles", newEncounter);
List<?> encounterProviderList = newEncounter.get("encounterProviders");
Assert.assertEquals(2, encounterProviderList.size());
}
/**
* Copied from The EncounterControllerTest class from the rest web services module
*
* @return
* @throws Exception
*/
private SimpleObject createEncounterWithObs() throws Exception {
List<SimpleObject> obs = new ArrayList<SimpleObject>();
// weight in kg = 70
obs.add(SimpleObject.parseJson("{ \"concept\": \"c607c80f-1ea9-4da3-bb88-6276ce8868dd\",\"value\": 70 }"));
// civil status = married
obs.add(SimpleObject
.parseJson("{ \"concept\": \"89ca642a-dab6-4f20-b712-e12ca4fc6d36\", \"value\": \"92afda7c-78c9-47bd-a841-0de0817027d4\" }"));
// favorite food, non-coded = fried chicken
obs.add(SimpleObject
.parseJson("{ \"concept\": \"96408258-000b-424e-af1a-403919332938\", \"value\": \"fried chicken\" }"));
// date of food assistance = 2011-06-21
obs.add(SimpleObject
.parseJson("{ \"concept\": \"11716f9c-1434-4f8d-b9fc-9aa14c4d6126\", \"value\": \"2011-06-21 00:00\" }"));
return new SimpleObject().add("location", "9356400c-a5a2-4532-8f2b-2361b3446eb8")
.add("encounterType", "61ae96f4-6afe-4351-b6f8-cd4fc383cce1").add("encounterDatetime", "2011-01-15")
.add("patient", "da7f524f-27ce-4bb2-86d6-6d1d05312bd5")
.add("provider", "ba1b19c2-3ed6-4f63-b8c0-f762dc8d7562").add("obs", obs);
}
private SimpleObject createEncounterWithProviders() throws Exception {
Set<SimpleObject> providers = new HashSet<SimpleObject>();
providers.add(SimpleObject.parseJson("{\"provider\":\"c2299800-dgha-11e0-9572-0800200c9a66\","
+ "\"encounterRole\":\"a0b03050-c99b-11e0-9572-0800200c9a66\"}"));
providers.add(SimpleObject.parseJson("{\"provider\":\"c2299800-dgha-11e0-9572-0800200c9a66\","
+ "\"encounterRole\":\"a0b03050-c99b-11e0-9572-0800201c9a71\"}"));
return new SimpleObject().add("location", "9356400c-a5a2-4532-8f2b-2361b3446eb8")
.add("encounterType", "61ae96f4-6afe-4351-b6f8-cd4fc383cce1").add("encounterDatetime", "2015-06-17")
.add("patient", "da7f524f-27ce-4bb2-86d6-6d1d05312bd5").add("encounterProviders", providers);
}
@Test
public void getEncounter_shouldGetOnlyNonVoidedEncounterProviders() throws Exception {
Encounter encounter = Context.getEncounterService().getEncounterByUuid(RestTestConstants1_9.SECOND_ENCOUNTER_UUID);
Set<EncounterProvider> encounterProviders = encounter.getEncounterProviders();
String voidedEncounterProviderUuid = null;
if (encounterProviders != null) {
for (EncounterProvider encounterProvider : encounterProviders) {
if (encounterProvider.isVoided()) {
voidedEncounterProviderUuid = encounterProvider.getUuid();
break;
}
}
}
Assert.assertNotNull(voidedEncounterProviderUuid);
// the encounter has a voided encounter provider
Assert.assertEquals(RestTestConstants1_9.VOIDED_ENCOUNTER_PROVIDER, voidedEncounterProviderUuid);
// retrieve the same encounter via the encounter web service
MockHttpServletRequest req = request(RequestMethod.GET, getURI() + "/" + RestTestConstants1_9.SECOND_ENCOUNTER_UUID);
MockHttpServletResponse response = handle(req);
SimpleObject result = deserialize(response);
voidedEncounterProviderUuid = null;
List<Map<String, String>> encounterProviderList = result.get("encounterProviders");
// we now check to make sure the encounter REST web service does not return voided encounter provider
if (encounterProviderList != null) {
for (Map<String, String> wsEncounterProvider : encounterProviderList) {
if (StringUtils.equals(RestTestConstants1_9.VOIDED_ENCOUNTER_PROVIDER, wsEncounterProvider.get("uuid"))) {
voidedEncounterProviderUuid = wsEncounterProvider.get("uuid");
// we found the voided encounter provider
break;
}
}
}
// the voided encounter provider is not returned by the encounter web service
Assert.assertNull(voidedEncounterProviderUuid);
}
@Test
public void updateEncounter_shouldUpdateEncounterProviders() throws Exception {
EncounterService es = Context.getEncounterService();
Encounter encounter = es.getEncounterByUuid(RestTestConstants1_9.ENCOUNTER_UUID);
int initialCount = encounter.getEncounterProviders().size();
//Get one EncounterProvider
EncounterProvider existing = encounter.getEncounterProviders().iterator().next();
Assert.assertNotNull(existing);
String newRoleUuid = "a0b03050-c99b-11e0-9572-0800201c9a71";
Assert.assertNotNull(existing);
Assert.assertNotEquals(existing.getEncounterRole(), es.getEncounterRoleByUuid(newRoleUuid));
SimpleObject newOne = SimpleObject.parseJson("{" + "\"uuid\": \"" + existing.getUuid() + "\"," + "\"provider\": \""
+ existing.getProvider().getUuid() + "\"," + "\"encounterRole\": \"" + newRoleUuid + "\","
+ "\"encounter\": \"" + existing.getEncounter().getUuid() + "\"" + "}");
Set<SimpleObject> encounterProvidersToPost = new HashSet<SimpleObject>();
encounterProvidersToPost.add(newOne);
SimpleObject encounterToModify = new SimpleObject().add("encounterProviders", encounterProvidersToPost).add("uuid",
encounter.getUuid());
//Post the existing encounter
deserialize(handle(newPostRequest(getURI() + "/" + encounter.getUuid(), encounterToModify)));
Encounter updatedEncounter = es.getEncounterByUuid(RestTestConstants1_9.ENCOUNTER_UUID);
EncounterProvider updateEncounterProvider = getEncounterProviderWthUuid(updatedEncounter.getEncounterProviders(),
existing.getUuid());
Assert.assertEquals(initialCount, updatedEncounter.getEncounterProviders().size());
Assert.assertNotNull(updatedEncounter);
Assert.assertEquals(es.getEncounterRoleByUuid(newRoleUuid), updateEncounterProvider.getEncounterRole());
}
private EncounterProvider getEncounterProviderWthUuid(Set<EncounterProvider> eps, String uuid) {
assert eps != null;
assert uuid != null;
for (EncounterProvider ep : eps) {
if (uuid.equals(ep.getUuid())) {
return ep;
}
}
return null;
}
}