Package org.openmrs.module.htmlformentry

Source Code of org.openmrs.module.htmlformentry.PatientTagTest

package org.openmrs.module.htmlformentry;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.Encounter;
import org.openmrs.GlobalProperty;
import org.openmrs.Patient;
import org.openmrs.PatientProgram;
import org.openmrs.Person;
import org.openmrs.PersonAddress;
import org.openmrs.api.context.Context;
import org.openmrs.test.BaseModuleContextSensitiveTest;
import org.openmrs.util.OpenmrsConstants;
import org.springframework.mock.web.MockHttpServletRequest;

public class PatientTagTest extends BaseModuleContextSensitiveTest {
 
  protected static final String XML_DATASET_PATH = "org/openmrs/module/htmlformentry/include/";
 
  protected static final String XML_REGRESSION_TEST_DATASET = "regressionTestDataSet";
 
  @Before
  public void loadData() throws Exception {
    executeDataSet(XML_DATASET_PATH + new TestUtil().getTestDatasetFilename(XML_REGRESSION_TEST_DATASET));
  }
 
  @Test
  public void testCreateMinimalPatient() throws Exception {
    final Date date = new Date();
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "simpleCreatePatientForm";
      }
     
      @Override
      public Patient getPatient() {
        return new Patient();
      }
     
      @Override
      public String[] widgetLabels() {
        return new String[] { "PersonName.givenName", "PersonName.familyName", "Gender:", "Birthdate:",
                "Identifier:", "Identifier Location:" };
      }
     
      @Override
      public void testBlankFormHtml(String html) {
        System.out.println(">>>>\n" + html);
      }

      @Override
      public void setupRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("PersonName.givenName"), "Given");
        request.setParameter(widgets.get("PersonName.familyName"), "Family");
        request.setParameter(widgets.get("Gender:"), "F");
        request.setParameter(widgets.get("Birthdate:"), dateAsString(date));
        request.setParameter(widgets.get("Identifier:"), "987654-1");
        request.setParameter(widgets.get("Identifier Location:"), "2");
        // hack because identifier type is a hidden input with no label
        request.setParameter("w17", "1");
      }
     
      @Override
      public void testResults(SubmissionResults results) {
        results.assertNoErrors();
        results.assertPatient();
        results.assertNoEncounterCreated();
      }
    }.run();
  }
 
  @Test
  public void testCreatePatientAndEncounter() throws Exception {
    final Date date = new Date();
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "simplePatientAndEncounterForm";
      }
     
      @Override
      public Patient getPatient() {
        return new Patient();
      }
     
      @Override
      public String[] widgetLabels() {
        return new String[] { "PersonName.givenName", "PersonName.familyName", "Gender:", "Birthdate:",
                "Identifier:", "Identifier Location:", "Date:", "Encounter Location:", "Provider:" };
      }
     
      @Override
      public void setupRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("PersonName.givenName"), "Given");
        request.setParameter(widgets.get("PersonName.familyName"), "Family");
        request.setParameter(widgets.get("Gender:"), "F");
        request.setParameter(widgets.get("Birthdate:"), dateAsString(date));
        request.setParameter(widgets.get("Identifier:"), "987654-1");
        request.setParameter(widgets.get("Identifier Location:"), "2");
        // hack because identifier type is a hidden input with no label
        request.setParameter("w17", "1");
       
        request.setParameter(widgets.get("Date:"), dateAsString(date));
        request.setParameter(widgets.get("Encounter Location:"), "2");
        request.setParameter(widgets.get("Provider:"), "502");
      }
     
      @Override
      public void testResults(SubmissionResults results) {
        Date datePartOnly = ymdToDate(dateAsString(date));
        results.assertNoErrors();
       
        results.assertPatient();
        Assert.assertEquals("Given", results.getPatient().getPersonName().getGivenName());
        Assert.assertEquals("Family", results.getPatient().getPersonName().getFamilyName());
        Assert.assertEquals("F", results.getPatient().getGender());
        Assert.assertEquals(datePartOnly, results.getPatient().getBirthdate());
        Assert.assertEquals(false, results.getPatient().getBirthdateEstimated());
        Assert.assertEquals("987654-1", results.getPatient().getPatientIdentifier().getIdentifier());
       
        results.assertEncounterCreated();
        Assert.assertEquals(datePartOnly, results.getEncounterCreated().getEncounterDatetime());
        results.assertProvider(502);
        results.assertLocation(2);
      }
    }.run();
  }
 
  @Test
  public void testEditPatientDetailsWithoutEditingEncounter() throws Exception {
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "patientAndEncounterFormWithMultipleObs";
      }
     
      @Override
      public Patient getPatientToEdit() {
        return Context.getPatientService().getPatient(2);
      };
     
      @Override
      public boolean doViewEncounter() {
        return true;
      };
     
      @Override
      public Encounter getEncounterToView() {
        return Context.getEncounterService().getEncounter(101);
      }
     
      @Override
      public String[] widgetLabelsForEdit() {
        return new String[] { "PersonName.givenName", "PersonName.familyName" };
      }
     
      @Override
      public void setupEditRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("PersonName.givenName"), "Simon");
        request.setParameter(widgets.get("PersonName.familyName"), "paul");
      }
     
      @Override
      public void testEditedResults(SubmissionResults results) {
        results.assertNoErrors();
        results.assertPatient();
        Assert.assertEquals("Simon", results.getPatient().getGivenName());
        Assert.assertEquals("paul", results.getPatient().getFamilyName());
        Assert.assertEquals("M", results.getPatient().getGender());
        results.assertEncounterEdited();
      }
     
    }.run();
  }
 
  @Test
  public void testEditPatientDetailsAndEncounterDetails() throws Exception {
    final Date date = new Date();
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "patientAndEncounterFormWithMultipleObs";
      }
     
      @Override
      public Patient getPatientToEdit() {
        return Context.getPatientService().getPatient(2);
      };
     
      @Override
      public Encounter getEncounterToEdit() {
        return Context.getEncounterService().getEncounter(101);
      }
     
      @Override
      public String[] widgetLabelsForEdit() {
        return new String[] { "PersonName.givenName", "PersonName.familyName", "Date:", "Encounter Location:" };
      }
     
      @Override
      public void setupEditRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("PersonName.givenName"), "Mark");
        request.setParameter(widgets.get("PersonName.familyName"), "waugh");
        request.setParameter(widgets.get("Date:"), dateAsString(date));
        request.setParameter(widgets.get("Encounter Location:"), "2");
      }
     
      @Override
      public void testEditedResults(SubmissionResults results) {
        Date datePartOnly = ymdToDate(dateAsString(date));
        results.assertNoErrors();
        results.assertPatient();
        results.getPatient().getPersonName();
        Assert.assertEquals("Mark", results.getPatient().getGivenName());
        Assert.assertEquals("waugh", results.getPatient().getFamilyName());
        Assert.assertEquals("M", results.getPatient().getGender());
       
        Assert.assertEquals(datePartOnly, results.getEncounterCreated().getEncounterDatetime());
        results.assertProvider(502);
        results.assertLocation(2);
        results.assertEncounterEdited();
      }
     
    }.run();
  }
 
  @Test
  /**
   * TODO Testcase Fails with error org.hibernate.PropertyValueException: not-null property
   * references a null or transient value: org.openmrs.PersonName.dateCreated
   */
  public void testEditPatientNameAndMultipleObs() throws Exception {
    final Date date = new Date();
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "patientAndEncounterFormWithMultipleObs";
      }
     
      @Override
      public Patient getPatientToEdit() {
        return Context.getPatientService().getPatient(2);
      }
     
      @Override
      public Encounter getEncounterToView() {
        return Context.getEncounterService().getEncounter(101);
      }
     
      @Override
      public String[] widgetLabelsForEdit() {
        return new String[] { "PersonName.givenName", "PersonName.familyName", "Weight:" };
      }
     
      @Override
      public void setupEditRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("PersonName.givenName"), "Mike");
        request.setParameter(widgets.get("PersonName.familyName"), "Den");
        request.setParameter(widgets.get("Weight:"), "100");
      }
     
      @Override
      public void testEditedResults(SubmissionResults results) {
        @SuppressWarnings("unused")
        Date datePartOnly = ymdToDate(dateAsString(date));
        results.assertNoErrors();
        results.assertPatient();
        results.getPatient().getPersonName();
        Assert.assertEquals("Mike", results.getPatient().getGivenName());
        Assert.assertEquals("Den", results.getPatient().getFamilyName());
        Assert.assertEquals("M", results.getPatient().getGender());
       
        results.assertObsCreated(2, 100d);
       
      }
     
      @Override
      public void testBlankFormHtml(String html) {
        System.out.println(">>>>\n" + html);
      }
     
    }.run();
  }
 
  @Test
  public void testEditObsWithoutEditingPatient() throws Exception {
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "patientAndEncounterFormWithMultipleObs";
      }
     
      @Override
      public Patient getPatientToView() throws Exception {
        return Context.getPatientService().getPatient(2);
      };
     
      @Override
      public Encounter getEncounterToEdit() {
        return Context.getEncounterService().getEncounter(101);
      }
     
      @Override
      public String[] widgetLabelsForEdit() {
        return new String[] { "Weight:" };
      };
     
      @Override
      public void setupEditRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("Weight:"), "100");
      };
     
      @Override
      public void testEditedResults(SubmissionResults results) {
        results.assertNoErrors();
        results.assertPatient();
        results.assertEncounterEdited();
        results.assertObsCreated(2, 100d);
      };
     
    }.run();
  }
 
  @Test
  public void testEditPatientNameAndMultipleObsAndEncounter() throws Exception {
    final Date date = new Date();
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "patientAndEncounterFormWithMultipleObs";
      }
     
      @Override
      public Patient getPatientToEdit() {
        return Context.getPatientService().getPatient(2);
      };
     
      @Override
      public Encounter getEncounterToView() {
        return Context.getEncounterService().getEncounter(101);
      }
     
      @Override
      public String[] widgetLabelsForEdit() {
        return new String[] { "PersonName.givenName", "PersonName.familyName", "Weight:", "Date:",
                "Encounter Location:" };
      }
     
      @Override
      public void setupEditRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("PersonName.givenName"), "Mike");
        request.setParameter(widgets.get("PersonName.familyName"), "Den");
        request.setParameter(widgets.get("Weight:"), "100");
        request.setParameter(widgets.get("Date:"), dateAsString(date));
        request.setParameter(widgets.get("Encounter Location:"), "2");
       
      }
     
      @Override
      public void testEditedResults(SubmissionResults results) {
        Date datePartOnly = ymdToDate(dateAsString(date));
        results.assertNoErrors();
        results.assertPatient();
        results.getPatient().getPersonName();
        Assert.assertEquals("Mike", results.getPatient().getGivenName());
        Assert.assertEquals("Den", results.getPatient().getFamilyName());
        Assert.assertEquals("M", results.getPatient().getGender());
       
        results.assertObsCreated(2, 100d);
       
        Assert.assertEquals(datePartOnly, results.getEncounterCreated().getEncounterDatetime());
        results.assertProvider(502);
        results.assertLocation(2);
        results.assertEncounterEdited();
      }
     
      @Override
      public void testBlankFormHtml(String html) {
        System.out.println(">>>>\n" + html);
      }
     
    }.run();
  }
 
  @Test
  public void submittingFormWithoutPatientTagsShouldNotUpdatePatientDateChanged() throws Exception {
    final Date date = new Date();
   
    new RegressionTestHelper() {
     
      public Date patientDateChanged;
     
      @Override
      public Patient getPatient() {
        Patient patient = Context.getPatientService().getPatient(2);
        patientDateChanged = patient.getDateChanged();
        return patient;
      }
     
      @Override
      public String getFormName() {
        return "singleObsForm";
      }
     
      @Override
      public String[] widgetLabels() {
        return new String[] { "Date:", "Location:", "Provider:", "Weight:" };
      }
     
      @Override
      public void setupRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("Date:"), dateAsString(date));
        request.setParameter(widgets.get("Location:"), "2");
        request.setParameter(widgets.get("Provider:"), "502");
        request.setParameter(widgets.get("Weight:"), "70");
      }
     
      @Override
      public boolean doViewPatient() {
        return true;
      }
     
      @Override
      public void testViewingPatient(Patient patient, String html) {
        // confirm that the patient date changed has not changed
        Assert.assertTrue("patient date changed has been errorneously changed", patient.getDateChanged() == null
                && patientDateChanged == null || patient.getDateChanged().equals(patientDateChanged));
      }
     
    }.run();
  }
 
  @Test
  public void editingFormWithoutPatientTagsShouldNotUpdatePatientDateChanged() throws Exception {
    new RegressionTestHelper() {
     
      public Date patientDateChanged;
     
      @Override
      public Patient getPatient() {
        Patient patient = Context.getPatientService().getPatient(2);
        patientDateChanged = patient.getDateChanged();
        return patient;
      }
     
      @Override
      public String getFormName() {
        return "multipleObsForm";
      }
     
      @Override
      public Patient getPatientToView() throws Exception {
        return Context.getPatientService().getPatient(2);
      };
     
      @Override
      public Encounter getEncounterToEdit() {
        return Context.getEncounterService().getEncounter(101);
      }
     
      @Override
      public String[] widgetLabelsForEdit() {
        return new String[] { "Weight:", "Allergy:", "Allergy Date:" };
      };
     
      @Override
      public void setupEditRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("Weight:"), "75");
        request.setParameter(widgets.get("Allergy:"), "Bee stings");
      };
     
      @Override
      public boolean doViewPatient() {
        return true;
      }
     
      @Override
      public void testViewingPatient(Patient patient, String html) {
        // confirm that the patient date changed has not changed
        Assert.assertTrue("patient date changed has been errorneously changed", patient.getDateChanged() == null
                && patientDateChanged == null || patient.getDateChanged().equals(patientDateChanged));
      }
     
    }.run();
  }
 
  @Test
  public void viewFormWithPersonObs() throws Exception {
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "singlePersonObsForm";
      }
     
      @Override
      public Encounter getEncounterToView() throws Exception {
        Encounter e = new Encounter();
        e.setPatient(getPatient());
        Date date = Context.getDateFormat().parse("01/02/2003");
        e.setDateCreated(new Date());
        e.setEncounterDatetime(date);
        e.setLocation(Context.getLocationService().getLocation(2));
        e.setProvider(Context.getPersonService().getPerson(502));
        TestUtil.addObs(e, 19, "7 - Collet Test Chebaskwony", null);
        return e;
      }
     
      @Override
      public void testViewingEncounter(Encounter encounter, String html) {
        TestUtil.assertFuzzyContains("Collet Test Chebaskwony", html); // make sure Collet Chebaskwony has been included
      }
    }.run();
  }
 
  @Test
  public void testCreatePatientWithObs() throws Exception {
    final Date date = new Date();
   
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "patientAndObsForm";
      }
     
      @Override
      public Patient getPatient() {
        return new Patient();
      }
     
      @Override
      public String[] widgetLabels() {
        return new String[] { "PersonName.givenName", "PersonName.familyName", "Gender:", "Birthdate:",
                "Identifier:", "Identifier Location:", "Identifier Type:", "Date:", "Encounter Location:",
                "Provider:", "Weight:", "Allergy:", "Allergy Date:" };
      }
     
      @Override
      public void setupRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("PersonName.givenName"), "Given");
        request.setParameter(widgets.get("PersonName.familyName"), "Family");
        request.setParameter(widgets.get("Gender:"), "F");
        request.setParameter(widgets.get("Birthdate:"), dateAsString(date));
        request.setParameter(widgets.get("Identifier:"), "987654-1");
        request.setParameter(widgets.get("Identifier Location:"), "2");
        // hack because identifier type is a hidden input with no label
        request.setParameter("w17", "1");
       
        request.setParameter(widgets.get("Date:"), dateAsString(date));
        request.setParameter(widgets.get("Encounter Location:"), "2");
        request.setParameter(widgets.get("Provider:"), "502");
       
        request.setParameter(widgets.get("Weight:"), "75");
        request.setParameter(widgets.get("Allergy:"), "Bee stings");
        request.setParameter(widgets.get("Allergy Date:"), dateAsString(date));
      }
     
      @Override
      public void testResults(SubmissionResults results) {
        Date datePartOnly = ymdToDate(dateAsString(date));
       
        results.assertNoErrors();
       
        results.assertPatient();
        Assert.assertEquals("Given", results.getPatient().getPersonName().getGivenName());
        Assert.assertEquals("Family", results.getPatient().getPersonName().getFamilyName());
        Assert.assertEquals("F", results.getPatient().getGender());
        Assert.assertEquals(datePartOnly, results.getPatient().getBirthdate());
        Assert.assertEquals(false, results.getPatient().getBirthdateEstimated());
        Assert.assertEquals("987654-1", results.getPatient().getPatientIdentifier().getIdentifier());
       
        results.assertEncounterCreated();
        Assert.assertEquals(datePartOnly, results.getEncounterCreated().getEncounterDatetime());
        results.assertProvider(502);
        results.assertLocation(2);
       
        results.assertObsCreatedCount(3);
        results.assertObsCreated(2, 75);
        results.assertObsCreated(8, "Bee stings");
        results.assertObsCreated(1119, datePartOnly);
      }
    }.run();
  }

    @Test
    public void testCreatePatientAndEnrollInProgram() throws Exception {
        final Date date = new Date();

        new RegressionTestHelper() {

            @Override
            public String getFormName() {
                return "patientAndEnrollInProgramForm";
            }

            @Override
            public Patient getPatient() {
                return new Patient();
            }

            @Override
            public String[] widgetLabels() {
                return new String[] { "PersonName.givenName", "PersonName.familyName", "Gender:", "Birthdate:",
                        "Identifier:", "Identifier Location:", "Identifier Type:", "Date:" };
            }

            @Override
            public void setupRequest(MockHttpServletRequest request, Map<String, String> widgets) {
                request.setParameter(widgets.get("PersonName.givenName"), "Given");
                request.setParameter(widgets.get("PersonName.familyName"), "Family");
                request.setParameter(widgets.get("Gender:"), "F");
                request.setParameter(widgets.get("Birthdate:"), dateAsString(date));
                request.setParameter(widgets.get("Identifier:"), "987654-1");
                request.setParameter(widgets.get("Identifier Location:"), "2");
                // hack because identifier type is a hidden input with no label
                request.setParameter("w17", "1");

                request.setParameter(widgets.get("Date:"), dateAsString(date));
            }

            @Override
            public void testResults(SubmissionResults results) {
                Date datePartOnly = ymdToDate(dateAsString(date));

                results.assertNoErrors();

                results.assertPatient();
                Assert.assertEquals("Given", results.getPatient().getPersonName().getGivenName());
                Assert.assertEquals("Family", results.getPatient().getPersonName().getFamilyName());
                Assert.assertEquals("F", results.getPatient().getGender());
                Assert.assertEquals(datePartOnly, results.getPatient().getBirthdate());
                Assert.assertEquals(false, results.getPatient().getBirthdateEstimated());
                Assert.assertEquals("987654-1", results.getPatient().getPatientIdentifier().getIdentifier());

                List<PatientProgram> patientPrograms = Context.getProgramWorkflowService().getPatientPrograms(
                    results.getPatient(), null, null, null, null, null, false);
              Assert.assertTrue(patientPrograms.size() == 1);
            }
        }.run();
    }

  @Test
  public void testEditPatientAndCreatingObs() throws Exception {
    final Date date = new Date();
   
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "patientAndObsForm";
      }
     
      @Override
      public Patient getPatientToEdit() {
        return Context.getPatientService().getPatient(2);
      }
     
      @Override
      public String[] widgetLabelsForEdit() {
        return new String[] { "PersonName.givenName", "PersonName.familyName", "Gender:", "Birthdate:",
                "Identifier:", "Identifier Location:" };
      }
     
      @Override
      public String[] widgetLabels() {
        return new String[] { "PersonName.givenName", "PersonName.familyName", "Gender:", "Birthdate:",
                "Identifier:", "Identifier Location:", "Date:", "Encounter Location:", "Provider:", "Weight:",
                "Allergy:", "Allergy Date:" };
      }
     
      @Override
      public void setupRequest(MockHttpServletRequest request, java.util.Map<String, String> widgets) {
        request.setParameter(widgets.get("PersonName.givenName"), "Given");
        request.setParameter(widgets.get("PersonName.familyName"), "Family");
        request.setParameter(widgets.get("Gender:"), "F");
        request.setParameter(widgets.get("Birthdate:"), dateAsString(date));
        request.setParameter(widgets.get("Identifier:"), "987654-1");
        request.setParameter(widgets.get("Identifier Location:"), "2");
        // hack because identifier type is a hidden input with no label
        request.setParameter("w17", "1");
       
        request.setParameter(widgets.get("Date:"), dateAsString(date));
        request.setParameter(widgets.get("Encounter Location:"), "2");
        request.setParameter(widgets.get("Provider:"), "502");
       
        request.setParameter(widgets.get("Weight:"), "75");
        request.setParameter(widgets.get("Allergy:"), "Bee stings");
        request.setParameter(widgets.get("Allergy Date:"), dateAsString(date));
      }
     
      @Override
      public void setupEditRequest(MockHttpServletRequest request, java.util.Map<String, String> widgets) {
        request.setParameter(widgets.get("PersonName.givenName"), "Given");
        request.setParameter(widgets.get("PersonName.familyName"), "Family");
        request.setParameter(widgets.get("Gender:"), "F");
        request.setParameter(widgets.get("Birthdate:"), dateAsString(date));
        request.setParameter(widgets.get("Identifier:"), "987654-1");
        request.setParameter(widgets.get("Identifier Location:"), "2");
        // hack because identifier type is a hidden input with no label
        request.setParameter("w17", "1");
      }
     
      @Override
      public void testResults(SubmissionResults results) {
        Date datePartOnly = ymdToDate(dateAsString(date));
       
        results.assertNoErrors();
       
        results.assertEncounterCreated();
        Assert.assertEquals(datePartOnly, results.getEncounterCreated().getEncounterDatetime());
        results.assertProvider(502);
        results.assertLocation(2);
       
        results.assertObsCreatedCount(3);
        results.assertObsCreated(2, 75);
        results.assertObsCreated(8, "Bee stings");
        results.assertObsCreated(1119, datePartOnly);
      }
     
      @Override
      public void testEditedResults(SubmissionResults results) {
        Date datePartOnly = ymdToDate(dateAsString(date));
       
        results.assertNoErrors();
       
        results.assertPatient();
        Assert.assertEquals("Given", results.getPatient().getPersonName().getGivenName());
        Assert.assertEquals("Family", results.getPatient().getPersonName().getFamilyName());
        Assert.assertEquals("F", results.getPatient().getGender());
        Assert.assertEquals(datePartOnly, results.getPatient().getBirthdate());
        Assert.assertEquals(false, results.getPatient().getBirthdateEstimated());
        Assert.assertEquals("987654-1", results.getPatient().getPatientIdentifier().getIdentifier());
      }
    }.run();
  }
 
  @Test
  public void testEditingPatientAndEditingObs() throws Exception {
    final Date date = new Date();
   
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "patientAndObsForm";
      }
     
      @Override
      public Patient getPatientToEdit() {
        return Context.getPatientService().getPatient(2);
      }
     
      @Override
      public Encounter getEncounterToEdit() {
        return Context.getEncounterService().getEncounter(101);
      }
     
      @Override
      public String[] widgetLabelsForEdit() {
        return new String[] { "PersonName.givenName", "PersonName.familyName", "Gender:", "Birthdate:",
                "Identifier:", "Identifier Location:", "Date:", "Encounter Location:", "Provider:", "Weight:",
                "Allergy:", "Allergy Date:" };
      }
     
      @Override
      public void setupEditRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("PersonName.givenName"), "Given");
        request.setParameter(widgets.get("PersonName.familyName"), "Family");
        request.setParameter(widgets.get("Gender:"), "F");
        request.setParameter(widgets.get("Birthdate:"), dateAsString(date));
        request.setParameter(widgets.get("Identifier:"), "987654-1");
        request.setParameter(widgets.get("Identifier Location:"), "2");
        // hack because identifier type is a hidden input with no label
        request.setParameter("w17", "1");
       
        request.setParameter(widgets.get("Date:"), dateAsString(date));
        request.setParameter(widgets.get("Encounter Location:"), "2");
        request.setParameter(widgets.get("Provider:"), "502");
       
        request.setParameter(widgets.get("Weight:"), "75");
        request.setParameter(widgets.get("Allergy:"), "Bee stings");
        request.setParameter(widgets.get("Allergy Date:"), dateAsString(date));
      }
     
      @Override
      public void testEditedResults(SubmissionResults results) {
        Date datePartOnly = ymdToDate(dateAsString(date));
       
        results.assertNoErrors();
       
        results.assertPatient();
        Assert.assertEquals("Given", results.getPatient().getGivenName());
        Assert.assertEquals("Family", results.getPatient().getFamilyName());
        Assert.assertEquals("F", results.getPatient().getGender());
        Assert.assertEquals(datePartOnly, results.getPatient().getBirthdate());
        Assert.assertEquals(false, results.getPatient().getBirthdateEstimated());
        Assert.assertEquals("987654-1", results.getPatient().getPatientIdentifier().getIdentifier());
       
        results.assertEncounterEdited();
        Assert.assertEquals(datePartOnly, results.getEncounterCreated().getEncounterDatetime());
        results.assertProvider(502);
        results.assertLocation(2);
       
        results.assertObsCreatedCount(3);
        results.assertObsCreated(2, 75);
        results.assertObsCreated(8, "Bee stings");
        results.assertObsCreated(1119, datePartOnly);
      }
    }.run();
  }
 
  @Test
  public void testCreatePatientWithAddress() throws Exception {
   
    // only run this test on OpenMRS 1.9 and above (since we have not configured it to work with old Address model)
    int majorVersion = Integer.parseInt(OpenmrsConstants.OPENMRS_VERSION_SHORT.split("\\.")[0]);
    int minorVersion = Integer.parseInt(OpenmrsConstants.OPENMRS_VERSION_SHORT.split("\\.")[1]);
    if (majorVersion == 1 && minorVersion < 9) {
      return;
    }
   
    setupAddressTemplate()
   
    final Date date = new Date();
 
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "patientAddressForm";
      }
     
      @Override
      public Patient getPatient() {
        return new Patient();
      }
     
      @Override
      public String[] widgetLabels() {
        return new String[] { "PersonName.givenName", "PersonName.familyName", "Gender:", "Birthdate:",
                "Identifier:", "Identifier Location:", "Location.address1", "Location.cityVillage",
                "Location.stateProvince", "Location.postalCode" };
      }
     
      @Override
      public void testBlankFormHtml(String html) {
        System.out.println(">>>>\n" + html);
      }
     
      @Override
      public void setupRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("PersonName.givenName"), "Given");
        request.setParameter(widgets.get("PersonName.familyName"), "Family");
        request.setParameter(widgets.get("Gender:"), "F");
        request.setParameter(widgets.get("Birthdate:"), dateAsString(date));
        request.setParameter(widgets.get("Identifier:"), "987654-1");
        request.setParameter(widgets.get("Identifier Location:"), "2");
        // hack because identifier type is a hidden input with no label
        request.setParameter("w17", "1");
        request.addParameter(widgets.get("Location.address1"), "410 w 10th St.");
        request.addParameter(widgets.get("Location.cityVillage"), "Indianapolis");
        request.addParameter(widgets.get("Location.stateProvince"), "Indiana");
        request.addParameter(widgets.get("Location.postalCode"), "46202");
      }
     
      @Override
      public void testResults(SubmissionResults results) {
        results.assertNoErrors();
        results.assertPatient();
        PersonAddress address = results.getPatient().getPersonAddress();
        Assert.assertEquals("410 w 10th St.", address.getAddress1());
        Assert.assertEquals("Indianapolis", address.getCityVillage());
        Assert.assertEquals("Indiana", address.getStateProvince());
        Assert.assertEquals("46202", address.getPostalCode());
        results.assertNoEncounterCreated();
      }
    }.run();
  }
 
  @Test
  public void testEditPatientWithAddress() throws Exception {
   
    // only run this test on OpenMRS 1.9 and above (since we have not configured it to work with old Address model)
    int majorVersion = Integer.parseInt(OpenmrsConstants.OPENMRS_VERSION_SHORT.split("\\.")[0]);
    int minorVersion = Integer.parseInt(OpenmrsConstants.OPENMRS_VERSION_SHORT.split("\\.")[1]);
    if (majorVersion == 1 && minorVersion < 9) {
      return;
    }
       
    final Date date = new Date();
   
    setupAddressTemplate();
   
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "patientAddressForm";
      }
     
      @Override
      public Patient getPatient() {
        return new Patient();
      }
     
      @Override
      public String[] widgetLabels() {
        return new String[] { "PersonName.givenName", "PersonName.familyName", "Gender:", "Birthdate:",
                "Identifier:", "Identifier Location:", "Location.address1", "Location.cityVillage",
                "Location.stateProvince", "Location.postalCode" };
      }
     
      @Override
      public String[] widgetLabelsForEdit() {
        return new String[] {"Location.address1", "Location.cityVillage",
                "Location.stateProvince", "Location.postalCode" };
      }
     
      @Override
      public void testBlankFormHtml(String html) {
        System.out.println(">>>>\n" + html);
      }
     
      @Override
      public void setupRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("PersonName.givenName"), "Given");
        request.setParameter(widgets.get("PersonName.familyName"), "Family");
        request.setParameter(widgets.get("Gender:"), "F");
        request.setParameter(widgets.get("Birthdate:"), dateAsString(date));
        request.setParameter(widgets.get("Identifier:"), "987654-1");
        request.setParameter(widgets.get("Identifier Location:"), "2");
        // hack because identifier type is a hidden input with no label
        request.setParameter("w17", "1");
        request.addParameter(widgets.get("Location.address1"), "410 w 10th St.");
        request.addParameter(widgets.get("Location.cityVillage"), "Indianapolis");
        request.addParameter(widgets.get("Location.stateProvince"), "Indiana");
        request.addParameter(widgets.get("Location.postalCode"), "46202");
       
      }
     
      @Override
      public void testResults(SubmissionResults results) {
        results.assertNoErrors();
        results.assertPatient();
        PersonAddress address = results.getPatient().getPersonAddress();
        Assert.assertEquals("410 w 10th St.", address.getAddress1());
        Assert.assertEquals("Indianapolis", address.getCityVillage());
        Assert.assertEquals("Indiana", address.getStateProvince());
        Assert.assertEquals("46202", address.getPostalCode());
        results.assertNoEncounterCreated();
      }
     
      @Override
      public void setupEditRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.addParameter(widgets.get("Location.address1"), "273 Beaver Dam Rd.");
        request.addParameter(widgets.get("Location.cityVillage"), "Scituate");
        request.addParameter(widgets.get("Location.stateProvince"), "MA");
        request.addParameter(widgets.get("Location.postalCode"), "02066")
      }
     
      @Override
      public void testEditedResults(SubmissionResults results) {
        results.assertNoErrors();
        results.assertPatient();
        PersonAddress address = results.getPatient().getPersonAddress();
        Assert.assertEquals("273 Beaver Dam Rd.", address.getAddress1());
        Assert.assertEquals("Scituate", address.getCityVillage());
        Assert.assertEquals("MA", address.getStateProvince());
        Assert.assertEquals("02066", address.getPostalCode());
        results.assertNoEncounterCreated();
      }
     
    }.run();
  }
 
  /**
   * Tests that the age value wins in case both the age and birthdate are provided
   *
   * @throws Exception
   */
  @Test
  public void testCreatePatientBirthdateByAge() throws Exception {
    final Integer expectedAge = 42;
    Person person = new Person();
    person.setBirthdateFromAge(expectedAge, new Date());
    final Date expectedBirthDate = person.getBirthdate();
   
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "createPatientBirthdateByAgeForm";
      }
     
      @Override
      public Patient getPatientToEdit() {
        return Context.getPatientService().getPatient(2);
      };
     
      @Override
      public boolean doViewEncounter() {
        return true;
      };
     
      @Override
      public Encounter getEncounterToView() {
        return Context.getEncounterService().getEncounter(101);
      }
     
      @Override
      public String[] widgetLabelsForEdit() {
        return new String[] { "Age:" };
      }
     
      @Override
      public void setupEditRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("Age:"), expectedAge.toString());
      }
     
      @Override
      public void testEditedResults(SubmissionResults results) {
        results.assertNoErrors();
        results.assertPatient();
        //the birthdate should have been computed basing on the entered age
        Assert.assertEquals(ymdToDate(dateAsString(expectedBirthDate)), ymdToDate(dateAsString(results.getPatient()
                .getBirthdate())));
        results.assertEncounterEdited();
      }
    }.run();
  }
 
  /**
   * Tests that the birthdate value wins in case both the age and birthdate are provided
   *
   * @throws Exception
   */
  @Test
  public void testCreatePatientBirthdateByBirthdateAndAge() throws Exception {
   
    final Integer expectedAge = 40;
    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.YEAR, -expectedAge);
    final Date expectedBirthDate = cal.getTime();
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "editPatientBirthdateForm";
      }
     
      @Override
      public Patient getPatientToEdit() {
        return Context.getPatientService().getPatient(2);
      };
     
      @Override
      public boolean doViewEncounter() {
        return true;
      };
     
      @Override
      public Encounter getEncounterToView() {
        return Context.getEncounterService().getEncounter(101);
      }
     
      @Override
      public String[] widgetLabelsForEdit() {
        return new String[] { "Age:", "Birthdate:" };
      }
     
      @Override
      public void setupEditRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("Age:"), expectedAge.toString());
        request.setParameter(widgets.get("Birthdate:"), dateAsString(expectedBirthDate));
      }
     
      @Override
      public void testEditedResults(SubmissionResults results) {
        results.assertNoErrors();
        results.assertPatient();
        //the birthdate should have been computed basing on the entered birthdate
        Assert.assertEquals(ymdToDate(dateAsString(expectedBirthDate)), results.getPatient().getBirthdate());
        results.assertEncounterEdited();
      }
    }.run();
  }
 
 
 
  /**
   * Tests applying decimal ages to patients
   *
   * @throws Exception
   */
  @Test
  public void testCreatePatientBirthdateByBirthdateDecimalAge() throws Exception {
   
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "createPatientBirthdateByAgeForm";
      }
     
      @Override
      public Patient getPatientToEdit() {
        return Context.getPatientService().getPatient(2);
      };
     
      @Override
      public boolean doViewEncounter() {
        return true;
      };
     
      @Override
      public Encounter getEncounterToView() {
        return Context.getEncounterService().getEncounter(101);
      }
     
      @Override
      public String[] widgetLabelsForEdit() {
        return new String[] { "Age:" };
      }
     
      @Override
      public void setupEditRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("Age:"), "5.2");
      }
     
      @Override
      public void testEditedResults(SubmissionResults results) {
        results.assertNoErrors();
        results.assertPatient();
        //the birthdate should have been computed basing on the entered age
        long oneYear = Long.valueOf("31536000000");
        long oneMonth = Long.valueOf("2628000000");
        Assert.assertTrue(((new Date()).getTime() - oneYear*5) > results.getPatient().getBirthdate().getTime()); //birthdate is before 5 years ago
        Assert.assertTrue(((new Date()).getTime() - oneYear*5) < (results.getPatient().getBirthdate().getTime() + (4*oneMonth))); //birthdate + 4 months is greater than 5years ago
        results.assertEncounterEdited();
      }
    }.run();
  }
 
 
  /**
   * Tests that the birthdate works with any date format string. orininally replicated HTML-339
   *
   * @throws Exception
   */
  @Test
  public void testCreatePatientBirthdateByBirthdateAndAgeAgainstNonStandardDateFormat() throws Exception {
   
    GlobalProperty gp = new GlobalProperty(HtmlFormEntryConstants.GP_DATE_FORMAT, "MM-yyyy-dd");
    Context.getAdministrationService().saveGlobalProperty(gp);
    Context.getUserContext().setLocale(new Locale("en", "US"));
   
    final Integer expectedAge = 40;
    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.YEAR, -expectedAge);
    final Date expectedBirthDate = cal.getTime();
    new RegressionTestHelper() {
     
      @Override
      public String getFormName() {
        return "editPatientBirthdateForm";
      }
     
      @Override
      public Patient getPatientToEdit() {
        Patient p = Context.getPatientService().getPatient(2);
        return Context.getPatientService().getPatient(2);
      };
     
      @Override
      public boolean doViewEncounter() {
        return true;
      };
     
      @Override
      public Encounter getEncounterToView() {
        return Context.getEncounterService().getEncounter(101);
      }
     
      @Override
      public String[] widgetLabelsForEdit() {
        return new String[] {"Birthdate:" };
      }
     
      @Override
      public void setupEditRequest(MockHttpServletRequest request, Map<String, String> widgets) {
        request.setParameter(widgets.get("Birthdate:"), dateAsString(expectedBirthDate));
      }
     
      @Override
      public void testEditedResults(SubmissionResults results) {
        results.assertNoErrors();
        results.assertPatient();
        //the birthdate should have been computed basing on the entered birthdate
        Assert.assertEquals(ymdToDate(dateAsString(expectedBirthDate)), results.getPatient().getBirthdate());
        results.assertEncounterEdited();
      }
    }.run();
  }
 
 
 
  private void setupAddressTemplate() {
   
    GlobalProperty property = new GlobalProperty ("layout.address.format", "<org.openmrs.layout.web.address.AddressTemplate>" +
                                          "<nameMappings class=\"properties\">"+
                                          "<property name=\"postalCode\" value=\"Location.postalCode\"/>" +
                                          "<property name=\"address1\" value=\"Location.address1\"/>" +
                                          "<property name=\"stateProvince\" value=\"Location.stateProvince\"/>" +
                                          "<property name=\"cityVillage\" value=\"Location.cityVillage\"/>" +
                                          "</nameMappings>" +
                                          "<sizeMappings class=\"properties\">" +
                                          "<property name=\"postalCode\" value=\"10\"/>" +
                                          "<property name=\"address1\" value=\"40\"/>" +
                                          "<property name=\"stateProvince\" value=\"10\"/>" +
                                          "<property name=\"cityVillage\" value=\"10\"/>" +
                                          "</sizeMappings>" +           
                                              "<lineByLineFormat>" +
                                              "<string>address1</string>" +
                                              "<string>cityVillage stateProvince postalCode</string>" +
                                              "</lineByLineFormat>" +
                                              "</org.openmrs.layout.web.address.AddressTemplate>")
   
    Context.getAdministrationService().saveGlobalProperty(property);
   
  }
}
TOP

Related Classes of org.openmrs.module.htmlformentry.PatientTagTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.