package org.openmrs.module.reporting.query.obs.evaluator;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.Concept;
import org.openmrs.Encounter;
import org.openmrs.Obs;
import org.openmrs.Patient;
import org.openmrs.api.ConceptService;
import org.openmrs.contrib.testdata.TestDataManager;
import org.openmrs.module.reporting.common.DateUtil;
import org.openmrs.module.reporting.common.ReportingMatchers;
import org.openmrs.module.reporting.common.TestUtil;
import org.openmrs.module.reporting.evaluation.EvaluationContext;
import org.openmrs.module.reporting.query.obs.ObsQueryResult;
import org.openmrs.module.reporting.query.obs.definition.BasicObsQuery;
import org.openmrs.module.reporting.query.obs.service.ObsQueryService;
import org.openmrs.test.BaseModuleContextSensitiveTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import static org.junit.Assert.assertThat;
public class BasicObsQueryEvaluatorTest extends BaseModuleContextSensitiveTest {
protected static final String XML_DATASET_PATH = "org/openmrs/module/reporting/include/";
protected static final String XML_REPORT_TEST_DATASET = "ReportTestDataset";
@Autowired
ObsQueryService obsQueryService;
@Autowired @Qualifier("conceptService")
ConceptService conceptService;
@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 {
Concept someConcept = conceptService.getConcept(5089);
Patient patient = data.randomPatient().save();
Encounter enc1 = data.randomEncounter().patient(patient).encounterDatetime("2013-08-09 10:10:10").save();
Obs beforeTimePeriod = data.obs().person(patient).concept(someConcept).encounter(enc1).value(10).save();
Encounter enc2 = data.randomEncounter().patient(patient).encounterDatetime("2013-8-10 10:10:10").save();
Obs firstDayOfTimePeriod = data.obs().person(patient).concept(someConcept).encounter(enc2).value(10).save();
Encounter enc3 = data.randomEncounter().patient(patient).encounterDatetime("2013-8-11 10:10:10").save();
Obs middleOfTimePeriod = data.obs().person(patient).concept(someConcept).encounter(enc3).value(10).save();
Encounter enc4 = data.randomEncounter().patient(patient).encounterDatetime("2013-8-15 10:10:10").save();
Obs lastDayOfTimePeriod = data.obs().person(patient).concept(someConcept).encounter(enc4).value(10).save();
Encounter enc5 = data.randomEncounter().patient(patient).encounterDatetime("2013-8-17 10:10:10").save();
Obs afterTimePeriod = data.obs().person(patient).concept(someConcept).encounter(enc5).value(10).save();
BasicObsQuery query = new BasicObsQuery();
query.setOnOrAfter(DateUtil.parseDate("2013-08-10", "yyyy-MM-dd"));
query.setOnOrBefore(DateUtil.parseDate("2013-08-15", "yyyy-MM-dd"));
query.addConcept(someConcept);
ObsQueryResult result = obsQueryService.evaluate(query, new EvaluationContext());
assertThat(result, ReportingMatchers.hasExactlyIds(firstDayOfTimePeriod.getId(), middleOfTimePeriod.getId(),
lastDayOfTimePeriod.getId()));
}
}