/**
* 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 static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.Cohort;
import org.openmrs.Concept;
import org.openmrs.Obs;
import org.openmrs.api.ObsService;
import org.openmrs.api.PatientSetService;
import org.openmrs.api.context.Context;
import org.openmrs.reporting.ObsPatientFilter;
import org.openmrs.reporting.PatientFilter;
import org.openmrs.reporting.PatientSearch;
import org.openmrs.reporting.SearchArgument;
import org.openmrs.test.BaseContextSensitiveTest;
import org.openmrs.util.OpenmrsUtil;
/**
*
*/
public class PatientSearchTest extends BaseContextSensitiveTest {
/**
* Set up the database with the initial dataset before every test method in this class.
*/
@Before
public void runBeforeEachTest() throws Exception {
executeDataSet("org/openmrs/report/include/PatientSearchTest.xml");
}
/**
* TODO: Make this use asserts instead of printing to stdout
*
* @throws Exception
*/
@Test
public void shouldParameters() throws Exception {
ObsService obsService = Context.getObsService();
// set the date of the first obs to be within the range of the param
// (This date is outside of the "default" value, but inside the set value)
Calendar inRange = new GregorianCalendar();
inRange.add(Calendar.DATE, -45);
Obs firstObs = obsService.getObs(1);
firstObs.setObsDatetime(inRange.getTime());
obsService.saveObs(firstObs, "Creating obs");
// set the date of the second obs to be OUT of the range of the param
Calendar outOfRange = new GregorianCalendar();
outOfRange.add(Calendar.DATE, -95);
Obs secondObs = obsService.getObs(2);
secondObs.setObsDatetime(outOfRange.getTime());
obsService.saveObs(secondObs, "Creating obs");
// flush (commit) these changes to the database
// commenting this out because junit4 doesn't seem to care
//commitTransaction(true);
Map<Parameter, Object> globalParamValues = new HashMap<Parameter, Object>();
{
Parameter p = new Parameter("howManyDays", "How many days?", Integer.class, 30);
globalParamValues.put(p, 60);
}
PatientSearch search = new PatientSearch();
{
search.setFilterClass(ObsPatientFilter.class);
List<SearchArgument> args = new ArrayList<SearchArgument>();
args.add(new SearchArgument("timeModifier", "ANY", PatientSetService.TimeModifier.class));
// using NEW CD4 COUNT in patientSearchTest.xml because CD4 COUNT exists in standardDataSet.xml
args.add(new SearchArgument("question", Context.getConceptService().getConceptByName("NEW CD4 COUNT")
.getConceptId().toString(), Concept.class));
args.add(new SearchArgument("withinLastDays", "${howManyDays}", Integer.class));
search.setArguments(args);
}
EvaluationContext ec = new EvaluationContext();
for (Map.Entry<Parameter, Object> e : globalParamValues.entrySet())
ec.addParameterValue(e.getKey(), e.getValue());
for (Parameter p : search.getParameters()) {
ec.addParameterValue(search, p, ec.evaluateExpression(p.getDefaultValue().toString()));
}
PatientFilter filterToRun = OpenmrsUtil.toPatientFilter(search, null, ec);
Cohort result = filterToRun.filter(Context.getPatientSetService().getAllPatients(), ec);
//System.out.println("results is " + result.size());
assertEquals(1, result.size());
// make sure it was the patient#2 that was selected (the patient for the first obs)
assertTrue(result.getMemberIds().contains(2));
}
}