/*
* 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.module.reporting.query.encounter.evaluator;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.Encounter;
import org.openmrs.Patient;
import org.openmrs.api.context.Context;
import org.openmrs.contrib.testdata.TestDataManager;
import org.openmrs.module.reporting.common.DateUtil;
import org.openmrs.module.reporting.common.TestUtil;
import org.openmrs.module.reporting.common.TimeQualifier;
import org.openmrs.module.reporting.evaluation.context.EncounterEvaluationContext;
import org.openmrs.module.reporting.query.encounter.EncounterIdSet;
import org.openmrs.module.reporting.query.encounter.EncounterQueryResult;
import org.openmrs.module.reporting.query.encounter.definition.BasicEncounterQuery;
import org.openmrs.module.reporting.query.encounter.service.EncounterQueryService;
import org.openmrs.test.BaseModuleContextSensitiveTest;
import org.springframework.beans.factory.annotation.Autowired;
import static org.junit.Assert.assertThat;
import static org.openmrs.module.reporting.common.ReportingMatchers.hasExactlyIds;
public class BasicEncounterQueryEvaluatorTest extends BaseModuleContextSensitiveTest {
protected static final String XML_DATASET_PATH = "org/openmrs/module/reporting/include/";
protected static final String XML_REPORT_TEST_DATASET = "ReportTestDataset";
@Autowired
EncounterQueryService encounterQueryService;
@Autowired
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 {
Patient patient = data.randomPatient().save();
Encounter enc1 = data.randomEncounter().patient(patient).encounterDatetime("2013-08-09 10:10:10").save();
Encounter enc2 = data.randomEncounter().patient(patient).encounterDatetime("2013-08-10").save();
Encounter enc3 = data.randomEncounter().patient(patient).encounterDatetime("2013-08-10 09:09:09").save();
Encounter enc4 = data.randomEncounter().patient(patient).encounterDatetime("2013-08-10 10:10:10").save();
Encounter enc5 = data.randomEncounter().patient(patient).encounterDatetime("2013-08-11 10:10:10").save();
BasicEncounterQuery query = new BasicEncounterQuery();
query.setOnOrAfter(DateUtil.parseYmd("2013-08-10"));
query.setOnOrBefore(DateUtil.parseYmd("2013-08-10"));
EncounterEvaluationContext context = new EncounterEvaluationContext();
context.setBaseEncounters(new EncounterIdSet(enc1.getId(), enc2.getId(), enc4.getId(), enc5.getId())); // not 3
EncounterQueryResult result = encounterQueryService.evaluate(query, context);
assertThat(result, hasExactlyIds(enc2.getId(), enc4.getId())); // 3 is excluded, since it wasn't in base encounters
}
@Test
public void testShouldFilterByEncounterTypes() throws Exception {
Patient patient = data.randomPatient().save();
Encounter enc1 = data.randomEncounter().patient(patient).encounterType("Scheduled").save();
Encounter enc2 = data.randomEncounter().patient(patient).encounterType("Emergency").save();
Encounter enc3 = data.randomEncounter().patient(patient).encounterType("Emergency").save();
EncounterEvaluationContext context = new EncounterEvaluationContext();
context.setBaseEncounters(new EncounterIdSet(enc1.getId(), enc2.getId(), enc3.getId()));
BasicEncounterQuery query = new BasicEncounterQuery();
query.addEncounterType(Context.getEncounterService().getEncounterType("Scheduled"));
EncounterQueryResult result = encounterQueryService.evaluate(query, context);
assertThat(result, hasExactlyIds(enc1.getId()));
query.addEncounterType(Context.getEncounterService().getEncounterType("Emergency"));
result = encounterQueryService.evaluate(query, context);
assertThat(result, hasExactlyIds(enc1.getId(), enc2.getId(), enc3.getId()));
}
@Test
public void testShouldFilterByForms() throws Exception {
EncounterEvaluationContext context = new EncounterEvaluationContext();
context.setBaseEncounters(new EncounterIdSet(3,4,5,6,7,8,9));
BasicEncounterQuery query = new BasicEncounterQuery();
query.addForm(Context.getFormService().getForm("Intake Form"));
EncounterQueryResult result = encounterQueryService.evaluate(query, context);
assertThat(result, hasExactlyIds(3,4,5));
query.addForm(Context.getFormService().getForm("Basic Form"));
result = encounterQueryService.evaluate(query, context);
assertThat(result, hasExactlyIds(3,4,5,6,7,8,9));
}
@Test
public void testShouldFilterByLocations() throws Exception {
Patient patient = data.randomPatient().save();
Encounter enc1 = data.randomEncounter().patient(patient).location("Xanadu").save();
Encounter enc2 = data.randomEncounter().patient(patient).location("Never Never Land").save();
Encounter enc3 = data.randomEncounter().patient(patient).location("Never Never Land").save();
EncounterEvaluationContext context = new EncounterEvaluationContext();
context.setBaseEncounters(new EncounterIdSet(enc1.getId(), enc2.getId(), enc3.getId()));
BasicEncounterQuery query = new BasicEncounterQuery();
query.addLocation(Context.getLocationService().getLocation("Xanadu"));
EncounterQueryResult result = encounterQueryService.evaluate(query, context);
assertThat(result, hasExactlyIds(enc1.getId()));
query.addLocation(Context.getLocationService().getLocation("Never Never Land"));
result = encounterQueryService.evaluate(query, context);
assertThat(result, hasExactlyIds(enc1.getId(), enc2.getId(), enc3.getId()));
}
@Test
public void testShouldFilterByWhich() throws Exception {
Patient patient1 = data.randomPatient().save();
Encounter enc1 = data.randomEncounter().encounterDatetime("2014-01-01").patient(patient1).save();
Encounter enc2 = data.randomEncounter().encounterDatetime("2014-02-01").patient(patient1).save();
Encounter enc3 = data.randomEncounter().encounterDatetime("2014-03-01").patient(patient1).save();
Patient patient2 = data.randomPatient().save();
Encounter enc4 = data.randomEncounter().encounterDatetime("2014-04-01").patient(patient2).save();
EncounterEvaluationContext context = new EncounterEvaluationContext();
context.setBaseEncounters(new EncounterIdSet(enc1.getId(), enc2.getId(), enc3.getId(), enc4.getId()));
{
BasicEncounterQuery query = new BasicEncounterQuery();
query.setWhich(TimeQualifier.LAST);
query.setWhichNumber(2);
EncounterQueryResult result = encounterQueryService.evaluate(query, context);
assertThat(result, hasExactlyIds(enc2.getId(), enc3.getId(), enc4.getId()));
}
{
BasicEncounterQuery query = new BasicEncounterQuery();
query.setWhich(TimeQualifier.FIRST);
query.setWhichNumber(1);
EncounterQueryResult result = encounterQueryService.evaluate(query, context);
assertThat(result, hasExactlyIds(enc1.getId(), enc4.getId()));
}
{
BasicEncounterQuery query = new BasicEncounterQuery();
query.setWhich(TimeQualifier.FIRST);
EncounterQueryResult result = encounterQueryService.evaluate(query, context);
assertThat(result, hasExactlyIds(enc1.getId(), enc4.getId()));
}
{
BasicEncounterQuery query = new BasicEncounterQuery();
EncounterQueryResult result = encounterQueryService.evaluate(query, context);
assertThat(result, hasExactlyIds(enc1.getId(), enc2.getId(), enc3.getId(), enc4.getId()));
}
}
}