package org.openmrs.module.reporting.dataset.definition.evaluator;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
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.TestUtil;
import org.openmrs.module.reporting.data.obs.definition.ObsIdDataDefinition;
import org.openmrs.module.reporting.dataset.DataSet;
import org.openmrs.module.reporting.dataset.DataSetRow;
import org.openmrs.module.reporting.dataset.definition.ObsDataSetDefinition;
import org.openmrs.module.reporting.query.obs.definition.BasicObsQuery;
import org.openmrs.test.BaseModuleContextSensitiveTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ObsDataSetEvaluatorTest 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 ObsDataSetEvaluator evaluator;
@Autowired
private TestDataManager data;
@Autowired
@Qualifier("conceptService")
private ConceptService conceptService;
@Before
public void setup() throws Exception {
executeDataSet(XML_DATASET_PATH + new TestUtil().getTestDatasetFilename(XML_REPORT_TEST_DATASET));
}
@Test
public void testBasicEvaluation() throws Exception {
// pick a concept that has no existing obs in the test dataset
Concept concept = conceptService.getConcept(10002);
Concept valueCoded = conceptService.getConcept(792);
Patient patient = data.randomPatient().save();
Encounter enc = data.randomEncounter().patient(patient).save();
Obs obs1 = data.obs().concept(concept).value(valueCoded).encounter(enc).save();
Obs obs2 = data.obs().concept(concept).value(valueCoded).encounter(enc).save();
ObsDataSetDefinition dsd = new ObsDataSetDefinition();
BasicObsQuery query = new BasicObsQuery();
query.addConcept(concept);
dsd.addRowFilter(query, null);
ObsIdDataDefinition definition = new ObsIdDataDefinition();
dsd.addColumn("ids", definition, null, null);
DataSet dataSet = evaluator.evaluate(dsd, null);
List<Integer> results = new ArrayList<Integer>();
Iterator<DataSetRow> i = dataSet.iterator();
while (i.hasNext()) {
results.add((Integer) i.next().getColumnValue("ids"));
}
assertThat(results.size(), is(2));
assertThat(results, containsInAnyOrder(obs1.getId(), obs2.getId()));
}
}