/** * 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.handler; import static org.apache.commons.lang3.time.DateUtils.parseDate; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.junit.Test; import org.openmrs.Cohort; import org.openmrs.CohortMembership; import org.openmrs.Encounter; import org.openmrs.Order; import org.openmrs.Patient; import org.openmrs.User; import org.openmrs.api.CohortService; import org.openmrs.api.EncounterService; import org.openmrs.api.OrderService; import org.openmrs.api.context.Context; import org.openmrs.parameter.EncounterSearchCriteria; import org.openmrs.parameter.EncounterSearchCriteriaBuilder; import org.openmrs.test.BaseContextSensitiveTest; import org.openmrs.test.TestUtil; /** * Contains the tests for the {@link PatientDataUnvoidHandler} */ public class PatientDataUnvoidHandlerTest extends BaseContextSensitiveTest { private static final String COHORT_XML = "org/openmrs/api/include/CohortServiceTest-cohort.xml"; /** * @see PatientDataUnvoidHandler#handle(Patient,User,Date,String) */ @Test public void handle_shouldUnvoidTheOrdersAndEncountersAssociatedWithThePatient() { Patient patient = Context.getPatientService().getPatient(7); patient = Context.getPatientService().voidPatient(patient, "Void Reason"); assertTrue(patient.getVoided()); EncounterService es = Context.getEncounterService(); EncounterSearchCriteria encounterSearchCriteria = new EncounterSearchCriteriaBuilder() .setPatient(patient) .setIncludeVoided(true) .createEncounterSearchCriteria(); List<Encounter> encounters = es.getEncounters(encounterSearchCriteria); assertTrue(CollectionUtils.isNotEmpty(encounters)); //all encounters void related fields should be null for (Encounter encounter : encounters) { assertTrue(encounter.getVoided()); assertNotNull(encounter.getDateVoided()); assertNotNull(encounter.getVoidedBy()); assertNotNull(encounter.getVoidReason()); } OrderService os = Context.getOrderService(); List<Order> orders = os.getAllOrdersByPatient(patient); assertFalse(orders.isEmpty()); //all order void related fields should be null for (Order order : orders) { assertTrue(order.getVoided()); assertNotNull(order.getDateVoided()); assertNotNull(order.getVoidedBy()); assertNotNull(order.getVoidReason()); } User user = Context.getUserService().getUser(1); new PatientDataUnvoidHandler().handle(patient, user, patient.getDateVoided(), null); //check that the voided related fields were set null for (Encounter encounter : encounters) { assertFalse(encounter.getVoided()); assertNull(encounter.getDateVoided()); assertNull(encounter.getVoidedBy()); assertNull(encounter.getVoidReason()); } for (Order order : orders) { assertFalse(order.getVoided()); assertNull(order.getDateVoided()); assertNull(order.getVoidedBy()); assertNull(order.getVoidReason()); } } /** * @see PatientDataUnvoidHandler#handle(Patient,User,Date,String) */ @Test public void handle_shouldNotUnvoidTheOrdersAndEncountersThatNeverGotVoidedWithThePatient() { executeDataSet("org/openmrs/api/include/OrderServiceTest-otherEncounters.xml"); Patient patient = Context.getPatientService().getPatient(7); EncounterService es = Context.getEncounterService(); OrderService os = Context.getOrderService(); Encounter testEncounter = es.getEncountersByPatient(patient).get(0); //santy checks assertFalse(testEncounter.getVoided()); assertNull(testEncounter.getDateVoided()); assertNull(testEncounter.getVoidedBy()); assertNull(testEncounter.getVoidReason()); //void one of the encounter orders be voided at a different time for testing purposes assertFalse(testEncounter.getOrders().isEmpty()); Order testOrder = testEncounter.getOrders().iterator().next(); assertFalse(testOrder.getVoided()); Context.getOrderService().voidOrder(testOrder, "testing"); assertTrue(testOrder.getVoided()); TestUtil.waitForClockTick(); //void one of the unvoided encounters for testing purposes es.voidEncounter(testEncounter, "random reason"); assertTrue(testEncounter.getVoided()); assertTrue(testOrder.getVoided()); List<Patient> patients = new ArrayList<>(); patients.add(patient); //wait a bit so that the patient isn't voided on the same millisecond TestUtil.waitForClockTick(); //now void the patient for testing purposes patient = Context.getPatientService().voidPatient(patient, "Void Reason"); assertTrue(patient.getVoided()); new PatientDataUnvoidHandler().handle(patient, patient.getVoidedBy(), patient.getDateVoided(), null); //the encounter that was initially voided separately should still be voided testEncounter = es.getEncounter(testEncounter.getId()); assertTrue(testEncounter.getVoided()); assertNotNull(testEncounter.getDateVoided()); assertNotNull(testEncounter.getVoidedBy()); assertNotNull(testEncounter.getVoidReason()); //the order that was initially voided separately should still be voided assertTrue(testOrder.getVoided()); assertNotNull(testOrder.getDateVoided()); assertNotNull(testOrder.getVoidedBy()); assertNotNull(testOrder.getVoidReason()); } /** * @verifies unvoid the members associated with the patient * @see PatientDataUnvoidHandler#handle(Patient,User,Date,String) */ @Test public void handle_shouldUnvoidMembersAssociatedWithThePatient() throws Exception { executeDataSet(COHORT_XML); CohortService cs = Context.getCohortService(); Cohort cohort = cs.getCohort(2); CohortMembership otherMembership = cohort.getMemberships().iterator().next(); Patient patient = Context.getPatientService().getPatient(7); CohortMembership membership = new CohortMembership(patient.getPatientId()); membership.setStartDate(parseDate("2001-01-01", "yyyy-MM-dd")); membership.setEndDate(parseDate("2001-12-31", "yyyy-MM-dd")); cohort.addMembership(membership); cs.saveCohort(cohort); patient = Context.getPatientService().voidPatient(patient, "Void Reason"); assertTrue(membership.getVoided()); assertFalse(otherMembership.getVoided()); Context.getPatientService().unvoidPatient(patient); assertFalse(membership.getVoided()); assertNull(membership.getDateVoided()); assertNull(membership.getVoidedBy()); assertNull(membership.getVoidReason()); } }