package org.openmrs.module.reporting.data.encounter.evaluator;
import org.junit.Test;
import org.openmrs.Cohort;
import org.openmrs.Encounter;
import org.openmrs.EncounterRole;
import org.openmrs.Patient;
import org.openmrs.Provider;
import org.openmrs.User;
import org.openmrs.api.EncounterService;
import org.openmrs.api.ProviderService;
import org.openmrs.contrib.testdata.TestDataManager;
import org.openmrs.module.reporting.data.encounter.EvaluatedEncounterData;
import org.openmrs.module.reporting.data.encounter.definition.EncounterProviderDataDefinition;
import org.openmrs.module.reporting.data.encounter.service.EncounterDataService;
import org.openmrs.module.reporting.evaluation.EvaluationContext;
import org.openmrs.module.reporting.evaluation.EvaluationException;
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.Date;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.junit.Assert.assertThat;
public class EncounterProviderDataEvaluatorTest extends BaseModuleContextSensitiveTest {
@Autowired
private TestDataManager data;
@Autowired
@Qualifier("encounterService")
private EncounterService encounterService;
@Autowired
@Qualifier("providerService")
private ProviderService providerService;
@Autowired
private EncounterDataService encounterDataService;
@Test
public void shouldReturnEncounterProviderForEncounter() throws Exception {
EncounterRole role = encounterService.getEncounterRole(1);
Provider provider = saveRandomProvider();
Patient patient = data.randomPatient().save();
Encounter enc = data.randomEncounter().patient(patient)
.encounterDatetime(new Date())
.provider(role, provider)
.save();
EncounterProviderDataDefinition d = new EncounterProviderDataDefinition();
d.setEncounterRole(role);
EncounterEvaluationContext encounterEvaluationContext = new EncounterEvaluationContext();
encounterEvaluationContext.setBaseEncounters(new EncounterIdSet(enc.getId()));
EvaluatedEncounterData ed = encounterDataService.evaluate(d, encounterEvaluationContext);
assertThat(ed.getData().size(), is(1));
assertThat((Provider) ed.getData().get(enc.getId()), is(provider));
}
@Test
public void shouldReturnEncounterProvidersForEncounter() throws Exception {
EncounterRole role1 = encounterService.getEncounterRole(1);
EncounterRole role2 = new EncounterRole();
role2.setName("some role");
encounterService.saveEncounterRole(role2);
Provider provider1 = saveRandomProvider();
Provider provider2 = saveRandomProvider();
Provider provider3 = saveRandomProvider();
Patient patient = data.randomPatient().save();
Encounter enc = data.randomEncounter().patient(patient)
.encounterDatetime(new Date())
.provider(role1, provider1)
.provider(role2, provider2)
.provider(role1, provider3)
.save();
EncounterProviderDataDefinition d = new EncounterProviderDataDefinition();
d.setEncounterRole(role1);
d.setSingleProvider(false);
EncounterEvaluationContext encounterEvaluationContext = new EncounterEvaluationContext();
encounterEvaluationContext.setBaseEncounters(new EncounterIdSet(enc.getId()));
EvaluatedEncounterData ed = encounterDataService.evaluate(d, encounterEvaluationContext);
assertThat(ed.getData().size(), is(1));
assertThat((List<Provider>) ed.getData().get(enc.getId()),
containsInAnyOrder(provider1, provider3));
}
@Test
public void shouldReturnAllEncounterProvidersForEncounterIfNoRoleSpecified() throws Exception {
EncounterRole role1 = encounterService.getEncounterRole(1);
EncounterRole role2 = new EncounterRole();
role2.setName("some role");
encounterService.saveEncounterRole(role2);
Provider provider1 = saveRandomProvider();
Provider provider2 = saveRandomProvider();
Provider provider3 = saveRandomProvider();
Patient patient = data.randomPatient().save();
Encounter enc = data.randomEncounter().patient(patient)
.encounterDatetime(new Date())
.provider(role1, provider1)
.provider(role2, provider2)
.provider(role1, provider3)
.save();
EncounterProviderDataDefinition d = new EncounterProviderDataDefinition();
d.setSingleProvider(false);
EncounterEvaluationContext encounterEvaluationContext = new EncounterEvaluationContext();
encounterEvaluationContext.setBaseEncounters(new EncounterIdSet(enc.getId()));
EvaluatedEncounterData ed = encounterDataService.evaluate(d, encounterEvaluationContext);
assertThat(ed.getData().size(), is(1));
assertThat((List<Provider>) ed.getData().get(enc.getId()),
containsInAnyOrder(provider1, provider2, provider3));
}
@Test
public void shouldIgnoredVoidedEncounterProviders() throws Exception {
EncounterRole role1 = encounterService.getEncounterRole(1);
EncounterRole role2 = new EncounterRole();
role2.setName("some role");
encounterService.saveEncounterRole(role2);
Provider provider1 = saveRandomProvider();
Provider provider2 = saveRandomProvider();
Provider provider3 = saveRandomProvider();
Patient patient = data.randomPatient().save();
Encounter enc = data.randomEncounter().patient(patient)
.encounterDatetime(new Date())
.provider(role1, provider1)
.provider(role2, provider2)
.provider(role1, provider3)
.save();
// void a provider
enc.removeProvider(role1, provider3);
encounterService.saveEncounter(enc);
EncounterProviderDataDefinition d = new EncounterProviderDataDefinition();
d.setEncounterRole(role1);
d.setSingleProvider(false);
EncounterEvaluationContext encounterEvaluationContext = new EncounterEvaluationContext();
encounterEvaluationContext.setBaseEncounters(new EncounterIdSet(enc.getId()));
EvaluatedEncounterData ed = encounterDataService.evaluate(d, encounterEvaluationContext);
assertThat(ed.getData().size(), is(1));
assertThat((List<Provider>) ed.getData().get(enc.getId()),
containsInAnyOrder(provider1));
}
@Test(expected = EvaluationException.class)
public void shouldFailIfEncounterRoleParameterSetToAnotherType() throws Exception {
EncounterProviderDataDefinition d = new EncounterProviderDataDefinition();
d.setEncounterRole(new User());
d.setSingleProvider(false);
EncounterEvaluationContext encounterEvaluationContext = new EncounterEvaluationContext();
EvaluatedEncounterData ed = encounterDataService.evaluate(d, encounterEvaluationContext);
}
@Test
public void shouldReturnEncounterProviderForEncounterWhenInPatientContext() throws Exception {
EncounterRole role = encounterService.getEncounterRole(1);
Provider provider = saveRandomProvider();
Patient patient = data.randomPatient().save();
Encounter enc = data.randomEncounter().patient(patient)
.encounterDatetime(new Date())
.provider(role, provider)
.save();
EncounterProviderDataDefinition d = new EncounterProviderDataDefinition();
d.setEncounterRole(role);
EvaluationContext context = new EvaluationContext();
context.setBaseCohort(new Cohort(patient.getId().toString()));
EvaluatedEncounterData ed = encounterDataService.evaluate(d, context);
assertThat(ed.getData().size(), is(1));
assertThat((Provider) ed.getData().get(enc.getId()), is(provider));
}
@Test
public void shouldReturnEmptySetIfInputSetEmpty() throws Exception {
EncounterRole role = encounterService.getEncounterRole(1);
EncounterProviderDataDefinition d = new EncounterProviderDataDefinition();
d.setEncounterRole(role);
EvaluationContext context = new EvaluationContext();
context.setBaseCohort(new Cohort());
EvaluatedEncounterData ed = encounterDataService.evaluate(d, context);
assertThat(ed.getData().size(), is(0));
}
private Provider saveRandomProvider() {
Patient p = data.randomPatient().save();
return data.randomProvider().person(p).save();
}
}