/*
* 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.view.forms;
import com.muzima.MuzimaApplication;
import com.muzima.api.model.FormData;
import com.muzima.api.model.Patient;
import com.muzima.controller.ConceptController;
import com.muzima.controller.FormController;
import com.muzima.controller.ObservationController;
import com.muzima.controller.PatientController;
import com.muzima.service.FormParser;
import com.muzima.utils.Constants;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.text.ParseException;
import static com.muzima.utils.Constants.FORM_DISCRIMINATOR_REGISTRATION;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
@RunWith(RobolectricTestRunner.class)
@Config(manifest= Config.NONE)
public class FormDataStoreTest {
private FormController controller;
private FormWebViewActivity activity;
private FormData formData;
private FormDataStore store;
@Mock
private FormParser formParser;
private MuzimaApplication muzimaApplication;
private ObservationController obsController;
@Before
public void setUp() throws Exception {
initMocks(this);
controller = mock(FormController.class);
activity = mock(FormWebViewActivity.class);
formData = new FormData();
formData.setPatientUuid("adasdssd");
muzimaApplication = mock(MuzimaApplication.class);
obsController = mock(ObservationController.class);
when(muzimaApplication.getObservationController()).thenReturn(obsController);
when(activity.getApplicationContext()).thenReturn(muzimaApplication);
store = new FormDataStore(activity, controller, formData){
@Override
public FormParser getFormParser() {
return formParser;
}
};
}
@Test
public void save_shouldSaveFormDataWithStatus() throws Exception, FormController.FormDataSaveException {
store.save("data", "xmldata", "status");
verify(controller).saveFormData(formData);
verify(activity).finish();
assertThat(formData.getJsonPayload(), is("data"));
assertThat(formData.getStatus(), is("status"));
}
@Test
public void save_shouldNotFinishTheActivityIfThereIsAnExceptionWhileSaving() throws Exception, FormController.FormDataSaveException {
doThrow(new FormController.FormDataSaveException(null)).when(controller).saveFormData(formData);
when(activity.getString(anyInt())).thenReturn("success");
store.save("data", "xmldata", "status");
verify(activity, times(0)).finish();
}
@Test
public void getFormPayload_shouldGetTheFormDataPayload() throws Exception {
formData.setJsonPayload("payload");
assertThat(store.getFormPayload(), is("payload"));
}
@Test
public void shouldCreateANewPatientAndStoreHisUUIDAsPatientUUID() throws Exception {
String tempUUIDAssignedByDevice = "newUUID";
formData.setPatientUuid(null);
formData.setDiscriminator(FORM_DISCRIMINATOR_REGISTRATION);
Patient patient = new Patient();
patient.setUuid(tempUUIDAssignedByDevice);
when(controller.createNewPatient("data")).thenReturn(patient);
store.save("data", "xmlData", "complete");
assertThat(formData.getXmlPayload(), is("xmlData"));
assertThat(formData.getPatientUuid(), is(tempUUIDAssignedByDevice));
}
@Test
public void shouldParseObservationsInProvidedPayloadWhenSavingAsFinal() throws ConceptController.ConceptSaveException,
ParseException, XmlPullParserException, PatientController.PatientLoadException,ConceptController.ConceptFetchException,
ConceptController.ConceptParseException, IOException, ObservationController.ParseObservationException {
String xmlPayload = "xmldata";
store.save("data", xmlPayload, Constants.STATUS_COMPLETE);
verify(formParser).parseAndSaveObservations(xmlPayload,formData.getUuid());
}
@Test
public void shouldNotParseObservationsForIncompleteForm() throws ConceptController.ConceptSaveException, ParseException,
XmlPullParserException, PatientController.PatientLoadException, ConceptController.ConceptFetchException,
ConceptController.ConceptParseException, ObservationController.ParseObservationException, IOException {
store.save("data", "xmldata", Constants.STATUS_INCOMPLETE);
verify(formParser, times(0)).parseAndSaveObservations(anyString(),anyString());
}
}