/**
* 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.db.hibernate;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import org.hibernate.SessionFactory;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.Person;
import org.openmrs.api.context.Context;
import org.openmrs.test.BaseContextSensitiveTest;
import org.openmrs.util.GlobalPropertiesTestHelper;
import org.openmrs.util.OpenmrsConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HibernatePersonDAOTest extends BaseContextSensitiveTest {
private final static Logger log = LoggerFactory.getLogger(HibernatePersonDAOTest.class);
private final static String PEOPLE_FROM_THE_SHIRE_XML = "org/openmrs/api/db/hibernate/include/HibernatePersonDAOTest-people.xml";
private SessionFactory sessionFactory;
private HibernatePersonDAO hibernatePersonDAO;
private PersonAttributeHelper personAttributeHelper;
private GlobalPropertiesTestHelper globalPropertiesTestHelper;
@Before
public void getPersonDAO() {
executeDataSet(PEOPLE_FROM_THE_SHIRE_XML);
updateSearchIndex();
hibernatePersonDAO = (HibernatePersonDAO) applicationContext.getBean("personDAO");
sessionFactory = (SessionFactory) applicationContext.getBean("sessionFactory");
personAttributeHelper = new PersonAttributeHelper(sessionFactory);
globalPropertiesTestHelper = new GlobalPropertiesTestHelper(Context.getAdministrationService());
}
private void logPeople(List<Person> people) {
for (Person person : people) {
logPerson(person);
}
}
private void logPerson(Person person) {
StringBuilder builder = new StringBuilder();
builder.append("class=").append(person.getClass().getCanonicalName()).append(", person=").append(person.toString())
.append(", person.names=").append(person.getNames().toString()).append(", person.attributes=").append(
person.getAttributes().toString());
log.debug(builder.toString());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetNoOneByNull() {
List<Person> people = hibernatePersonDAO.getPeople(null, false);
logPeople(people);
Assert.assertEquals(0, people.size());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetEveryOneExceptVoidedByEmptyString() {
List<Person> people = hibernatePersonDAO.getPeople("", false);
logPeople(people);
// PEOPLE_FROM_THE_SHIRE_XML contains 7 people but more people are defined in the standard test data set
Assert.assertTrue(people.size() >= 7);
// assert that all 7 people from PEOPLE_FROM_THE_SHIRE_XML (who are neither dead nor voided) are retrieved
assertPeopleContainPersonID(people, 42);
assertPeopleContainPersonID(people, 43);
assertPeopleContainPersonID(people, 44);
assertPeopleContainPersonID(people, 45);
assertPeopleContainPersonID(people, 46);
assertPeopleContainPersonID(people, 47);
assertPeopleContainPersonID(people, 48);
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean, Boolean)
*/
@Test
public void getPeople_shouldGetEveryOneByEmptyStringIncludingVoided() {
List<Person> people = hibernatePersonDAO.getPeople("", false, true);
logPeople(people);
assertPeopleContainPersonID(people, 42);
assertPeopleContainPersonID(people, 43);
assertPeopleContainPersonID(people, 44);
assertPeopleContainPersonID(people, 45);
assertPeopleContainPersonID(people, 46);
assertPeopleContainPersonID(people, 47);
assertPeopleContainPersonID(people, 48);
assertPeopleContainPersonID(people, 50);
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean, Boolean)
*/
@Test
public void getPeople_shouldNotGetVoided() {
List<Person> people = hibernatePersonDAO.getPeople("", false, false);
logPeople(people);
for (Person p : people)
Assert.assertFalse(p.getVoided());
}
private void assertPeopleContainPersonID(List<Person> people, Integer personID) {
for (Person person : people) {
if (person.getId() == personID) {
return;
}
}
Assert.fail("list of people does not contain person with ID = " + personID);
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetNoOneByNonexistingAttribute() {
Assert.assertFalse(personAttributeHelper.personAttributeExists("Wizard"));
List<Person> people = hibernatePersonDAO.getPeople("Wizard", false);
logPeople(people);
Assert.assertEquals(0, people.size());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetNoOneByNonsearchableAttribute() {
Assert.assertTrue(personAttributeHelper.nonSearchablePersonAttributeExists("Porridge with honey"));
List<Person> people = hibernatePersonDAO.getPeople("Porridge honey", false);
logPeople(people);
Assert.assertEquals(0, people.size());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetNoOneByVoidedAttribute() {
Assert.assertTrue(personAttributeHelper.voidedPersonAttributeExists("Master thief"));
List<Person> people = hibernatePersonDAO.getPeople("Master thief", false);
logPeople(people);
Assert.assertEquals(0, people.size());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetOnePersonByAttribute() {
globalPropertiesTestHelper.setGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_PERSON_ATTRIBUTE_SEARCH_MATCH_MODE,
OpenmrsConstants.GLOBAL_PROPERTY_PERSON_ATTRIBUTE_SEARCH_MATCH_ANYWHERE);
Assert.assertTrue(personAttributeHelper.personAttributeExists("Story teller"));
List<Person> people = hibernatePersonDAO.getPeople("Story Teller", false);
logPeople(people);
Assert.assertEquals(1, people.size());
Assert.assertEquals("Bilbo Odilon", people.get(0).getGivenName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetOnePersonByRandomCaseAttribute() {
globalPropertiesTestHelper.setGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_PERSON_ATTRIBUTE_SEARCH_MATCH_MODE,
OpenmrsConstants.GLOBAL_PROPERTY_PERSON_ATTRIBUTE_SEARCH_MATCH_ANYWHERE);
Assert.assertTrue(personAttributeHelper.personAttributeExists("Story teller"));
List<Person> people = hibernatePersonDAO.getPeople("sToRy TeLlEr", false);
logPeople(people);
Assert.assertEquals(1, people.size());
Assert.assertEquals("Bilbo Odilon", people.get(0).getGivenName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetOnePersonBySearchingForAMixOfAttributeAndVoidedAttribute() {
globalPropertiesTestHelper.setGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_PERSON_ATTRIBUTE_SEARCH_MATCH_MODE,
OpenmrsConstants.GLOBAL_PROPERTY_PERSON_ATTRIBUTE_SEARCH_MATCH_ANYWHERE);
Assert.assertTrue(personAttributeHelper.personAttributeExists("Story teller"));
Assert.assertFalse(personAttributeHelper.voidedPersonAttributeExists("Story teller"));
Assert.assertTrue(personAttributeHelper.voidedPersonAttributeExists("Master thief"));
List<Person> people = hibernatePersonDAO.getPeople("Story Thief", false);
logPeople(people);
Assert.assertEquals(1, people.size());
Assert.assertEquals("Bilbo Odilon", people.get(0).getGivenName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetMultiplePeopleBySingleAttribute() {
globalPropertiesTestHelper.setGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_PERSON_ATTRIBUTE_SEARCH_MATCH_MODE,
OpenmrsConstants.GLOBAL_PROPERTY_PERSON_ATTRIBUTE_SEARCH_MATCH_ANYWHERE);
Assert.assertTrue(personAttributeHelper.personAttributeExists("Senior ring bearer"));
List<Person> people = hibernatePersonDAO.getPeople("Senior ring bearer", false);
logPeople(people);
Assert.assertEquals(2, people.size());
Assert.assertEquals("Baggins", people.get(0).getFamilyName());
Assert.assertEquals("Baggins", people.get(1).getFamilyName());
Assert.assertFalse(people.get(0).getGivenName().equalsIgnoreCase(people.get(1).getGivenName()));
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetMultiplePeopleByMultipleAttributes() {
globalPropertiesTestHelper.setGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_PERSON_ATTRIBUTE_SEARCH_MATCH_MODE,
OpenmrsConstants.GLOBAL_PROPERTY_PERSON_ATTRIBUTE_SEARCH_MATCH_ANYWHERE);
Assert.assertTrue(personAttributeHelper.personAttributeExists("Senior ring bearer"));
Assert.assertTrue(personAttributeHelper.personAttributeExists("Story teller"));
List<Person> people = hibernatePersonDAO.getPeople("Story Bearer", false);
logPeople(people);
Assert.assertEquals(2, people.size());
Assert.assertEquals("Baggins", people.get(0).getFamilyName());
Assert.assertEquals("Baggins", people.get(1).getFamilyName());
Assert.assertFalse(people.get(0).getGivenName().equalsIgnoreCase(people.get(1).getGivenName()));
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetNoOneByNonexistingName() {
List<Person> people = hibernatePersonDAO.getPeople("Gandalf", false);
logPeople(people);
Assert.assertEquals(0, people.size());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetOnePersonByName() {
List<Person> people = hibernatePersonDAO.getPeople("Bilbo", false);
logPeople(people);
Assert.assertEquals(1, people.size());
Assert.assertEquals("Bilbo Odilon", people.get(0).getGivenName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetOnePersonByRandomCaseName() {
List<Person> people = hibernatePersonDAO.getPeople("fRoDo", false);
logPeople(people);
Assert.assertEquals(1, people.size());
Assert.assertEquals("Frodo Ansilon", people.get(0).getGivenName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetMultiplePeopleBySingleName() {
List<Person> people = hibernatePersonDAO.getPeople("Baggins", false);
logPeople(people);
Assert.assertEquals(2, people.size());
Assert.assertEquals("Baggins", people.get(0).getFamilyName());
Assert.assertEquals("Baggins", people.get(1).getFamilyName());
Assert.assertFalse(people.get(0).getGivenName().equalsIgnoreCase(people.get(1).getGivenName()));
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetMultiplePeopleByMultipleNames() {
List<Person> people = hibernatePersonDAO.getPeople("Bilbo Frodo", false);
logPeople(people);
Assert.assertEquals(2, people.size());
Assert.assertEquals("Baggins", people.get(0).getFamilyName());
Assert.assertEquals("Baggins", people.get(1).getFamilyName());
Assert.assertFalse(people.get(0).getGivenName().equalsIgnoreCase(people.get(1).getGivenName()));
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetNoOneByNonexistingNameAndNonexistingAttribute() {
Assert.assertFalse(personAttributeHelper.personAttributeExists("Wizard"));
List<Person> people = hibernatePersonDAO.getPeople("Gandalf Wizard", false);
logPeople(people);
Assert.assertEquals(0, people.size());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetNoOneByNonexistingNameAndNonsearchableAttribute() {
Assert.assertTrue(personAttributeHelper.nonSearchablePersonAttributeExists("Mushroom pie"));
List<Person> people = hibernatePersonDAO.getPeople("Gandalf Mushroom pie", false);
logPeople(people);
Assert.assertEquals(0, people.size());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetNoOneByNonexistingNameAndVoidedAttribute() {
Assert.assertTrue(personAttributeHelper.voidedPersonAttributeExists("Master Thief"));
List<Person> people = hibernatePersonDAO.getPeople("Gandalf Master Thief", false);
logPeople(people);
Assert.assertEquals(0, people.size());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetOnePersonByNameAndAttribute() {
Assert.assertTrue(personAttributeHelper.personAttributeExists("Story teller"));
List<Person> people = hibernatePersonDAO.getPeople("Bilbo Story Teller", false);
logPeople(people);
Assert.assertEquals(1, people.size());
Assert.assertEquals("Bilbo Odilon", people.get(0).getGivenName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetOnePersonByNameAndVoidedAttribute() {
Assert.assertTrue(personAttributeHelper.voidedPersonAttributeExists("Master Thief"));
List<Person> people = hibernatePersonDAO.getPeople("Frodo Master Thief", false);
logPeople(people);
Assert.assertEquals(1, people.size());
Assert.assertEquals("Frodo Ansilon", people.get(0).getGivenName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetMultiplePeopleByNameAndAttribute() {
List<Person> people = hibernatePersonDAO
.getPeople(
"Bilbo Baggins Story Teller Master Thief Porridge Honey Frodo Baggins Ring Bearer Mushroom Pie Gandalf Wizard Beer",
false);
logPeople(people);
Assert.assertEquals(2, people.size());
Assert.assertEquals("Baggins", people.get(0).getFamilyName());
Assert.assertEquals("Baggins", people.get(1).getFamilyName());
Assert.assertFalse(people.get(0).getGivenName().equalsIgnoreCase(people.get(1).getGivenName()));
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetOnePersonByGivenName() {
List<Person> people = hibernatePersonDAO.getPeople("bravo", false);
logPeople(people);
Assert.assertEquals(1, people.size());
Assert.assertEquals("bravo", people.get(0).getGivenName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetMultiplePeopleByGivenName() {
List<Person> people = hibernatePersonDAO.getPeople("alpha", false);
logPeople(people);
Assert.assertEquals(2, people.size());
Assert.assertEquals("alpha", people.get(0).getGivenName());
Assert.assertEquals("alpha", people.get(1).getGivenName());
Assert.assertTrue(people.get(0).getMiddleName() != people.get(1).getMiddleName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetOnePersonByMiddleName() {
List<Person> people = hibernatePersonDAO.getPeople("echo", false);
logPeople(people);
Assert.assertEquals(1, people.size());
Assert.assertEquals("echo", people.get(0).getMiddleName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetMultiplePeopleByMiddleName() {
List<Person> people = hibernatePersonDAO.getPeople("foxtrot", false);
logPeople(people);
Assert.assertEquals(2, people.size());
Assert.assertEquals("foxtrot", people.get(0).getMiddleName());
Assert.assertEquals("foxtrot", people.get(1).getMiddleName());
Assert.assertTrue(people.get(0).getFamilyName() != people.get(1).getFamilyName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetOnePersonByFamilyName() {
List<Person> people = hibernatePersonDAO.getPeople("lima", false);
logPeople(people);
Assert.assertEquals(1, people.size());
Assert.assertEquals("lima", people.get(0).getFamilyName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetMultiplePeopleByFamilyName() {
List<Person> people = hibernatePersonDAO.getPeople("kilo", false);
logPeople(people);
Assert.assertEquals(2, people.size());
Assert.assertEquals("kilo", people.get(0).getFamilyName());
Assert.assertEquals("kilo", people.get(1).getFamilyName());
Assert.assertTrue(people.get(0).getGivenName() != people.get(1).getGivenName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetOnePersonByFamilyName2() {
List<Person> people = hibernatePersonDAO.getPeople("mike", false);
logPeople(people);
Assert.assertEquals(1, people.size());
Assert.assertEquals("alpha", people.get(0).getGivenName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetMultiplePeopleByFamilyName2() {
List<Person> people = hibernatePersonDAO.getPeople("papa", false);
logPeople(people);
Assert.assertEquals(2, people.size());
Assert.assertEquals("papa", people.get(0).getPersonName().getFamilyName2());
Assert.assertEquals("papa", people.get(1).getPersonName().getFamilyName2());
Assert.assertTrue(people.get(0).getFamilyName() != people.get(1).getFamilyName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetOnePersonByMultipleNameParts() {
List<Person> people = hibernatePersonDAO.getPeople("echo india mike", false);
logPeople(people);
Assert.assertEquals(1, people.size());
Assert.assertEquals("alpha", people.get(0).getGivenName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetMultiplePeopleByMultipleNameParts() {
List<Person> people = hibernatePersonDAO.getPeople("bravo delta golf juliet mike ", false);
logPeople(people);
Assert.assertEquals(5, people.size());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetNoOneByVoidedName() {
List<Person> people = hibernatePersonDAO.getPeople("voided-delta", false);
logPeople(people);
Assert.assertEquals(0, people.size());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean, Boolean)
*/
@Test
public void getPeople_shouldGetVoidedByVoidedNameWhenVoidedIsTrue() {
List<Person> people = hibernatePersonDAO.getPeople("voided-bravo", false, true);
logPeople(people);
Assert.assertEquals(1, people.size());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldNotGetVoidedPerson() {
List<Person> people = hibernatePersonDAO.getPeople("voided-bravo", false);
logPeople(people);
Assert.assertEquals(0, people.size());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldNotGetDeadPerson() {
List<Person> people = hibernatePersonDAO.getPeople("dead-charlie", false);
logPeople(people);
Assert.assertEquals(0, people.size());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetSingleDeadPerson() {
List<Person> people = hibernatePersonDAO.getPeople("dead-charlie", true);
logPeople(people);
Assert.assertEquals(1, people.size());
Assert.assertEquals("dead-charlie", people.get(0).getGivenName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldGetMultipleDeadPeople() {
List<Person> people = hibernatePersonDAO.getPeople("dead-papa", true);
logPeople(people);
Assert.assertEquals(2, people.size());
Assert.assertEquals("dead-papa", people.get(0).getPersonName().getFamilyName2());
Assert.assertEquals("dead-papa", people.get(1).getPersonName().getFamilyName2());
Assert.assertTrue(people.get(0).getFamilyName() != people.get(1).getFamilyName());
}
/**
* @see HibernatePersonDAO#getPeople(String, Boolean)
*/
@Test
public void getPeople_shouldObeyAttributeMatchMode() {
// exact match mode
long patientCount = hibernatePersonDAO.getPeople("337-4820", false).size();
Assert.assertEquals(1, patientCount);
patientCount = hibernatePersonDAO.getPeople("337", false).size();
Assert.assertEquals(0, patientCount);
globalPropertiesTestHelper.setGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_PERSON_ATTRIBUTE_SEARCH_MATCH_MODE,
OpenmrsConstants.GLOBAL_PROPERTY_PERSON_ATTRIBUTE_SEARCH_MATCH_ANYWHERE);
patientCount = hibernatePersonDAO.getPeople("337", false).size();
Assert.assertEquals(1, patientCount);
}
@Test
public void savePerson_shouldSavePersonWithBirthDateTime() throws ParseException {
Person person = new Person();
person.setBirthtime(new SimpleDateFormat("HH:mm:ss").parse("15:23:56"));
person.setBirthdate(new SimpleDateFormat("yyyy-MM-dd").parse("2012-05-29"));
person.setDead(false);
person.setVoided(false);
person.setBirthdateEstimated(false);
person.setId(345);
hibernatePersonDAO.savePerson(person);
Person savedPerson = hibernatePersonDAO.getPerson(345);
Assert.assertEquals(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-05-29 15:23:56"), savedPerson.getBirthDateTime());
}
}