@Test
  public void testParsingDispositionWithDateOfDeath() throws Exception {
    Concept admit =
        new ConceptBuilder(
                null,
                conceptService.getConceptDatatypeByName("N/A"),
                conceptService.getConceptClassByName("Misc"))
            .addName("Death")
            .get();
    when(emrConceptService.getConcept("test:death")).thenReturn(admit);

    Obs dispositionObs =
        dispositionDescriptor.buildObsGroup(
            new Disposition(
                "emrapi.death",
                "Death",
                "test:death",
                Collections.<String>emptyList(),
                Collections.<DispositionObs>emptyList()),
            emrConceptService);

    Date dateOfDeath = new DateTime(2012, 2, 20, 10, 10, 10).toDate();
    Obs dateOfDeathObs = new Obs();
    dateOfDeathObs.setObsId(100);
    dateOfDeathObs.setConcept(dispositionDescriptor.getDateOfDeathConcept());
    dateOfDeathObs.setValueDate(dateOfDeath);
    dispositionObs.addGroupMember(dateOfDeathObs);

    encounter.addObs(doNotGoToServiceToFormatMembers(dispositionObs));
    ParsedObs parsed = parser.parseObservations(Locale.ENGLISH);

    SimpleObject expectedAdmissionLocationObject =
        SimpleObject.create("obsId", dateOfDeathObs.getObsId());
    expectedAdmissionLocationObject.put("question", "Date of death");
    expectedAdmissionLocationObject.put("answer", "20 Feb 2012 10:10 AM");

    List<SimpleObject> expectedAdditionalObsList = new ArrayList<SimpleObject>();
    expectedAdditionalObsList.add(expectedAdmissionLocationObject);

    assertThat(parsed.getDiagnoses().size(), is(0));
    assertThat(parsed.getDispositions().size(), is(1));
    assertThat(parsed.getObs().size(), is(0));
    assertThat(path(parsed.getDispositions(), 0, "disposition"), is((Object) "Death"));
    assertThat(
        path(parsed.getDispositions(), 0, "additionalObs"), is((Object) expectedAdditionalObsList));
  }
 static Obs jsonObservationToObs(
     Object jsonObservation, Patient patient, Date encounterTime, Location location) {
   Map observationObject = (Map) jsonObservation;
   String questionUuid = (String) observationObject.get(QUESTION_UUID);
   ConceptService conceptService = Context.getConceptService();
   Concept questionConcept = conceptService.getConceptByUuid(questionUuid);
   if (questionConcept == null) {
     log.warn("Question concept not found: " + questionUuid);
     return null;
   }
   Obs obs = new Obs(patient, questionConcept, encounterTime, location);
   String answerUuid = (String) observationObject.get(ANSWER_UUID);
   String answerDate = (String) observationObject.get(ANSWER_DATE);
   String answerNumber = (String) observationObject.get(ANSWER_NUMBER);
   if (answerUuid != null) {
     Concept answerConcept = conceptService.getConceptByUuid(answerUuid);
     if (answerConcept == null) {
       log.warn("Answer concept not found: " + answerUuid);
       return null;
     }
     obs.setValueCoded(answerConcept);
   } else if (answerDate != null) {
     try {
       obs.setValueDate(Utils.YYYYMMDD_UTC_FORMAT.parse(answerDate));
     } catch (ParseException e) {
       log.warn("Invalid date answer: " + answerDate);
       return null;
     }
   } else if (observationObject.containsKey(ANSWER_NUMBER)) {
     try {
       obs.setValueNumeric(Double.parseDouble(answerNumber));
     } catch (IllegalArgumentException e) {
       log.warn("Invalid numeric answer: " + answerUuid);
       return null;
     }
   } else {
     log.warn("Invalid answer type: " + observationObject);
     return null;
   }
   return obs;
 }
  @Test
  public void shouldSubmitEDConsultNoteWithAdditionalObservationsOfTypeDate() throws Exception {
    int primaryConceptNameId = 2460;

    String diagnosisJson =
        "{ \"certainty\": \"PRESUMED\", \"diagnosisOrder\": \"PRIMARY\", \"diagnosis\": \""
            + CodedOrFreeTextAnswer.CONCEPT_NAME_PREFIX
            + primaryConceptNameId
            + "\" }";

    String additionalObsJson =
        "{ \"concept\": \"uuid-123\", \"value\": \"2013-05-21 17:23:47\", \"datatype\": \"Date\"}";

    Concept conceptFor2460 = new Concept();
    final ConceptName conceptName2460 = new ConceptName();
    conceptName2460.setConcept(conceptFor2460);

    when(conceptService.getConceptName(primaryConceptNameId)).thenReturn(conceptName2460);

    final Concept conceptForAdditionalObs = new Concept();
    conceptForAdditionalObs.setUuid("uuid-123");
    Calendar calendar = new GregorianCalendar(2013, 04, 21, 17, 23, 47);
    final Date dateForAdditionalObs = calendar.getTime();

    when(conceptService.getConceptByUuid("uuid-123")).thenReturn(conceptForAdditionalObs);

    Patient patient = new Patient();
    patient.addName(new PersonName("Jean", "Paul", "Marie"));
    final Location sessionLocation = new Location();
    final Provider currentProvider = new Provider();

    DispositionFactory dispositionFactory = mock(DispositionFactory.class);

    EmrContext emrContext = new EmrContext();
    emrContext.setSessionLocation(sessionLocation);
    emrContext.setCurrentProvider(currentProvider);

    MockHttpSession httpSession = new MockHttpSession();
    MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
    ConsultPageController controller = new ConsultPageController();
    String result =
        controller.post(
            patient,
            asList(diagnosisJson),
            "",
            asList(additionalObsJson),
            "",
            httpSession,
            httpServletRequest,
            consultService,
            conceptService,
            dispositionFactory,
            emrContext,
            new TestUiUtils());

    final Obs traumaObs = new Obs();
    traumaObs.setConcept(conceptForAdditionalObs);
    traumaObs.setValueDate(dateForAdditionalObs);

    verify(consultService)
        .saveConsultNote(
            argThat(
                new ArgumentMatcher<ConsultNote>() {
                  @Override
                  public boolean matches(Object o) {
                    ConsultNote actual = (ConsultNote) o;
                    Obs actualObs = actual.getAdditionalObs().get(0);
                    return containsInAnyOrder(
                                new Diagnosis(
                                    new CodedOrFreeTextAnswer(conceptName2460),
                                    Diagnosis.Order.PRIMARY))
                            .matches(actual.getDiagnoses())
                        && actual.getAdditionalObs().size() == 1
                        && actualObs.getConcept() == conceptForAdditionalObs
                        && actualObs.getValueDate().equals(dateForAdditionalObs);
                  }
                }));
  }