PatientSearchParameterTest.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.report;

import static org.junit.Assert.assertEquals;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
import org.openmrs.api.context.Context;
import org.openmrs.reporting.PatientSearch;
import org.openmrs.reporting.PatientSearchReportObject;
import org.openmrs.test.BaseContextSensitiveTest;

/**
 * Tests backwards compatibility with org.openmrs.reporting.* framework with the new
 * org.openmrs.cohort.*
 */
public class PatientSearchParameterTest extends BaseContextSensitiveTest {
	
	private static Log log = LogFactory.getLog(PatientSearchParameterTest.class);
	
	protected static final String INITIAL_REPORT_OBJECTS_XML = "org/openmrs/report/include/PatientSearchParameterTest.xml";
	
	/**
	 * Tests {@link PatientSearch#getParameters()} to see if parameter names evaluate to a value
	 * determined in an EvaluationContext 1. Create PatientSearch, add SearchArguments as
	 * Parameters, and persist in the database. 2. Create an EvaluationContext to assign values to
	 * the PatientSearch Parameters 3. Retrieve the PatientSearch from the database and test if its
	 * Parameters evaluate to the EvaluationContext Parameter values.
	 * 
	 * @throws Exception
	 */
	@Test
	public void shouldPatientSearchParameter() throws Exception {
		executeDataSet(INITIAL_REPORT_OBJECTS_XML);
		
		// test variables
		String testName = "Dr. Giffy";
		String salutation = "Hello";
		Date today = new Date();
		// DateFormat used in EvaluationContext
		DateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd");
		
		// create a PatientSearch
		PatientSearch ps = new PatientSearch();
		List<Object> parsedComposition = new ArrayList<Object>();
		parsedComposition.add(Integer.valueOf(1));
		parsedComposition.add(Integer.valueOf(2));
		parsedComposition.add(Integer.valueOf(3));
		ps.setParsedComposition(parsedComposition);
		
		// Either add a PatientSearch Parameter with dollar sign included as below ... or
		ps.addParameter(new Parameter("${test.name}", "TestName", String.class, null));
		ps.addParameter(new Parameter("${test.salutation}", "TestSalutation", String.class, null));
		ps.addParameter(new Parameter("${test.date}", "TestDate", Date.class, null));
		
		// ... or add PatientSearch SearchArgument with dollar sign included as below    	  
		//ps.addArgument("TestName", "${test.name}", String.class);
		//ps.addArgument("TestSalutation", "${test.salutation}", String.class);
		//ps.addArgument("TestDate", "${test.date}", String.class);
		
		// Save the PatientSearch in the database
		PatientSearchReportObject ro = new PatientSearchReportObject();
		ro.setName("testReportObject1");
		ro.setDescription("OldCohortFrameworkTest testPatientSearchParameter");
		ro.setPatientSearch(ps);
		Integer newId = Context.getReportObjectService().saveReportObject(ro).getReportObjectId();
		
		// Create an EvaluationContext with the test variables as parameters
		EvaluationContext context = new EvaluationContext();
		// EvaluationContext Parameter must *not* use the dollar sign.
		context.addParameterValue(new Parameter("test.name", "TestName", String.class, "WrongName"), testName);
		context.addParameterValue(new Parameter("test.salutation", "TestSalutation", String.class, "WrongSalutation"),
		    salutation);
		context.addParameterValue(new Parameter("test.date", "TestDate", java.util.Date.class, "WrongDate"), today);
		
		// Retrieve the PatientSearch from the database
		PatientSearch ps2 = ((PatientSearchReportObject) Context.getReportObjectService().getReportObject(newId))
		        .getPatientSearch();
		
		// Test if the PatientSearch parameters evaluate to the test variable values
		List<Parameter> parameters = ps2.getParameters();
		for (Parameter p : parameters) {
			if ("TestName".equals(p.getLabel())) {
				assertEquals(testName, context.evaluateExpression(ps2.getArgumentValue(p.getName())).toString());
				log.info("Testing Parameters: " + context.evaluateExpression(p.getName()).toString() + " " + testName);
			} else if ("TestSalutation".equals(p.getLabel())) {
				assertEquals(salutation, context.evaluateExpression(ps2.getArgumentValue(p.getName())).toString());
				log.info("Testing Parameters: " + context.evaluateExpression(p.getName()).toString() + " " + salutation);
			} else if ("TestDate".equals(p.getLabel())) {
				assertEquals(df.format(today), df.format((Date) context
				        .evaluateExpression(ps2.getArgumentValue(p.getName()))));
				log.info("Testing Parameters: " + context.evaluateExpression(p.getName()).toString() + " "
				        + df.format(today));
			} else {
				log.info("Testing Parameters: " + context.evaluateExpression(p.getName()).toString() + " " + p.getName());
			}
		}
	}
	
}