package org.openmrs.module.reporting.query.visit.evaluator;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.Patient;
import org.openmrs.Visit;
import org.openmrs.api.VisitService;
import org.openmrs.contrib.testdata.TestDataManager;
import org.openmrs.module.reporting.common.DateUtil;
import org.openmrs.module.reporting.common.DurationUnit;
import org.openmrs.module.reporting.common.TestUtil;
import org.openmrs.module.reporting.evaluation.context.VisitEvaluationContext;
import org.openmrs.module.reporting.query.visit.VisitQueryResult;
import org.openmrs.module.reporting.query.visit.definition.ActiveVisitQuery;
import org.openmrs.module.reporting.query.visit.service.VisitQueryService;
import org.openmrs.test.BaseModuleContextSensitiveTest;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.junit.Assert.assertThat;
public class ActiveVisitQueryEvaluatorTest extends BaseModuleContextSensitiveTest {
protected static final String XML_DATASET_PATH = "org/openmrs/module/reporting/include/";
protected static final String XML_REPORT_TEST_DATASET = "ReportTestDataset";
@Autowired
private VisitQueryService service;
@Autowired
private VisitService visitService;
@Autowired
private TestDataManager data;
@Before
public void setup() throws Exception {
executeDataSet(XML_DATASET_PATH + new TestUtil().getTestDatasetFilename(XML_REPORT_TEST_DATASET));
}
@Test
public void testEvaluate() throws Exception {
Date someTimeYesterday = DateUtil.adjustDate(new Date(), -1, DurationUnit.DAYS);
Date startOfYesterday = DateUtil.getStartOfDay(someTimeYesterday);
Date endOfYesterday = DateUtil.getEndOfDay(someTimeYesterday);
// there are some active visits in the dataset already
List<Integer> activeVisits = new ArrayList<Integer>();
activeVisits.add(1);
activeVisits.add(2);
activeVisits.add(3);
activeVisits.add(4);
activeVisits.add(5);
// now we will create a couple inactive visits, and two active ones
Patient patient1 = data.randomPatient().save();
Patient patient2 = data.randomPatient().save();
data.visit().patient(patient1).visitType(1).location(1).started("2013-04-05").stopped("2013-04-06").save();
data.visit().patient(patient2).visitType(1).location(1).started("2013-04-05").stopped("2013-04-06").save();
Visit active1 = data.visit().patient(patient1).visitType(1).location(1).started(startOfYesterday).stopped(endOfYesterday).save();
Visit active2 = data.visit().patient(patient2).visitType(1).location(1).started(startOfYesterday).save();
activeVisits.add(active1.getId());
activeVisits.add(active2.getId());
ActiveVisitQuery query = new ActiveVisitQuery();
query.setAsOfDate(someTimeYesterday);
VisitQueryResult result = service.evaluate(query, new VisitEvaluationContext());
assertThat(result.getMemberIds(), containsInAnyOrder(activeVisits.toArray()));
}
}