package org.openmrs.module.reporting.data.encounter.evaluator; import org.junit.Before; import org.junit.Test; import org.openmrs.Cohort; import org.openmrs.Concept; import org.openmrs.Encounter; import org.openmrs.Obs; import org.openmrs.Patient; import org.openmrs.api.ConceptService; import org.openmrs.api.EncounterService; import org.openmrs.contrib.testdata.TestDataManager; import org.openmrs.module.reporting.common.TestUtil; import org.openmrs.module.reporting.data.encounter.EvaluatedEncounterData; import org.openmrs.module.reporting.data.encounter.definition.ObsForEncounterDataDefinition; import org.openmrs.module.reporting.data.encounter.service.EncounterDataService; import org.openmrs.module.reporting.evaluation.EvaluationContext; import org.openmrs.module.reporting.evaluation.context.EncounterEvaluationContext; import org.openmrs.module.reporting.query.encounter.EncounterIdSet; import org.openmrs.test.BaseModuleContextSensitiveTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import java.util.List; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; public class ObsForEncounterEvaluatorTest 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 TestDataManager data; @Autowired @Qualifier("conceptService") private ConceptService conceptService; @Autowired @Qualifier("encounterService") private EncounterService encounterService; @Autowired private EncounterDataService encounterDataService; /** * Run this before each unit test in this class. The "@Before" method in * {@link org.openmrs.test.BaseContextSensitiveTest} is run right before this method. * * @throws Exception */ @Before public void setup() throws Exception { executeDataSet(XML_DATASET_PATH + new TestUtil().getTestDatasetFilename(XML_REPORT_TEST_DATASET)); } @Test public void testEvaluateForSingleObs() throws Exception { Concept weight = conceptService.getConcept(5089); Concept cd4 = conceptService.getConcept(5497); // create an obs with a few members Patient patient = data.randomPatient().save(); Encounter enc1 = data.randomEncounter().patient(patient).save(); Obs obs1 = data.obs().concept(weight).value(60).encounter(enc1).save(); Obs obs2 = data.obs().concept(cd4).value(350).encounter(enc1).save(); EncounterEvaluationContext context = new EncounterEvaluationContext(); context.setBaseEncounters(new EncounterIdSet(enc1.getId())); ObsForEncounterDataDefinition def = new ObsForEncounterDataDefinition(); def.setQuestion(weight); def.setSingleObs(true); EvaluatedEncounterData results = encounterDataService.evaluate(def, context); assertThat(results.getData().size(), is(1)); assertThat((Obs) results.getData().get(enc1.getId()), is(obs1)); } @Test public void testEvaluateForMultipleObs() throws Exception { Concept weight = conceptService.getConcept(5089); // create an obs with a few members Patient patient = data.randomPatient().save(); Encounter enc1 = data.randomEncounter().patient(patient).save(); Obs obs1 = data.obs().concept(weight).value(60).encounter(enc1).save(); Obs obs2 = data.obs().concept(weight).value(62).encounter(enc1).save(); EncounterEvaluationContext context = new EncounterEvaluationContext(); context.setBaseEncounters(new EncounterIdSet(enc1.getId())); ObsForEncounterDataDefinition def = new ObsForEncounterDataDefinition(); def.setQuestion(weight); def.setSingleObs(false); EvaluatedEncounterData results = encounterDataService.evaluate(def, context); assertThat(results.getData().size(), is(1)); assertThat(((List<Obs>) results.getData().get(enc1.getId())).size(), is(2)); assertThat(((List<Obs>) results.getData().get(enc1.getId())), containsInAnyOrder(obs1, obs2)); } @Test public void testMakeSureEmptySingleEntryEvenIfNoMatchingObsInGroup() throws Exception { Concept weight = conceptService.getConcept(5089); Concept cd4 = conceptService.getConcept(5497); // create an obs with a few members Patient patient = data.randomPatient().save(); Encounter enc1 = data.randomEncounter().patient(patient).save(); Obs obs1 = data.obs().concept(weight).value(60).encounter(enc1).save(); // add another encounter with no obs Encounter enc2 = data.randomEncounter().patient(patient).save(); EncounterEvaluationContext context = new EncounterEvaluationContext(); context.setBaseEncounters(new EncounterIdSet(enc1.getId(), enc2.getId())); ObsForEncounterDataDefinition def = new ObsForEncounterDataDefinition(); def.setQuestion(weight); def.setSingleObs(true); EvaluatedEncounterData results = encounterDataService.evaluate(def, context); assertThat((Obs) results.getData().get(enc1.getId()), is(obs1)); assertNull(results.getData().get(enc2.getId())); } @Test public void testMakeSureEmptyListEntryEvenIfNoMatchingObsInGroup() throws Exception { Concept weight = conceptService.getConcept(5089); // create an obs with a few members Patient patient = data.randomPatient().save(); Encounter enc1 = data.randomEncounter().patient(patient).save(); Obs obs1 = data.obs().concept(weight).value(60).encounter(enc1).save(); Obs obs2 = data.obs().concept(weight).value(60).encounter(enc1).save(); // add another encounter with no obs Encounter enc2 = data.randomEncounter().patient(patient).save(); EncounterEvaluationContext context = new EncounterEvaluationContext(); context.setBaseEncounters(new EncounterIdSet(enc1.getId(), enc2.getId())); ObsForEncounterDataDefinition def = new ObsForEncounterDataDefinition(); def.setQuestion(weight); def.setSingleObs(false); EvaluatedEncounterData results = encounterDataService.evaluate(def, context); assertThat(((List<Obs>) results.getData().get(enc1.getId())).size(), is(2)); assertThat(((List<Obs>) results.getData().get(enc1.getId())), containsInAnyOrder(obs1, obs2)); assertNull(results.getData().get(enc2.getId())); } @Test public void testEvaluateForSingleObsWhenInPatientContext() throws Exception { Concept weight = conceptService.getConcept(5089); Concept cd4 = conceptService.getConcept(5497); // create an obs with a few members Patient patient = data.randomPatient().save(); Encounter enc1 = data.randomEncounter().patient(patient).save(); Obs obs1 = data.obs().concept(weight).value(60).encounter(enc1).save(); Obs obs2 = data.obs().concept(cd4).value(350).encounter(enc1).save(); // set a cohort, not a set of encounter ids EvaluationContext context = new EvaluationContext(); context.setBaseCohort(new Cohort(patient.getId().toString())); ObsForEncounterDataDefinition def = new ObsForEncounterDataDefinition(); def.setQuestion(weight); def.setSingleObs(true); EvaluatedEncounterData results = encounterDataService.evaluate(def, context); assertThat(results.getData().size(), is(1)); assertThat((Obs) results.getData().get(enc1.getId()), is(obs1)); } @Test public void testShouldReturnEmptySetWhenInputSetIsEmpty() throws Exception { Concept weight = conceptService.getConcept(5089); EncounterEvaluationContext context = new EncounterEvaluationContext(); context.setBaseEncounters(new EncounterIdSet()); ObsForEncounterDataDefinition def = new ObsForEncounterDataDefinition(); def.setQuestion(weight); def.setSingleObs(true); EvaluatedEncounterData results = encounterDataService.evaluate(def, context); assertThat(results.getData().size(), is(0)); } }