/* * Copyright (c) 2014. The Trustees of Indiana University. * * This version of the code is licensed under the MPL 2.0 Open Source license with additional * healthcare disclaimer. If the user is an entity intending to commercialize any application * that uses this code in a for-profit venture, please contact the copyright holder. */ package com.muzima.service; import com.muzima.api.model.Concept; import com.muzima.api.model.Encounter; import com.muzima.api.model.Observation; import com.muzima.api.model.Patient; import com.muzima.controller.ConceptController; import com.muzima.controller.ObservationController; import com.muzima.testSupport.CustomTestRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.robolectric.annotation.Config; import java.util.Date; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; @RunWith(CustomTestRunner.class) @Config(manifest = Config.NONE) public class ObservationParserUtilityTest { private ObservationParserUtility observationParserUtility; @Mock private ConceptController conceptController; @Mock private Patient patient; private String formDataUuid; @Before public void setUp() { initMocks(this); observationParserUtility = new ObservationParserUtility(conceptController); formDataUuid = "formDataUuid"; } @Test public void shouldCreateEncounterEntityWithAppropriateValues() throws Exception { Date encounterDateTime = new Date(); Encounter encounter = observationParserUtility.getEncounterEntity(encounterDateTime, patient,formDataUuid); assertTrue(encounter.getUuid().startsWith("encounterUuid")); assertThat(encounter.getEncounterType().getUuid(), is("encounterTypeForObservationsCreatedOnPhone")); assertThat(encounter.getProvider().getUuid(), is("providerForObservationsCreatedOnPhone")); assertThat(encounter.getEncounterDatetime(), is(encounterDateTime)); } @Test public void shouldCreateNewConceptEntityAndAddItToListIfNotInDB() throws Exception, ConceptController.ConceptFetchException, ConceptController.ConceptParseException { observationParserUtility = new ObservationParserUtility(conceptController); when(conceptController.getConceptByName("ConceptName")).thenReturn(null); Concept concept = observationParserUtility.getConceptEntity("id^ConceptName^mm"); assertThat(concept.getName(), is("ConceptName")); assertThat(concept.getConceptType().getName(), is("ConceptTypeCreatedOnThePhone")); assertThat(concept.isCreatedOnDevice(), is(true)); assertThat(observationParserUtility.getNewConceptList().size(), is(1)); } @Test public void shouldNotCreateNewConceptOrObservationForInvalidConceptName() throws Exception, ConceptController.ConceptFetchException { observationParserUtility = new ObservationParserUtility(conceptController); assertThat(observationParserUtility.getNewConceptList().size(), is(0)); } @Test public void shouldNotCreateConceptIfAlreadyExistsInDB() throws Exception, ConceptController.ConceptFetchException, ConceptController.ConceptParseException{ observationParserUtility = new ObservationParserUtility(conceptController); Concept mockConcept = mock(Concept.class); when(conceptController.getConceptByName("ConceptName")).thenReturn(mockConcept); Concept concept = observationParserUtility.getConceptEntity("id^ConceptName^mm"); assertThat(concept, is(mockConcept)); assertThat(concept.isCreatedOnDevice(), is(false)); assertThat(observationParserUtility.getNewConceptList().isEmpty(), is(true)); } @Test public void shouldCreateOnlyOneConceptForRepeatedConceptNames() throws Exception, ConceptController.ConceptFetchException, ConceptController.ConceptParseException{ observationParserUtility = new ObservationParserUtility(conceptController); when(conceptController.getConceptByName("ConceptName")).thenReturn(null); Concept concept1 = observationParserUtility.getConceptEntity("id^ConceptName^mm"); Concept concept2 = observationParserUtility.getConceptEntity("id^ConceptName^mm"); assertThat(concept1, is(concept2)); assertThat(concept1.isCreatedOnDevice(), is(true)); assertThat(concept2.isCreatedOnDevice(), is(true)); assertThat(observationParserUtility.getNewConceptList().size(), is(1)); } @Test public void shouldCreateNumericObservation() throws Exception, ConceptController.ConceptFetchException, ConceptController.ConceptParseException, ObservationController.ParseObservationException{ Concept concept = mock(Concept.class); when(concept.isNumeric()).thenReturn(true); when(concept.isCoded()).thenReturn(false); Observation observation = observationParserUtility.getObservationEntity(concept, "20.0"); assertThat(observation.getValueNumeric(), is(20.0)); assertTrue(observation.getUuid().startsWith("observationFromPhoneUuid")); } @Test public void shouldCreateValueCodedObsAndShouldAddItToNewConceptList() throws Exception, ConceptController.ConceptFetchException, ConceptController.ConceptParseException, ObservationController.ParseObservationException{ observationParserUtility = new ObservationParserUtility(conceptController); Concept concept = mock(Concept.class); when(concept.isNumeric()).thenReturn(false); when(concept.isCoded()).thenReturn(true); Observation observation = observationParserUtility.getObservationEntity(concept, "id^obs_value^mm"); assertThat(observation.getValueCoded(), is(notNullValue())); assertThat(observationParserUtility.getNewConceptList().size(), is(1)); } @Test public void shouldCreateObsWithStringForNonNumericNonCodedConcept() throws Exception, ConceptController.ConceptFetchException, ConceptController.ConceptParseException, ObservationController.ParseObservationException{ observationParserUtility = new ObservationParserUtility(conceptController); Concept concept = mock(Concept.class); when(concept.getName()).thenReturn("SomeConcept"); when(concept.isNumeric()).thenReturn(false); when(concept.isCoded()).thenReturn(false); Observation observation = observationParserUtility.getObservationEntity(concept, "someString"); assertThat(observation.getValueAsString(), is("someString")); } }