/**
* 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.api;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.hibernate.TransientObjectException;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.Concept;
import org.openmrs.Encounter;
import org.openmrs.Location;
import org.openmrs.Patient;
import org.openmrs.Visit;
import org.openmrs.VisitAttribute;
import org.openmrs.VisitAttributeType;
import org.openmrs.VisitType;
import org.openmrs.api.context.Context;
import org.openmrs.customdatatype.datatype.FreeTextDatatype;
import org.openmrs.test.BaseContextSensitiveTest;
import org.openmrs.test.TestUtil;
import org.openmrs.util.GlobalPropertiesTestHelper;
import org.openmrs.util.OpenmrsConstants;
/**
* Tests methods in the {@link VisitService}
*
* @since 1.9
*/
public class VisitServiceTest extends BaseContextSensitiveTest {
protected static final String VISITS_WITH_DATES_XML = "org/openmrs/api/include/VisitServiceTest-otherVisits.xml";
protected static final String VISITS_ATTRIBUTES_XML = "org/openmrs/api/include/VisitServiceTest-visitAttributes.xml";
private GlobalPropertiesTestHelper globalPropertiesTestHelper;
private VisitService visitService;
@Before
public void before() {
visitService = Context.getVisitService();
// Allow overlapping visits. Ticket 3963 has introduced optional validation of start and stop dates
// based on concurrent visits of the same patient. Turning this validation on (i.e. not allowing
// overlapping visits) breaks existing tests of the visit service.
//
globalPropertiesTestHelper = new GlobalPropertiesTestHelper(Context.getAdministrationService());
globalPropertiesTestHelper.setGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_ALLOW_OVERLAPPING_VISITS, "true");
}
@Test
public void getAllVisitTypes_shouldGetAllVisitTypes() {
List<VisitType> visitTypes = Context.getVisitService().getAllVisitTypes();
assertEquals(3, visitTypes.size());
}
@Test
public void getVisitType_shouldGetCorrectVisitType() {
VisitType visitType = Context.getVisitService().getVisitType(1);
assertNotNull(visitType);
assertEquals("Initial HIV Clinic Visit", visitType.getName());
visitType = Context.getVisitService().getVisitType(2);
assertNotNull(visitType);
assertEquals("Return TB Clinic Visit", visitType.getName());
visitType = Context.getVisitService().getVisitType(3);
assertNotNull(visitType);
assertEquals("Hospitalization", visitType.getName());
visitType = Context.getVisitService().getVisitType(4);
Assert.assertNull(visitType);
}
@Test
public void getVisitTypeByUuid_shouldGetCorrentVisitType() {
VisitType visitType = Context.getVisitService().getVisitTypeByUuid("c0c579b0-8e59-401d-8a4a-976a0b183519");
assertNotNull(visitType);
assertEquals("Initial HIV Clinic Visit", visitType.getName());
visitType = Context.getVisitService().getVisitTypeByUuid("759799ab-c9a5-435e-b671-77773ada74e4");
assertNotNull(visitType);
assertEquals("Return TB Clinic Visit", visitType.getName());
visitType = Context.getVisitService().getVisitTypeByUuid("759799ab-c9a5-435e-b671-77773ada74e6");
assertNotNull(visitType);
assertEquals("Hospitalization", visitType.getName());
visitType = Context.getVisitService().getVisitTypeByUuid("759799ab-c9a5-435e-b671-77773ada74e1");
Assert.assertNull(visitType);
}
@Test
public void getVisitTypes_shouldGetCorrentVisitTypes() {
List<VisitType> visitTypes = Context.getVisitService().getVisitTypes("HIV Clinic");
assertNotNull(visitTypes);
assertEquals(1, visitTypes.size());
assertEquals("Initial HIV Clinic Visit", visitTypes.get(0).getName());
visitTypes = Context.getVisitService().getVisitTypes("Clinic Visit");
assertNotNull(visitTypes);
assertEquals(2, visitTypes.size());
assertEquals("Initial HIV Clinic Visit", visitTypes.get(0).getName());
assertEquals("Return TB Clinic Visit", visitTypes.get(1).getName());
visitTypes = Context.getVisitService().getVisitTypes("ClinicVisit");
assertNotNull(visitTypes);
assertEquals(0, visitTypes.size());
}
@Test
public void saveVisitType_shouldSaveNewVisitType() {
List<VisitType> visitTypes = Context.getVisitService().getVisitTypes("Some Name");
assertEquals(0, visitTypes.size());
VisitType visitType = new VisitType("Some Name", "Description");
Context.getVisitService().saveVisitType(visitType);
visitTypes = Context.getVisitService().getVisitTypes("Some Name");
assertEquals(1, visitTypes.size());
//Should create a new visit type row.
assertEquals(4, Context.getVisitService().getAllVisitTypes().size());
}
@Test
public void saveVisitType_shouldSaveEditedVisitType() {
VisitType visitType = Context.getVisitService().getVisitType(1);
assertNotNull(visitType);
assertEquals("Initial HIV Clinic Visit", visitType.getName());
visitType.setName("Edited Name");
visitType.setDescription("Edited Description");
Context.getVisitService().saveVisitType(visitType);
visitType = Context.getVisitService().getVisitType(1);
assertNotNull(visitType);
assertEquals("Edited Name", visitType.getName());
assertEquals("Edited Description", visitType.getDescription());
//Should not change the number of visit types.
assertEquals(3, Context.getVisitService().getAllVisitTypes().size());
}
@Test
public void retireVisitType_shouldRetireGivenVisitType() {
VisitType visitType = Context.getVisitService().getVisitType(1);
assertNotNull(visitType);
Assert.assertFalse(visitType.getRetired());
Assert.assertNull(visitType.getRetireReason());
Context.getVisitService().retireVisitType(visitType, "retire reason");
visitType = Context.getVisitService().getVisitType(1);
assertNotNull(visitType);
assertTrue(visitType.getRetired());
assertEquals("retire reason", visitType.getRetireReason());
//Should not change the number of visit types.
assertEquals(3, Context.getVisitService().getAllVisitTypes().size());
}
@Test
public void unretireVisitType_shouldUnretireGivenVisitType() {
VisitType visitType = Context.getVisitService().getVisitType(3);
assertNotNull(visitType);
assertTrue(visitType.getRetired());
assertEquals("Some Retire Reason", visitType.getRetireReason());
Context.getVisitService().unretireVisitType(visitType);
visitType = Context.getVisitService().getVisitType(3);
assertNotNull(visitType);
Assert.assertFalse(visitType.getRetired());
Assert.assertNull(visitType.getRetireReason());
//Should not change the number of visit types.
assertEquals(3, Context.getVisitService().getAllVisitTypes().size());
}
@Test
public void purgeVisitType_shouldDeleteGivenVisitType() {
VisitType visitType = Context.getVisitService().getVisitType(3);
assertNotNull(visitType);
Context.getVisitService().purgeVisitType(visitType);
visitType = Context.getVisitService().getVisitType(3);
Assert.assertNull(visitType);
//Should reduce the existing number of visit types.
assertEquals(2, Context.getVisitService().getAllVisitTypes().size());
}
/**
* @see VisitService#getAllVisits()
*/
@Test
public void getAllVisits_shouldReturnAllUnvoidedVisits() {
assertEquals(5, Context.getVisitService().getAllVisits().size());
}
/**
* @see VisitService#getVisitByUuid(String)
*/
@Test
public void getVisitByUuid_shouldReturnAVisitMatchingTheSpecifiedUuid() {
Visit visit = Context.getVisitService().getVisitByUuid("1e5d5d48-6b78-11e0-93c3-18a905e044dc");
assertNotNull(visit);
assertEquals(1, visit.getId().intValue());
}
/**
* @see VisitService#saveVisit(Visit)
*/
@Test
public void saveVisit_shouldAddANewVisitToTheDatabase() {
VisitService vs = Context.getVisitService();
Integer originalSize = vs.getAllVisits().size();
Visit visit = new Visit(new Patient(2), new VisitType(1), new Date());
visit = vs.saveVisit(visit);
assertNotNull(visit.getId());
assertNotNull(visit.getUuid());
assertNotNull(visit.getCreator());
assertNotNull(visit.getDateCreated());
assertEquals(originalSize + 1, vs.getAllVisits().size());
}
/**
* @see VisitService#saveVisit(Visit)
*/
@Test
public void saveVisit_shouldSaveAVisitThoughChangedByAndDateCreatedAreNotSetForVisitAttributeExplictly()
{
executeDataSet(VISITS_ATTRIBUTES_XML);
VisitService vs = Context.getVisitService();
Visit visit = new Visit(new Patient(2), new VisitType(3), new Date());
VisitAttribute visitAttribute = createVisitAttributeWithoutCreatorAndDateCreated();
visit.setAttribute(visitAttribute);
visit = vs.saveVisit(visit);
assertNotNull(visit.getId());
}
private VisitAttribute createVisitAttributeWithoutCreatorAndDateCreated() {
VisitAttribute visitAttribute = new VisitAttribute();
VisitAttributeType attributeType = Context.getVisitService().getVisitAttributeType(1);
attributeType.setName("visit type");
visitAttribute.setValue(new Date());
visitAttribute.setAttributeType(attributeType);
return visitAttribute;
}
/**
* @see VisitService#saveVisit(Visit)
*/
@Test
public void saveVisit_shouldVoidAnAttributeIfMaxOccursIs1AndSameAttributeTypeAlreadyExists() {
executeDataSet(VISITS_ATTRIBUTES_XML);
VisitService vs = Context.getVisitService();
Visit visit = new Visit(new Patient(2), new VisitType(3), new Date());
visit.setAttribute(createVisitAttribute(new Date()));
visit.setAttribute(createVisitAttribute(new Date(System.currentTimeMillis() - 1000000)));
assertEquals(1, visit.getAttributes().size());
visit = vs.saveVisit(visit);
assertNotNull(visit.getId());
visit.setAttribute(createVisitAttribute("second visit"));
assertEquals(2, visit.getAttributes().size());
VisitAttribute firstAttribute = (VisitAttribute) visit.getAttributes().toArray()[0];
assertTrue(firstAttribute.getVoided());
}
private VisitAttribute createVisitAttribute(Object typedValue) {
VisitAttribute visitAttribute = new VisitAttribute();
VisitAttributeType attributeType = Context.getVisitService().getVisitAttributeType(1);
attributeType.setName("visit type");
visitAttribute.setValue(typedValue);
visitAttribute.setAttributeType(attributeType);
return visitAttribute;
}
/**
* @see VisitService#saveVisit(Visit)
*/
@Test
public void saveVisit_shouldUpdateAnExistingVisitInTheDatabase() {
Visit visit = Context.getVisitService().getVisit(2);
Assert.assertNull(visit.getLocation());//this is the field we are editing
Assert.assertNull(visit.getChangedBy());
Assert.assertNull(visit.getDateChanged());
visit.setLocation(Context.getLocationService().getLocation(1));
visit = Context.getVisitService().saveVisit(visit);
Context.flushSession();
assertNotNull(visit.getChangedBy());
assertNotNull(visit.getDateChanged());
assertEquals(Integer.valueOf(1), visit.getLocation().getLocationId());
}
/**
* @see VisitService#voidVisit(Visit,String)
*/
@Test
public void voidVisit_shouldVoidTheVisitAndSetTheVoidReason() {
Visit visit = Context.getVisitService().getVisit(1);
Assert.assertFalse(visit.getVoided());
Assert.assertNull(visit.getVoidReason());
Assert.assertNull(visit.getVoidedBy());
Assert.assertNull(visit.getDateVoided());
visit = Context.getVisitService().voidVisit(visit, "test reason");
assertTrue(visit.getVoided());
assertEquals("test reason", visit.getVoidReason());
assertEquals(Context.getAuthenticatedUser(), visit.getVoidedBy());
assertNotNull(visit.getDateVoided());
}
/**
* @see VisitService#voidVisit(Visit,String)
*/
@Test
public void voidVisit_shouldVoidEncountersWithVisit() {
//given
executeDataSet(VISITS_WITH_DATES_XML);
Visit visit = visitService.getVisit(7);
Assert.assertFalse(visit.getVoided());
List<Encounter> encountersByVisit = Context.getEncounterService().getEncountersByVisit(visit, false);
Assert.assertFalse(encountersByVisit.isEmpty());
//when
visit = visitService.voidVisit(visit, "test reason");
//then
assertTrue(visit.getVoided());
encountersByVisit = Context.getEncounterService().getEncountersByVisit(visit, false);
assertTrue(encountersByVisit.isEmpty());
}
/**
* @see VisitService#unvoidVisit(Visit)
*/
@Test
public void unvoidVisit_shouldUnvoidTheVisitAndUnsetAllTheVoidRelatedFields() {
Visit visit = Context.getVisitService().getVisit(6);
assertTrue(visit.getVoided());
assertNotNull(visit.getVoidReason());
assertNotNull(visit.getVoidedBy());
assertNotNull(visit.getDateVoided());
visit = Context.getVisitService().unvoidVisit(visit);
Assert.assertFalse(visit.getVoided());
Assert.assertNull(visit.getVoidReason());
Assert.assertNull(visit.getVoidedBy());
Assert.assertNull(visit.getDateVoided());
}
/**
* @see VisitService#unvoidVisit(Visit)
*/
@Test
public void unvoidVisit_shouldUnvoidEncountersVoidedWithVisit() {
//given
executeDataSet(VISITS_WITH_DATES_XML);
Visit visit = visitService.getVisit(7);
List<Encounter> encountersByVisit = Context.getEncounterService().getEncountersByVisit(visit, true);
assertEquals(2, encountersByVisit.size());
visitService.voidVisit(visit, "test reason");
assertTrue(visit.getVoided());
encountersByVisit = Context.getEncounterService().getEncountersByVisit(visit, false);
assertTrue(encountersByVisit.isEmpty());
//when
visit = visitService.unvoidVisit(visit);
//then
Assert.assertFalse(visit.getVoided());
encountersByVisit = Context.getEncounterService().getEncountersByVisit(visit, false);
assertEquals(1, encountersByVisit.size());
}
/**
* @see VisitService#purgeVisit(Visit)
*/
@Test
public void purgeVisit_shouldEraseTheVisitFromTheDatabase() {
VisitService vs = Context.getVisitService();
Integer originalSize = vs.getVisits(null, null, null, null, null, null, null, null, null, true, true).size();
Visit visit = Context.getVisitService().getVisit(1);
vs.purgeVisit(visit);
assertEquals(originalSize - 1, vs.getVisits(null, null, null, null, null, null, null, null, null, true, true).size());
}
/**
* @see VisitService#getVisitsByPatient(Patient)
*/
@Test
public void getVisitsByPatient_shouldReturnAllUnvoidedVisitsForTheSpecifiedPatient() {
assertEquals(3, Context.getVisitService().getVisitsByPatient(new Patient(2)).size());
}
/**
* @see VisitService#getActiveVisitsByPatient(Patient)
*/
@Test
public void getActiveVisitsByPatient_shouldReturnAllUnvoidedActiveVisitsForTheSpecifiedPatient() {
executeDataSet(VISITS_WITH_DATES_XML);
assertEquals(4, Context.getVisitService().getActiveVisitsByPatient(new Patient(2)).size());
}
@Test
public void getActiveVisitsByPatient_shouldReturnAllActiveVisitsForTheSpecifiedPatient() {
executeDataSet(VISITS_WITH_DATES_XML);
assertEquals(5, Context.getVisitService().getVisitsByPatient(new Patient(2), false, true).size());
}
@Test
public void getActiveVisitsByPatient_shouldReturnAllUnvoidedVisitsForTheSpecifiedPatient() {
executeDataSet(VISITS_WITH_DATES_XML);
assertEquals(8, Context.getVisitService().getVisitsByPatient(new Patient(2), true, false).size());
}
/**
* @see VisitService#getVisits(java.util.Collection, java.util.Collection, java.util.Collection, java.util.Collection, Date, Date, Date, Date, boolean)
*/
@Test
public void getVisits_shouldGetVisitsByIndications() {
assertEquals(1, Context.getVisitService().getVisits(null, null, null, Collections.singletonList(new Concept(5497)),
null, null, null, null, null, true, false).size());
}
/**
* @see VisitService#getVisits(java.util.Collection, java.util.Collection, java.util.Collection, java.util.Collection, Date, Date, Date, Date, boolean)
*/
@Test
public void getVisits_shouldGetVisitsByLocations() {
List<Location> locations = new ArrayList<>();
locations.add(new Location(1));
assertEquals(1, Context.getVisitService().getVisits(null, null, locations, null, null, null, null, null, null, true,
false).size());
}
/**
* @see VisitService#getVisits(java.util.Collection, java.util.Collection, java.util.Collection, java.util.Collection, Date, Date, Date, Date, boolean)
*/
@Test
public void getVisits_shouldGetVisitsByVisitType() {
List<VisitType> visitTypes = new ArrayList<>();
visitTypes.add(new VisitType(1));
assertEquals(4, Context.getVisitService().getVisits(visitTypes, null, null, null, null, null, null, null, null,
true, false).size());
}
/**
* @see VisitService#getVisits(java.util.Collection, java.util.Collection, java.util.Collection, java.util.Collection, Date, Date, Date, Date, boolean)
*/
@Test
public void getVisits_shouldGetVisitsEndedBetweenTheGivenEndDates() {
executeDataSet(VISITS_WITH_DATES_XML);
Calendar cal = Calendar.getInstance();
cal.set(2005, 1, 1, 0, 0, 0);
Date minEndDate = cal.getTime();
cal.set(2005, 1, 2, 23, 59, 0);
Date maxEndDate = cal.getTime();
assertEquals(2, Context.getVisitService().getVisits(null, null, null, null, null, null, minEndDate, maxEndDate,
null, true, false).size());
}
/**
* Test for TRUNK-3630
*
* @throws ParseException
* @see VisitService#getVisits(Collection,Collection,Collection,Collection,Date,Date,Date,Date,Map,boolean,boolean)
*/
@Test
public void getVisits_shouldGetVisitsThatAreStillOpenEvenIfMinStartDatetimeIsSpecified() throws ParseException {
Date minEndDatetime = new SimpleDateFormat("yyyy-MM-dd").parse("2061-01-01");
// this should get all open non-voided visits (which are ids 1, 2, 3, 4, 5 in standardTestDataset)
List<Visit> visits = Context.getVisitService().getVisits(null, null, null, null, null, null, minEndDatetime, null,
null, true, false);
assertEquals(5, visits.size());
assertTrue(TestUtil.containsId(visits, 1));
assertTrue(TestUtil.containsId(visits, 2));
assertTrue(TestUtil.containsId(visits, 3));
assertTrue(TestUtil.containsId(visits, 4));
assertTrue(TestUtil.containsId(visits, 5));
}
/**
* @see VisitService#getVisits(java.util.Collection, java.util.Collection, java.util.Collection, java.util.Collection, Date, Date, Date, Date, boolean)
*/
@Test
public void getVisits_shouldGetVisitsStartedBetweenTheGivenStartDates() {
executeDataSet(VISITS_WITH_DATES_XML);
Calendar cal = Calendar.getInstance();
cal.set(2005, 0, 1, 1, 0, 0);
Date minStartDate = cal.getTime();
cal.set(2005, 0, 1, 4, 0, 0);
Date maxStartDate = cal.getTime();
assertEquals(2, Context.getVisitService().getVisits(null, null, null, null, minStartDate, maxStartDate, null, null,
null, true, false).size());
}
/**
* @see VisitService#getVisits(java.util.Collection, java.util.Collection, java.util.Collection, java.util.Collection, Date, Date, Date, Date, boolean)
*/
@Test
public void getVisits_shouldReturnAllVisitsIfIncludeVoidedIsSetToTrue() {
assertEquals(6, Context.getVisitService()
.getVisits(null, null, null, null, null, null, null, null, null, true, true).size());
}
@Test(expected = APIException.class)
public void saveVisitType_shouldThrowErrorWhenNameIsNull() {
Context.getVisitService().saveVisitType(new VisitType());
}
@Test(expected = APIException.class)
public void saveVisitType_shouldThrowErrorWhenNameIsEmptyString() {
VisitType visitType = new VisitType("", null);
Context.getVisitService().saveVisitType(visitType);
}
/**
* @see VisitService#getAllVisitAttributeTypes()
*/
@Test
public void getAllVisitAttributeTypes_shouldReturnAllVisitAttributeTypesIncludingRetiredOnes() {
executeDataSet(VISITS_ATTRIBUTES_XML);
assertEquals(3, visitService.getAllVisitAttributeTypes().size());
}
/**
* @see VisitService#getVisitAttributeType(Integer)
*/
@Test
public void getVisitAttributeType_shouldReturnTheVisitAttributeTypeWithTheGivenId() {
executeDataSet(VISITS_ATTRIBUTES_XML);
assertEquals("Audit Date", visitService.getVisitAttributeType(1).getName());
}
/**
* @see VisitService#getVisitAttributeType(Integer)
*/
@Test
public void getVisitAttributeType_shouldReturnNullIfNoVisitAttributeTypeExistsWithTheGivenId() {
executeDataSet(VISITS_ATTRIBUTES_XML);
Assert.assertNull(visitService.getVisitAttributeType(999));
}
/**
* @see VisitService#getVisitAttributeTypeByUuid(String)
*/
@Test
public void getVisitAttributeTypeByUuid_shouldReturnTheVisitAttributeTypeWithTheGivenUuid() {
executeDataSet(VISITS_ATTRIBUTES_XML);
assertEquals("Audit Date", visitService.getVisitAttributeTypeByUuid("9516cc50-6f9f-11e0-8414-001e378eb67e")
.getName());
}
/**
* @see VisitService#getVisitAttributeTypeByUuid(String)
*/
@Test
public void getVisitAttributeTypeByUuid_shouldReturnNullIfNoVisitAttributeTypeExistsWithTheGivenUuid() {
executeDataSet(VISITS_ATTRIBUTES_XML);
Assert.assertNull(visitService.getVisitAttributeTypeByUuid("not-a-uuid"));
}
/**
* @see VisitService#purgeVisitAttributeType(VisitAttributeType)
*/
@Test
public void purgeVisitAttributeType_shouldCompletelyRemoveAVisitAttributeType() {
executeDataSet(VISITS_ATTRIBUTES_XML);
assertEquals(3, visitService.getAllVisitAttributeTypes().size());
visitService.purgeVisitAttributeType(visitService.getVisitAttributeType(2));
assertEquals(2, visitService.getAllVisitAttributeTypes().size());
}
/**
* @see VisitService#retireVisitAttributeType(VisitAttributeType,String)
*/
@Test
public void retireVisitAttributeType_shouldRetireAVisitAttributeType() {
executeDataSet(VISITS_ATTRIBUTES_XML);
VisitAttributeType vat = visitService.getVisitAttributeType(1);
Assert.assertFalse(vat.getRetired());
visitService.retireVisitAttributeType(vat, "for testing");
vat = visitService.getVisitAttributeType(1);
assertTrue(vat.getRetired());
assertNotNull(vat.getRetiredBy());
assertNotNull(vat.getDateRetired());
assertEquals("for testing", vat.getRetireReason());
}
/**
* @see VisitService#saveVisitAttributeType(VisitAttributeType)
*/
@Test
public void saveVisitAttributeType_shouldCreateANewVisitAttributeType() {
executeDataSet(VISITS_ATTRIBUTES_XML);
assertEquals(3, visitService.getAllVisitAttributeTypes().size());
VisitAttributeType vat = new VisitAttributeType();
vat.setName("Another one");
vat.setDatatypeClassname(FreeTextDatatype.class.getName());
visitService.saveVisitAttributeType(vat);
assertNotNull(vat.getId());
assertEquals(4, visitService.getAllVisitAttributeTypes().size());
}
/**
* @see VisitService#saveVisitAttributeType(VisitAttributeType)
*/
@Test
public void saveVisitAttributeType_shouldEditAnExistingVisitAttributeType() {
executeDataSet(VISITS_ATTRIBUTES_XML);
assertEquals(3, visitService.getAllVisitAttributeTypes().size());
VisitAttributeType vat = visitService.getVisitAttributeType(1);
vat.setName("A new name");
visitService.saveVisitAttributeType(vat);
assertEquals(3, visitService.getAllVisitAttributeTypes().size());
assertEquals("A new name", visitService.getVisitAttributeType(1).getName());
}
/**
* @see VisitService#unretireVisitAttributeType(VisitAttributeType)
*/
@Test
public void unretireVisitAttributeType_shouldUnretireARetiredVisitAttributeType() {
executeDataSet(VISITS_ATTRIBUTES_XML);
VisitAttributeType vat = visitService.getVisitAttributeType(2);
assertTrue(vat.getRetired());
assertNotNull(vat.getDateRetired());
assertNotNull(vat.getRetiredBy());
assertNotNull(vat.getRetireReason());
visitService.unretireVisitAttributeType(vat);
Assert.assertFalse(vat.getRetired());
Assert.assertNull(vat.getDateRetired());
Assert.assertNull(vat.getRetiredBy());
Assert.assertNull(vat.getRetireReason());
}
/**
* @see VisitService#getVisitAttributeByUuid(String)
*/
@Test
public void getVisitAttributeByUuid_shouldGetTheVisitAttributeWithTheGivenUuid() {
executeDataSet(VISITS_ATTRIBUTES_XML);
assertEquals("2011-04-25", visitService.getVisitAttributeByUuid("3a2bdb18-6faa-11e0-8414-001e378eb67e")
.getValueReference());
}
/**
* @see VisitService#getVisitAttributeByUuid(String)
*/
@Test
public void getVisitAttributeByUuid_shouldReturnNullIfNoVisitAttributeHasTheGivenUuid() {
executeDataSet(VISITS_ATTRIBUTES_XML);
Assert.assertNull(visitService.getVisitAttributeByUuid("not-a-uuid"));
}
/**
* @throws ParseException
* @see VisitService#getVisits(Collection,Collection,Collection,Collection,Date,Date,Date,Date,Map,boolean)
*/
@Test
public void getVisits_shouldGetAllVisitsWithGivenAttributeValues() throws ParseException {
executeDataSet(VISITS_ATTRIBUTES_XML);
Map<VisitAttributeType, Object> attrs = new HashMap<>();
attrs.put(visitService.getVisitAttributeType(1), new SimpleDateFormat("yyyy-MM-dd").parse("2011-04-25"));
List<Visit> visits = visitService.getVisits(null, null, null, null, null, null, null, null, attrs, true, false);
assertEquals(1, visits.size());
assertEquals(Integer.valueOf(1), visits.get(0).getVisitId());
}
/**
* @throws ParseException
* @see VisitService#getVisits(Collection,Collection,Collection,Collection,Date,Date,Date,Date,Map,boolean)
*/
@Test
public void getVisits_shouldNotFindAnyVisitsIfNoneHaveGivenAttributeValues() throws ParseException {
executeDataSet(VISITS_ATTRIBUTES_XML);
Map<VisitAttributeType, Object> attrs = new HashMap<>();
attrs.put(visitService.getVisitAttributeType(1), new SimpleDateFormat("yyyy-MM-dd").parse("1411-04-25"));
List<Visit> visits = visitService.getVisits(null, null, null, null, null, null, null, null, attrs, true, false);
assertEquals(0, visits.size());
}
/**
* @see VisitService#saveVisit(Visit)
*/
@Test(expected = APIException.class)
public void saveVisit_shouldFailIfValidationErrorsAreFound() {
VisitService vs = Context.getVisitService();
Visit visit = new Visit();
//Not setting the patient so that we get validation errors
visit.setVisitType(vs.getVisitType(1));
visit.setStartDatetime(new Date());
Context.getVisitService().saveVisit(visit);
}
/**
* @see VisitService#saveVisit(Visit)
*/
@Test
public void saveVisit_shouldPassIfNoValidationErrorsAreFound() {
VisitService vs = Context.getVisitService();
Visit visit = new Visit();
visit.setPatient(Context.getPatientService().getPatient(2));
visit.setVisitType(vs.getVisitType(1));
visit.setStartDatetime(new Date());
Context.getVisitService().saveVisit(visit);
}
/**
* @see VisitService#endVisit(Visit,Date)
*/
@Test
public void endVisit_shouldSetStopDateTimeAsCurrentDateIfStopDateIsNull() {
VisitService vs = Context.getVisitService();
Visit visit = vs.getVisit(1);
Assert.assertNull(visit.getStopDatetime());
vs.endVisit(visit, null);
assertNotNull(visit.getStopDatetime());
}
/**
* @see VisitService#endVisit(Visit,Date)
*/
@Test
public void endVisit_shouldNotFailIfNoValidationErrorsAreFound() {
VisitService vs = Context.getVisitService();
Visit visit = vs.getVisit(1);
vs.endVisit(visit, new Date());
}
/**
* @see VisitService#endVisit(Visit,Date)
*/
@Test(expected = APIException.class)
public void endVisit_shouldFailIfValidationErrorsAreFound() {
VisitService vs = Context.getVisitService();
Visit visit = vs.getVisit(1);
Calendar cal = Calendar.getInstance();
cal.setTime(visit.getStartDatetime());
cal.add(Calendar.DAY_OF_MONTH, -1);
vs.endVisit(visit, cal.getTime());
}
/**
* @see VisitService#purgeVisit(Visit)
*/
@Test(expected = APIException.class)
public void purgeVisit_shouldFailIfTheVisitHasEncountersAssociatedToIt() {
Visit visit = Context.getVisitService().getVisit(1);
Encounter e = Context.getEncounterService().getEncounter(3);
e.setVisit(visit);
Context.getEncounterService().saveEncounter(e);
//sanity check
assertTrue(Context.getEncounterService().getEncountersByVisit(visit, false).size() > 0);
Context.getVisitService().purgeVisit(visit);
}
/**
* @see VisitService#saveVisit(Visit)
*/
@Test
public void saveVisit_shouldBeAbleToAddAnAttributeToAVisit() {
Date now = new Date();
Visit visit = visitService.getVisit(1);
VisitAttributeType attrType = visitService.getVisitAttributeType(1);
VisitAttribute attr = new VisitAttribute();
attr.setAttributeType(attrType);
attr.setValue(now);
visit.addAttribute(attr);
visitService.saveVisit(visit);
assertEquals(new SimpleDateFormat("yyyy-MM-dd").format(now), attr.getValueReference());
}
@Test
public void shouldVoidASimpleAttribute() {
executeDataSet(VISITS_ATTRIBUTES_XML);
Visit visit = visitService.getVisit(1);
VisitAttributeType attrType = visitService.getVisitAttributeType(1);
List<VisitAttribute> attributes = visit.getActiveAttributes(attrType);
assertTrue(attributes.size() > 0);
VisitAttribute attribute = attributes.get(0);
attribute.setVoided(true);
visitService.saveVisit(visit);
assertNotNull(attribute.getVoidedBy());
assertNotNull(attribute.getDateVoided());
}
/**
* @see VisitService#stopVisits()
*/
@Test
public void stopVisits_shouldCloseAllUnvoidedActiveVisitMatchingTheSpecifiedVisitTypes() {
executeDataSet("org/openmrs/api/include/VisitServiceTest-includeVisitsAndTypeToAutoClose.xml");
String[] visitTypeNames = StringUtils.split(Context.getAdministrationService().getGlobalProperty(
OpenmrsConstants.GP_VISIT_TYPES_TO_AUTO_CLOSE), ",");
String openVisitsQuery = "SELECT visit_id FROM visit WHERE voided = 0 AND date_stopped IS NULL AND visit_type_id IN (SELECT visit_type_id FROM visit_type WHERE NAME IN ('"
+ StringUtils.join(visitTypeNames, "','") + "'))";
int activeVisitCount = Context.getAdministrationService().executeSQL(openVisitsQuery, true).size();
//sanity check
assertTrue("There should be some active visits for this test to be valid", activeVisitCount > 0);
//close any unvoided open visits
visitService.stopVisits(null);
activeVisitCount = Context.getAdministrationService().executeSQL(openVisitsQuery, true).size();
//all active unvoided visits should have been closed
assertTrue("Not all active unvoided vists were closed", activeVisitCount == 0);
}
/**
* @see VisitService#saveVisit(Visit)
*/
@Test
public void saveVisit_shouldSaveNewVisitWithEncountersSuccessfully() {
VisitService vs = Context.getVisitService();
Integer originalSize = vs.getAllVisits().size();
Visit visit = new Visit(new Patient(2), new VisitType(1), new Date());
Encounter encounter = Context.getEncounterService().getEncounter(4);
visit.addEncounter(encounter);
vs.saveVisit(visit);
int visitId = visit.getVisitId();
Context.flushSession();
Context.clearSession();
// reload the visit
visit = Context.getVisitService().getVisit(visitId);
assertNotNull(visit.getId());
assertNotNull(visit.getUuid());
assertNotNull(visit.getCreator());
assertNotNull(visit.getDateCreated());
assertEquals(originalSize + 1, vs.getAllVisits().size());
assertEquals(1, visit.getEncounters().size());
assertEquals(Integer.valueOf(4), ((Encounter) visit.getEncounters().toArray()[0]).getEncounterId());
}
/**
* @see VisitService#saveVisit(Visit)
*/
@Test
public void saveVisit_shouldAssociateEncounterWithVisitOnSaveEncounter() {
VisitService vs = Context.getVisitService();
Visit visit = vs.getVisit(1);
EncounterService es = Context.getEncounterService();
Encounter encounter = new Encounter();
encounter.setEncounterDatetime(new Date());
encounter.setPatient(visit.getPatient());
encounter.setLocation(visit.getLocation());
encounter.setEncounterType(es.getEncounterType(1));
visit.addEncounter(encounter);
Context.getEncounterService().saveEncounter(encounter);
Integer encounterId = encounter.getEncounterId();
Context.flushSession();
Context.clearSession();
// reload the visit
visit = Context.getVisitService().getVisit(1);
assertEquals(1, visit.getEncounters().size());
assertEquals(encounterId, ((Encounter) visit.getEncounters().toArray()[0]).getEncounterId());
}
/**
* @see VisitService#saveVisit(Visit)
*/
@Test(expected = TransientObjectException.class)
public void saveVisit_shouldNotPersistNewEncounter() {
VisitService vs = Context.getVisitService();
Visit visit = vs.getVisit(1);
Encounter encounter = new Encounter();
encounter.setEncounterDatetime(new Date());
encounter.setEncounterType(Context.getEncounterService().getEncounterType(1));
encounter.setPatient(visit.getPatient());
encounter.setLocation(visit.getLocation());
visit.addEncounter(encounter);
vs.saveVisit(visit);
Context.flushSession();
}
/**
* @see VisitService#getAllVisitTypes(boolean)
*/
@Test
public void getAllVisitTypes_shouldGetAllVisitTypesBasedOnIncludeRetiredFlag() {
VisitService visitService = Context.getVisitService();
List<VisitType> visitTypes = visitService.getAllVisitTypes(true);
assertEquals("get all visit types including retired", 3, visitTypes.size());
visitTypes = visitService.getAllVisitTypes(false);
assertEquals("get all visit types excluding retired", 2, visitTypes.size());
}
}