PatientDataUnvoidHandlerTest.java

/**
 * The contents of this file are subject to the OpenMRS Public License
 * Version 1.0 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://license.openmrs.org
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations
 * under the License.
 *
 * Copyright (C) OpenMRS, LLC.  All Rights Reserved.
 */
package org.openmrs.api.handler;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.junit.Assert;
import org.junit.Test;
import org.openmrs.Encounter;
import org.openmrs.Order;
import org.openmrs.Patient;
import org.openmrs.User;
import org.openmrs.api.EncounterService;
import org.openmrs.api.OrderService;
import org.openmrs.api.context.Context;
import org.openmrs.test.BaseContextSensitiveTest;
import org.openmrs.test.TestUtil;
import org.openmrs.test.Verifies;

/**
 * Contains the tests for the {@link PatientDataUnvoidHandler}
 */
public class PatientDataUnvoidHandlerTest extends BaseContextSensitiveTest {
	
	/**
	 * @see {@link PatientDataUnvoidHandler#handle(Patient,User,Date,String)}
	 */
	@Test
	@Verifies(value = "should unvoid the orders and encounters associated with the patient", method = "handle(Patient,User,Date,String)")
	public void handle_shouldUnvoidTheOrdersAndEncountersAssociatedWithThePatient() throws Exception {
		Patient patient = Context.getPatientService().getPatient(7);
		OrderService os = Context.getOrderService();
		List<Patient> patients = new ArrayList<Patient>();
		patients.add(patient);
		//should have some un voided orders
		Assert.assertTrue(CollectionUtils
		        .isNotEmpty(os.getOrders(Order.class, patients, null, null, null, null, null, null)));
		
		patient = Context.getPatientService().voidPatient(patient, "Void Reason");
		Assert.assertTrue(patient.isVoided());
		//all orders should have been voided
		Assert.assertTrue(CollectionUtils.isEmpty(os.getOrders(Order.class, patients, null, null, null, null, null, null)));
		
		EncounterService es = Context.getEncounterService();
		List<Encounter> encounters = es.getEncounters(patient, null, null, null, null, null, null, null, null, true);
		Assert.assertTrue(CollectionUtils.isNotEmpty(encounters));
		//all encounters void related fields should be null
		for (Encounter encounter : encounters) {
			Assert.assertTrue(encounter.isVoided());
			Assert.assertNotNull(encounter.getDateVoided());
			Assert.assertNotNull(encounter.getVoidedBy());
			Assert.assertNotNull(encounter.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) {
			Assert.assertFalse(encounter.isVoided());
			Assert.assertNull(encounter.getDateVoided());
			Assert.assertNull(encounter.getVoidedBy());
			Assert.assertNull(encounter.getVoidReason());
		}
		
		List<Order> orders = os.getOrders(Order.class, patients, null, null, null, null, null, null);
		for (Order order : orders) {
			Assert.assertFalse(order.isVoided());
			Assert.assertNull(order.getDateVoided());
			Assert.assertNull(order.getVoidedBy());
			Assert.assertNull(order.getVoidReason());
		}
	}
	
	/**
	 * @see {@link PatientDataUnvoidHandler#handle(Patient,User,Date,String)}
	 */
	@Test
	@Verifies(value = "should not unvoid the orders and encounters that never got voided with the patient", method = "handle(Patient,User,Date,String)")
	public void handle_shouldNotUnvoidTheOrdersAndEncountersThatNeverGotVoidedWithThePatient() throws Exception {
		Patient patient = Context.getPatientService().getPatient(7);
		
		EncounterService es = Context.getEncounterService();
		OrderService os = Context.getOrderService();
		
		//void one of the unvoided encounters for testing purposes
		Encounter testEncounter = es.getEncountersByPatient(patient).get(0);
		//santy checks
		Assert.assertNotNull(testEncounter);
		Assert.assertNull(testEncounter.getDateVoided());
		Assert.assertNull(testEncounter.getVoidedBy());
		Assert.assertNull(testEncounter.getVoidReason());
		
		es.voidEncounter(testEncounter, "random reason");
		Assert.assertTrue(testEncounter.isVoided());
		
		//void one of the unvoided orders for testing purposes
		Order testOrder = os.getOrdersByPatient(patient).get(0);
		Assert.assertNotNull(testOrder);
		Assert.assertNull(testOrder.getDateVoided());
		Assert.assertNull(testOrder.getVoidedBy());
		Assert.assertNull(testOrder.getVoidReason());
		
		os.voidOrder(testOrder, "random reason");
		Assert.assertTrue(testOrder.isVoided());
		
		//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");
		Assert.assertTrue(patient.isVoided());
		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());
		Assert.assertTrue(testEncounter.isVoided());
		Assert.assertNotNull(testEncounter.getDateVoided());
		Assert.assertNotNull(testEncounter.getVoidedBy());
		Assert.assertNotNull(testEncounter.getVoidReason());
		
		//the order that was initially voided separately should still be voided
		Assert.assertTrue(testOrder.isVoided());
		Assert.assertNotNull(testOrder.getDateVoided());
		Assert.assertNotNull(testOrder.getVoidedBy());
		Assert.assertNotNull(testOrder.getVoidReason());
		
	}
}