/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs.api;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Vector;
import org.apache.commons.collections.ListUtils;
import org.junit.Assert;
import org.junit.Test;
import org.openmrs.Concept;
import org.openmrs.Field;
import org.openmrs.FieldType;
import org.openmrs.Form;
import org.openmrs.FormField;
import org.openmrs.FormResource;
import org.openmrs.GlobalProperty;
import org.openmrs.Obs;
import org.openmrs.api.context.Context;
import org.openmrs.obs.SerializableComplexObsHandler;
import org.openmrs.test.BaseContextSensitiveTest;
import org.openmrs.util.DateUtil;
import org.openmrs.util.OpenmrsConstants;
/**
* TODO clean up and finish this test for all methods in FormService
*
* @see FormService
*/
public class FormServiceTest extends BaseContextSensitiveTest {
protected static final String INITIAL_FIELDS_XML = "org/openmrs/api/include/FormServiceTest-initialFieldTypes.xml";
protected static final String FORM_FIELDS_XML = "org/openmrs/api/include/FormServiceTest-formFields.xml";
protected static final String MULTIPLE_FORMS_FORM_FIELDS_XML = "org/openmrs/api/include/FormServiceTest-multipleForms-formFields.xml";
protected static final String FORM_SAMPLE_RESOURCE = "org/openmrs/api/include/FormServiceTest-sampleResource.xslt";
/**
* Creates then updates a form FIXME Break this test case into separate tests
*
* @throws Exception
*/
@Test
public void shouldFormCreateUpdateDelete() {
FormService formService = Context.getFormService();
//testing Form creation
Form form1 = new Form();
String name1 = "form name1";
String version1 = "1.0";
String descript1 = "descript1";
form1.setName(name1);
form1.setVersion(version1);
form1.setDescription(descript1);
formService.saveForm(form1);
//testing get form
Form form2 = formService.getForm(form1.getFormId());
String name2 = "form name2";
String version2 = "2.0";
String descript2 = "descript2";
form2.setName(name2);
form2.setVersion(version2);
form2.setDescription(descript2);
formService.saveForm(form2);
//testing correct updation
Form form3 = formService.getForm(form2.getFormId());
assertTrue(form1.equals(form3));
assertTrue(form3.getName().equals(name2));
assertTrue(form3.getVersion().equals(version2));
assertTrue(form3.getDescription().equals(descript2));
//testing (un)retiration
formService.retireForm(form2, "reason");
assertTrue(form2.getRetired());
assertTrue(form2.getRetireReason().equals("reason"));
formService.unretireForm(form2);
assertFalse(form2.getRetired());
assertNull(form2.getRetireReason());
//testing deletion
formService.purgeForm(form2);
//formService.deleteForm(form1); //deleting a deleted form
}
/**
* Test create then update a field
*
* @throws Exception
*/
@Test
public void shouldFieldCreateModifyDelete() {
executeDataSet(INITIAL_FIELDS_XML);
FormService formService = Context.getFormService();
ConceptService conceptService = Context.getConceptService();
//testing creation
Concept concept1 = conceptService.getConcept(1);
String name1 = "name1";
String descript1 = "descript1";
FieldType fieldtype1 = formService.getAllFieldTypes().get(0);
String table1 = "table1";
String attr1 = "attr1";
Boolean multi1 = true;
Field field1 = new Field();
field1.setConcept(concept1);
field1.setName(name1);
field1.setDescription(descript1);
field1.setFieldType(fieldtype1);
field1.setTableName(table1);
field1.setAttributeName(attr1);
field1.setSelectMultiple(multi1);
formService.saveField(field1);
//testing update
Field field2 = formService.getField(field1.getFieldId());
Concept concept2 = conceptService.getConcept(2);
String name2 = "name2";
String descript2 = "descript2";
FieldType fieldtype2 = formService.getAllFieldTypes().get(1);
String table2 = "table2";
String attr2 = "attr2";
Boolean multi2 = false;
field2.setConcept(concept2);
field2.setName(name2);
field2.setDescription(descript2);
field2.setFieldType(fieldtype2);
field2.setTableName(table2);
field2.setAttributeName(attr2);
field2.setSelectMultiple(multi2);
formService.saveField(field2);
//testing differences
Field field3 = formService.getField(field2.getFieldId());
assertTrue(field3.equals(field1));
assertTrue(field1.getConcept().equals(concept2));
assertTrue(field1.getName().equals(name2));
assertTrue(field1.getDescription().equals(descript2));
assertTrue(field1.getFieldType().equals(fieldtype2));
assertTrue(field1.getTableName().equals(table2));
assertTrue(field1.getAttributeName().equals(attr2));
assertTrue(field1.getSelectMultiple().equals(multi2));
//testing deletion
formService.saveField(field3);
formService.purgeField(field3);
assertNull(formService.getField(field3.getFieldId()));
}
/**
* @see FormService#getFormField(Form,Concept,Collection<QFormField;>,null)
*/
@Test
public void getFormField_shouldIgnoreFormFieldsPassedToIgnoreFormFields() {
executeDataSet(INITIAL_FIELDS_XML);
executeDataSet("org/openmrs/api/include/FormServiceTest-formFields.xml");
FormField ff = Context.getFormService().getFormField(new Form(1), new Concept(1), null, false);
assertNotNull(ff); // sanity check
// test that the first formfield is ignored when a second fetch
// is done on the same form and same concept
List<FormField> ignoreFormFields = new Vector<>();
ignoreFormFields.add(ff);
FormField ff2 = Context.getFormService().getFormField(new Form(1), new Concept(1), ignoreFormFields, false);
assertNotNull(ff2);
assertNotSame(ff, ff2);
}
/**
* @see FormService#getFormField(Form,Concept,Collection<QFormField;>,null)
*/
@Test
public void getFormField_shouldNotFailWithNullIgnoreFormFieldsArgument() {
// test that a null ignoreFormFields doesn't error out
FormField ff = Context.getFormService().getFormField(new Form(1), new Concept(3), null, false);
assertNotNull(ff);
}
/**
* Make sure that multiple forms are returned if a field is on a form more than once
*
* @see {@link FormService#getForms(String, Boolean, java.util.Collection, Boolean, java.util.Collection, java.util.Collection, java.util.Collection)
*/
@Test
public void getForms_shouldReturnDuplicateFormWhenGivenFieldsIncludedInFormMultipleTimes() {
executeDataSet(INITIAL_FIELDS_XML);
executeDataSet("org/openmrs/api/include/FormServiceTest-formFields.xml");
FormService formService = Context.getFormService();
List<Field> fields = new Vector<>();
fields.add(new Field(1));
List<Form> forms = formService.getForms(null, null, null, null, null, null, fields);
assertEquals(3, forms.size());
}
/**
* @
* @see FormService#getForms(String,Boolean,Collection,Boolean,Collection,Collection,Collection)
*/
@Test
public void getForms_shouldReturnFormsContainingAllFormFieldsInContainingAllFormFields() {
executeDataSet(INITIAL_FIELDS_XML);
executeDataSet("org/openmrs/api/include/FormServiceTest-formFields.xml");
FormService formService = Context.getFormService();
Set<FormField> formFields = new HashSet<>();
formFields.add(new FormField(3));
formFields.add(new FormField(5));
formFields.add(new FormField(7));
List<Form> forms = formService.getForms(null, null, null, null, null, formFields, null);
assertEquals(1, forms.size());
formFields = new HashSet<>();
formFields.add(new FormField(2));
formFields.add(new FormField(4));
formFields.add(new FormField(6));
forms = formService.getForms(null, null, null, null, null, formFields, null);
assertEquals(0, forms.size());
}
/**
* ensure that FormFields in containingAnyFormField parameter are considered when filtering the results
*
* @see {@link FormService#getForms(String, Boolean, java.util.Collection, Boolean, java.util.Collection, java.util.Collection, java.util.Collection)
*/
@Test
public void getForms_shouldReturnFormsThatHaveAnyMatchingFormFieldsInContainingAnyFormField() {
Integer numberOfExpectedForms = new Integer(2);
executeDataSet(INITIAL_FIELDS_XML);
executeDataSet(MULTIPLE_FORMS_FORM_FIELDS_XML);
FormService formService = Context.getFormService();
Collection<FormField> containingAnyFormField = makeFormFieldCollectionSample(formService);
List<Form> formsReturned = formService.getForms(null, null, null, null, containingAnyFormField, null, null);
Integer currentNumberOfForms = new Integer(formsReturned.size());
assertEquals(numberOfExpectedForms, currentNumberOfForms);
assertTrue(wasFormsSuccessfullyFilteredByMatchingFormFieldsInContainingAnyFormField(containingAnyFormField,
formsReturned));
}
private Collection<FormField> makeFormFieldCollectionSample(FormService formService) {
int formFieldAIdentifier = 2;
int formFieldBIdentifier = 9;
Collection<FormField> containingAnyFormField = new ArrayList<>();
FormField formFieldA = formService.getFormField(formFieldAIdentifier);
FormField formFieldB = formService.getFormField(formFieldBIdentifier);
containingAnyFormField.add(formFieldA);
containingAnyFormField.add(formFieldB);
return containingAnyFormField;
}
private boolean wasFormsSuccessfullyFilteredByMatchingFormFieldsInContainingAnyFormField(
Collection<FormField> containingAnyFormField, List<Form> formsReturned) {
for (Form form : formsReturned) {
if (!doesFormContainAnyFormField(form, containingAnyFormField)) {
return false;
}
}
return true;
}
private boolean doesFormContainAnyFormField(Form form, Collection<FormField> containingAnyFormField) {
Collection<FormField> formFieldsWithinForm = form.getFormFields();
for (FormField formField : containingAnyFormField) {
if (formFieldsWithinForm.contains(formField)) {
return true;
}
}
return false;
}
/**
* @see FormService#saveFieldType(FieldType)
*/
@Test
public void saveFieldType_shouldCreateNewFieldType() {
FieldType fieldType = new FieldType();
fieldType.setName("testing");
fieldType.setDescription("desc");
fieldType.setIsSet(true);
FormService formService = Context.getFormService();
formService.saveFieldType(fieldType);
Assert.assertNotNull(formService.getFieldType(fieldType.getFieldTypeId()));
}
/**
* @see FormService#saveFieldType(FieldType)
*/
@Test
public void saveFieldType_shouldUpdateExistingFieldType() {
FormService formService = Context.getFormService();
FieldType fieldType = formService.getFieldType(1);
Assert.assertNotNull(fieldType);
fieldType.setName("SOME OTHER NEW NAME");
formService.saveFieldType(fieldType);
FieldType refetchedFieldType = formService.getFieldType(1);
assertEquals("SOME OTHER NEW NAME", refetchedFieldType.getName());
}
/**
* @see FormService#duplicateForm(Form)
*/
@Test
public void duplicateForm_shouldClearChangedDetailsAndUpdateCreationDetails() {
Date startOfTest = DateUtil.truncateToSeconds(new Date());
FormService formService = Context.getFormService();
Form form = formService.getForm(1);
Form dupForm = formService.duplicateForm(form);
Assert.assertNull(dupForm.getChangedBy());
Assert.assertNull(dupForm.getDateChanged());
assertEquals(Context.getAuthenticatedUser(), dupForm.getCreator());
assertFalse(dupForm.getDateCreated().before(startOfTest));
}
/**
* @see FormService#getFormField(Form,Concept,Collection<QFormField;>,null)
*/
@Test
public void getFormField_shouldSimplyReturnNullForNonexistentConcepts() {
// test a non existent concept
assertNull(Context.getFormService().getFormField(new Form(1), new Concept(293934), null, false));
}
/**
* @see FormService#getFormField(Form,Concept,Collection<QFormField;>,null)
*/
@Test
public void getFormField_shouldSimplyReturnNullForNonexistentForms() {
// test a non existent form
assertNull(Context.getFormService().getFormField(new Form(12343), new Concept(293934), null, false));
}
/**
* @see FormService#duplicateForm(Form)
*/
@Test
public void duplicateForm_shouldGiveANewUuidToTheDuplicatedForm() {
FormService formService = Context.getFormService();
Form form = formService.getForm(1);
String originalUUID = form.getUuid();
Form dupForm = formService.duplicateForm(form);
Assert.assertNotNull(dupForm.getUuid());
Assert.assertNotSame(originalUUID, dupForm.getUuid());
}
/**
* @see FormService#getFieldAnswerByUuid(String)
*/
@Test
public void getFieldAnswerByUuid_shouldReturnNullIfNoObjectFoundWithGivenUuid() {
Assert.assertNull(Context.getFormService().getFieldAnswerByUuid("some invalid uuid"));
}
/**
* @see FormService#getFieldByUuid(String)
*/
@Test
public void getFieldByUuid_shouldFindObjectGivenValidUuid() {
String uuid = "db016b7d-39a5-4911-89da-0eefbfef7cb2";
Field field = Context.getFormService().getFieldByUuid(uuid);
assertEquals(1, (int) field.getFieldId());
}
/**
* @see FormService#getFieldByUuid(String)
*/
@Test
public void getFieldByUuid_shouldReturnNullIfNoObjectFoundWithGivenUuid() {
Assert.assertNull(Context.getFormService().getFieldByUuid("some invalid uuid"));
}
/**
* @see FormService#getFieldTypeByUuid(String)
*/
@Test
public void getFieldTypeByUuid_shouldFindObjectGivenValidUuid() {
String uuid = "e7016b7d-39a5-4911-89da-0eefbfef7cb5";
FieldType fieldType = Context.getFormService().getFieldTypeByUuid(uuid);
assertEquals(2, (int) fieldType.getFieldTypeId());
}
/**
* @see FormService#getFieldTypeByUuid(String)
*/
@Test
public void getFieldTypeByUuid_shouldReturnNullIfNoObjectFoundWithGivenUuid() {
Assert.assertNull(Context.getFormService().getFieldTypeByUuid("some invalid uuid"));
}
/**
* @see FormService#getFormByUuid(String)
*/
@Test
public void getFormByUuid_shouldFindObjectGivenValidUuid() {
String uuid = "d9218f76-6c39-45f4-8efa-4c5c6c199f50";
Form form = Context.getFormService().getFormByUuid(uuid);
assertEquals(1, (int) form.getFormId());
}
/**
* @see FormService#getFormByUuid(String)
*/
@Test
public void getFormByUuid_shouldReturnNullIfNoObjectFoundWithGivenUuid() {
Assert.assertNull(Context.getFormService().getFormByUuid("some invalid uuid"));
}
/**
* @see FormService#getFormFieldByUuid(String)
*/
@Test
public void getFormFieldByUuid_shouldFindObjectGivenValidUuid() {
String uuid = "1c822b7b-7840-463d-ba70-e0c8338a4c2d";
FormField formField = Context.getFormService().getFormFieldByUuid(uuid);
assertEquals(2, (int) formField.getFormFieldId());
}
/**
* @see FormService#getFormFieldByUuid(String)
*/
@Test
public void getFormFieldByUuid_shouldReturnNullIfNoObjectFoundWithGivenUuid() {
Assert.assertNull(Context.getFormService().getFormFieldByUuid("some invalid uuid"));
}
/**
* @see FormService#saveFormField(FormField)
*/
@Test
public void saveFormField_shouldPropagateSaveToTheFieldPropertyOnTheGivenFormField() {
// create a new Field
Field field = new Field();
field.setName("This is a new field");
field.setDescription("It should be saved along with the formField");
// put that field on a new FormField.
FormField formField = new FormField();
formField.setField(field);
formField.setForm(new Form(1));
// save the FormField
Context.getFormService().saveFormField(formField);
// the uuid should be set by this method so that the field can be saved successfully
Assert.assertNotNull(field.getUuid());
}
/**
* @see FormService#getFormsContainingConcept(Concept)
*/
@Test
public void getFormsContainingConcept_shouldGetAllFormsForConcept() {
Concept concept = Context.getConceptService().getConcept(3);
assertEquals(1, Context.getFormService().getFormsContainingConcept(concept).size());
}
/**
* @see FormService#getFormsContainingConcept(Concept)
*/
@Test
public void mergeDuplicateFields_shouldMergeDuplicateFieldsInFormFieldsAndThenPurgeTheDuplicateFields() {
executeDataSet(INITIAL_FIELDS_XML);
executeDataSet(FORM_FIELDS_XML);
Context.getFormService().mergeDuplicateFields();
// duplicateField should no longer be referenced
Assert.assertNull(Context.getFormService().getFieldByUuid("b1843148-da2f-4349-c9c7-1164b98d91dd"));
// duplicateField should be purged
assertEquals(2, Context.getFormService().getAllFields().size());
}
/**
* @throws ParseException
* @see FormService#saveFormResource(org.openmrs.FormResource)
*/
@Test
public void saveFormResource_shouldPersistAFormResource() throws ParseException {
Form form = Context.getFormService().getForm(1);
FormResource resource = new FormResource();
resource.setForm(form);
resource.setName("Start Date");
resource.setDatatypeClassname("org.openmrs.customdatatype.datatype.DateDatatype");
Date expected = new SimpleDateFormat("yyyy-MM-dd").parse("2011-10-16");
resource.setValue(expected);
Context.getFormService().saveFormResource(resource);
Integer resourceId = resource.getFormResourceId();
Context.clearSession();
FormResource actual = Context.getFormService().getFormResource(resourceId);
Assert.assertNotNull(actual);
Assert.assertEquals(expected, actual.getValue());
}
/**
* @throws ParseException
* @see FormService#duplicateForm(Form)
*/
@Test
public void duplicateForm_shouldCopyResourcesForOldFormToNewForm() throws ParseException {
// save an original resource
Form form = Context.getFormService().getForm(1);
String name = "Start Date";
FormResource resource = new FormResource();
resource.setForm(form);
resource.setName(name);
resource.setDatatypeClassname("org.openmrs.customdatatype.datatype.DateDatatype");
Date expected = new SimpleDateFormat("yyyy-MM-dd").parse("2011-10-16");
resource.setValue(expected);
resource = Context.getFormService().saveFormResource(resource);
Integer resourceId = resource.getFormResourceId();
// duplicate the form
Form newForm = Context.getFormService().duplicateForm(form);
// get the resource
FormResource actual = Context.getFormService().getFormResource(newForm, name);
// check it
Assert.assertNotNull(actual);
Assert.assertEquals(expected, actual.getValue());
}
/**
* @throws ParseException
* @see FormService#purgeFormResource(Form,String,String)
*/
@Test
public void purgeFormResource_shouldDeleteAFormResource() throws ParseException {
// save an original resource
Form form = Context.getFormService().getForm(1);
String name = "Start Date";
FormResource resource = new FormResource();
resource.setForm(form);
resource.setName(name);
resource.setDatatypeClassname("org.openmrs.customdatatype.datatype.DateDatatype");
Date previous = new SimpleDateFormat("yyyy-MM-dd").parse("2011-10-16");
resource.setValue(previous);
resource = Context.getFormService().saveFormResource(resource);
Integer resourceId = resource.getFormResourceId();
// clear the session
Context.clearSession();
// find and delete the resource
resource = Context.getFormService().getFormResource(resourceId);
Context.getFormService().purgeFormResource(resource);
// clear the session
Context.flushSession();
// try to find the resource
resource = Context.getFormService().getFormResource(resourceId);
Assert.assertNull(resource);
}
/**
* @throws ParseException
* @see FormService#saveFormResource(FormResource)
*/
@Test
public void saveFormResource_shouldOverwriteAnExistingResourceWithSameName() throws ParseException {
String name = "Start Date";
// save an original resource
Form form = Context.getFormService().getForm(1);
FormResource resource = new FormResource();
resource.setForm(form);
resource.setName(name);
resource.setDatatypeClassname("org.openmrs.customdatatype.datatype.DateDatatype");
Date previous = new SimpleDateFormat("yyyy-MM-dd").parse("2011-10-16");
resource.setValue(previous);
Context.getFormService().saveFormResource(resource);
// clear the session
Context.flushSession();
// save a new resource with the same name
form = Context.getFormService().getForm(1);
resource = new FormResource();
resource.setForm(form);
resource.setName(name);
resource.setDatatypeClassname("org.openmrs.customdatatype.datatype.DateDatatype");
Date expected = new SimpleDateFormat("yyyy-MM-dd").parse("2010-10-16");
resource.setValue(expected);
Context.getFormService().saveFormResource(resource);
// get the current value
FormResource actual = Context.getFormService().getFormResource(form, name);
Assert.assertFalse(previous.equals(actual.getValue()));
Assert.assertEquals(expected, actual.getValue());
}
/**
* @throws ParseException
* @see FormService#purgeForm(Form)
*/
@Test
public void purgeForm_shouldDeleteFormResourcesForDeletedForm() throws ParseException {
// create a new form
Form form = new Form();
form.setName("form resource test form");
form.setVersion("42");
form.setDescription("bleh");
form = Context.getFormService().saveForm(form);
// save a resource
String name = "Start Date";
FormResource resource = new FormResource();
resource.setForm(form);
resource.setName(name);
resource.setDatatypeClassname("org.openmrs.customdatatype.datatype.DateDatatype");
Date expected = new SimpleDateFormat("yyyy-MM-dd").parse("2011-10-16");
resource.setValue(expected);
Context.getFormService().saveFormResource(resource);
// make sure the resource is saved
FormResource actual = Context.getFormService().getFormResource(form, name);
assertEquals(expected, actual.getValue());
// retain the resource id
Integer savedId = actual.getFormResourceId();
// delete the form
Context.getFormService().purgeForm(form);
// check for the resource
Assert.assertNull(Context.getFormService().getFormResource(savedId));
}
/**
* @throws IOException
* @see FormService#saveFormResource(FormResource)
*/
@Test
public void saveFormResource_shouldBeAbleToSaveAnXSLT() throws IOException {
// set up new form
Form form = new Form();
form.setName("form resource test form");
form.setVersion("42");
form.setDescription("bleh");
form = Context.getFormService().saveForm(form);
// save a resource
String name = "org.openmrs.module.formentry.xslt";
String expected = getResourceAsString(FORM_SAMPLE_RESOURCE);
FormResource resource = new FormResource();
resource.setForm(form);
resource.setName(name);
resource.setDatatypeClassname("org.openmrs.customdatatype.datatype.LongFreeTextDatatype");
resource.setValue(expected);
Context.getFormService().saveFormResource(resource);
// make sure the resource is saved
Collection<FormResource> formResourcesForForm = Context.getFormService().getFormResourcesForForm(form);
Assert.assertEquals(1, formResourcesForForm.size());
FormResource actual = formResourcesForForm.iterator().next();
Assert.assertEquals(expected, actual.getValue());
}
/**
* convert a resource path to a file into a string containing the file's contents
*
* @param filename resource path to the file
* @return the contents of the file in a String
* @throws IOException
*/
private String getResourceAsString(String filename) throws IOException {
InputStream resource = this.getClass().getClassLoader().getResourceAsStream(filename);
BufferedReader reader = new BufferedReader(new InputStreamReader(resource));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
sb.append(line).append("\n");
reader.close();
return sb.toString();
}
/**
* @see FormService#saveFormField(FormField)
*/
@SuppressWarnings("unchecked")
@Test
public void saveFormField_shouldInjectFormFieldsFromSerializableComplexObsHandlers() {
executeDataSet("org/openmrs/api/include/ConceptComplex.xml");
Context.getObsService().registerHandler("NeigborHandler", new NeighborHandler());
Concept concept = Context.getConceptService().getConcept(6043);
Field field = new Field();
field.setName("neighbor");
field.setConcept(concept);
FormField formField = new FormField();
formField.setField(field);
FormService fs = Context.getFormService();
formField.setForm(fs.getForm(1));
List<FormField> originalFormFields = fs.getAllFormFields();
int initialFormFieldCount = originalFormFields.size();
formField = fs.saveFormField(formField);
List<FormField> updatedFormFields = fs.getAllFormFields();
//should have this and the two form fields from the handler
Assert.assertEquals(initialFormFieldCount += 3, updatedFormFields.size());
//get the formfields added by the handler and check their parent
List<FormField> childFormFields = ListUtils.subtract(updatedFormFields, originalFormFields);
childFormFields.remove(formField);//exclude this form field
for (FormField ff : childFormFields) {
Assert.assertEquals(formField, ff.getParent());
}
}
/**
* This is a test complex obs handler that adds 2 form fields
*/
private class NeighborHandler implements SerializableComplexObsHandler {
@Override
public Set<FormField> getFormFields() {
Set<FormField> formFields = new HashSet<>();
Field firstName = new Field();
firstName.setName("firstName");
Field lastName = new Field();
lastName.setName("lastName");
FormField firstNameFormField = new FormField();
firstNameFormField.setField(firstName);
FormField lastNameFormField = new FormField();
lastNameFormField.setField(lastName);
formFields.add(firstNameFormField);
formFields.add(lastNameFormField);
return formFields;
}
@Override
public Obs saveObs(Obs obs) throws APIException {
return null;
}
@Override
public Obs getObs(Obs obs, String view) {
return null;
}
@Override
public boolean purgeComplexData(Obs obs) {
return false;
}
@Override
public String serializeFormData(String data) {
return null;
}
@Override
public String[] getSupportedViews() {
return new String[0];
}
@Override
public boolean supportsView(String view) {
return false;
}
}
/**
* Creates a new Global Property to lock forms by setting its value
* @param propertyValue value for forms locked GP
*/
public void createFormsLockedGPAndSetValue(String propertyValue) {
GlobalProperty gp = new GlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_FORMS_LOCKED);
gp.setPropertyValue(propertyValue);
Context.getAdministrationService().saveGlobalProperty(gp);
}
/**
* @see FormService#saveForm(Form)
*/
@Test
public void saveForm_shouldSaveGivenFormSuccessfully() {
FormService fs = Context.getFormService();
createFormsLockedGPAndSetValue("false");
Form form = new Form();
form.setName("new form");
form.setVersion("1.0");
form.setDescription("testing TRUNK-4030");
Form formSave = fs.saveForm(form);
assertTrue(form.equals(formSave));
}
/**
* @see FormService#saveForm(Form)
*/
@Test
public void saveForm_shouldUpdateAnExistingForm() {
FormService fs = Context.getFormService();
createFormsLockedGPAndSetValue("false");
Form form = fs.getForm(1);
form.setName("modified basic form");
fs.saveForm(form);
Form formUpdate = fs.getForm(1);
assertTrue(form.equals(formUpdate));
}
/**
* @see FormService#saveForm(Form)
* @throws FormsLockedException
*/
@Test(expected = FormsLockedException.class)
public void saveForm_shouldThrowAnErrorWhenTryingToSaveAnExistingFormWhileFormsAreLocked() {
FormService fs = Context.getFormService();
createFormsLockedGPAndSetValue("true");
Form form = fs.getForm(1);
form.setName("modified basic form");
fs.saveForm(form);
}
/**
* @see FormService#saveForm(Form)
* @throws FormsLockedException
*/
@Test(expected = FormsLockedException.class)
public void saveForm_shouldThrowAnErrorWhenTryingToSaveANewFormWhileFormsAreLocked() {
FormService fs = Context.getFormService();
createFormsLockedGPAndSetValue("true");
Form form = new Form();
form.setName("new form");
form.setVersion("1.0");
form.setDescription("testing TRUNK-4030");
fs.saveForm(form);
}
/**
* @see FormService#purgeForm(Form)
* @throws FormsLockedException
*/
@Test(expected = FormsLockedException.class)
public void purgeForm_shouldThrowAnErrorWhenTryingToDeleteFormWhileFormsAreLocked() {
FormService fs = Context.getFormService();
createFormsLockedGPAndSetValue("true");
Form form = fs.getForm(1);
fs.purgeForm(form);
}
/**
* @see FormService#purgeForm(Form)
*/
@Test
public void purgeForm_shouldDeleteGivenFormSuccessfully() {
FormService fs = Context.getFormService();
createFormsLockedGPAndSetValue("false");
Form form = fs.getForm(1);
fs.purgeForm(form);
assertNull(fs.getForm(1));
}
/**
* @see FormService#duplicateForm(Form)}
* @throws FormsLockedException
*/
@Test(expected = FormsLockedException.class)
public void duplicateForm_shouldThrowAnErrorWhenTryingToDuplicateFormWhileFormsAreLocked() {
FormService fs = Context.getFormService();
createFormsLockedGPAndSetValue("true");
Form form = fs.getForm(1);
fs.duplicateForm(form);
}
/**
* @see FormService#duplicateForm(Form)
*/
@Test
public void duplicateForm_shouldDuplicateGivenFormSuccessfully() {
FormService fs = Context.getFormService();
createFormsLockedGPAndSetValue("false");
Form form = fs.getForm(1);
Form duplicateForm = fs.duplicateForm(form);
assertEquals(form, duplicateForm);
}
}