@Test
  public void shouldCreateNewEncounter() throws Exception {
    executeDataSet("shouldCreateMatchingEncounter.xml");

    String encounterDateTimeString = "2011-05-01T12:10:06.000+0530";
    Date encounterDateTime = new SimpleDateFormat(dateTimeFormat).parse(encounterDateTimeString);

    String json =
        "{ \"patientUuid\" : \"a76e8d23-0c38-408c-b2a8-ea5540f01b51\", "
            + "\"visitTypeUuid\" : \"b45ca846-c79a-11e2-b0c0-8e397087571c\", "
            + "\"encounterDateTime\" : \""
            + encounterDateTimeString
            + "\", "
            + "\"encounterTypeUuid\": \"2b377dba-62c3-4e53-91ef-b51c68899890\" }";

    EncounterTransaction response =
        deserialize(
            handle(newPostRequest("/rest/emrapi/encounter", json)), EncounterTransaction.class);

    assertEquals("1e5d5d48-6b78-11e0-93c3-18a905e044dc", response.getVisitUuid());

    Visit visit = visitService.getVisitByUuid(response.getVisitUuid());
    assertEquals(1, visit.getEncounters().size());
    Encounter encounter = visit.getEncounters().iterator().next();

    assertEquals("a76e8d23-0c38-408c-b2a8-ea5540f01b51", encounter.getPatient().getUuid());
    assertEquals("2b377dba-62c3-4e53-91ef-b51c68899890", encounter.getEncounterType().getUuid());
    assertEquals(encounterDateTime, encounter.getEncounterDatetime());
  }
  @Test
  public void shouldAddNewTestOrder() throws Exception {
    executeDataSet("shouldAddNewTestOrder.xml");

    String json =
        "{ \"patientUuid\" : \"a76e8d23-0c38-408c-b2a8-ea5540f01b51\", "
            + "\"visitTypeUuid\" : \"b45ca846-c79a-11e2-b0c0-8e397087571c\", "
            + "\"encounterTypeUuid\": \"2b377dba-62c3-4e53-91ef-b51c68899890\", "
            + "\"encounterDateTime\" : \"2005-01-02T00:00:00.000+0000\", "
            + "\"testOrders\":["
            + "{\"concept\": {\"uuid\": \"d102c80f-1yz9-4da3-bb88-8122ce8868dd\"}, \"instructions\":\"do it\", \"orderTypeUuid\": \"1a61ef2a-250c-11e3-b832-0800271c1b75\" }]}";

    EncounterTransaction response =
        deserialize(
            handle(newPostRequest("/rest/emrapi/encounter", json)), EncounterTransaction.class);

    Visit visit = visitService.getVisitByUuid(response.getVisitUuid());
    Encounter encounter = visit.getEncounters().iterator().next();

    assertEquals(1, encounter.getOrders().size());
    Order testOrder = encounter.getOrders().iterator().next();
    assertEquals("d102c80f-1yz9-4da3-bb88-8122ce8868dd", testOrder.getConcept().getUuid());
    assertEquals("a76e8d23-0c38-408c-b2a8-ea5540f01b51", testOrder.getPatient().getUuid());
    assertEquals("f13d6fae-baa9-4553-955d-920098bec08f", testOrder.getEncounter().getUuid());
    assertEquals("1a61ef2a-250c-11e3-b832-0800271c1b75", testOrder.getOrderType().getUuid());
    assertEquals("do it", testOrder.getInstructions());
  }
  @Test
  public void shouldGetAllEncounterTransactionsWhenDateNotProvided() throws Exception {
    executeDataSet("baseMetaData.xml");
    executeDataSet("dispositionMetaData.xml");
    executeDataSet("diagnosisMetaData.xml");
    executeDataSet("shouldGetEncounterTransactionByDate.xml");

    String firstEncounter =
        "{"
            + "\"patientUuid\" : \"a76e8d23-0c38-408c-b2a8-ea5540f01b51\", "
            + "\"visitTypeUuid\" : \"b45ca846-c79a-11e2-b0c0-8e397087571c\", "
            + "\"encounterTypeUuid\": \"4f3c2244-9d6a-439e-b88a-6e8873489ea7\", "
            + "\"encounterDateTime\" : \"2004-01-01T10:00:00.000+0000\" "
            + "}";
    EncounterTransaction encounter1Response =
        deserialize(
            handle(newPostRequest("/rest/emrapi/encounter", firstEncounter)),
            EncounterTransaction.class);
    String visitUuid = encounter1Response.getVisitUuid();

    List<EncounterTransaction> encounterTransactions =
        deserialize(
            handle(
                newGetRequest(
                    "/rest/emrapi/encounter",
                    new Parameter[] {
                      new Parameter("visitUuid", visitUuid), new Parameter("includeAll", "true")
                    })),
            new TypeReference<List<EncounterTransaction>>() {});

    assertEquals(1, encounterTransactions.size());
  }
  @Test
  public void shouldAddNewDrugOrder() throws Exception {
    executeDataSet("shouldAddNewDrugOrder.xml");

    String json =
        "{ \"patientUuid\" : \"a76e8d23-0c38-408c-b2a8-ea5540f01b51\", "
            + "\"visitTypeUuid\" : \"b45ca846-c79a-11e2-b0c0-8e397087571c\", "
            + "\"encounterTypeUuid\": \"2b377dba-62c3-4e53-91ef-b51c68899890\", "
            + "\"encounterDateTime\" : \"2005-01-02T00:00:00.000+0000\", "
            + "\"testOrders\":["
            + "{\"concept\":{ \"uuid\": \"d102c80f-1yz9-4da3-bb88-8122ce8868dd\"}, "
            + "\"instructions\":\"do it\", \"orderTypeUuid\": \"1a61ef2a-250c-11e3-b832-0800271c1b75\" }],"
            + "\"drugOrders\":["
            + "{\"uuid\": \"4d6fb6e0-4950-426c-9a9b-1f97e6037893\","
            + "\"concept\": {\"uuid\": \"29dc4a20-507f-40ed-9545-d47e932483fa\"},"
            + "\"notes\": \"Take as needed\","
            + "\"startDate\": \"2013-09-30T09:26:09.717Z\","
            + "\"endDate\": \"2013-10-02T09:26:09.717Z\","
            + "\"numberPerDosage\": 1,"
            + "\"dosageInstruction\": {\"uuid\": \"632aa422-2696-11e3-895c-0800271c1b75\"},"
            + "\"dosageFrequency\": {\"uuid\": \"6302096d-2696-11e3-895c-0800271c1b75\"},"
            + "\"prn\": true}"
            + "]}";

    EncounterTransaction response =
        deserialize(
            handle(newPostRequest("/rest/emrapi/encounter", json)), EncounterTransaction.class);

    Visit visit = visitService.getVisitByUuid(response.getVisitUuid());
    Encounter encounter = visit.getEncounters().iterator().next();
    assertEquals(2, encounter.getOrders().size());

    List<Order> orders = new ArrayList<Order>(encounter.getOrders());

    List<DrugOrder> drugOrders = getOrdersOfType(orders, DrugOrder.class);
    assertEquals(1, drugOrders.size());
    DrugOrder drugOrder = drugOrders.get(0);
    assertEquals("a76e8d23-0c38-408c-b2a8-ea5540f01b51", drugOrder.getPatient().getUuid());
    assertEquals("f13d6fae-baa9-4553-955d-920098bec08f", drugOrder.getEncounter().getUuid());
    assertEquals("29dc4a20-507f-40ed-9545-d47e932483fa", drugOrder.getConcept().getUuid());
    assertEquals("1a61ef2a-250c-11e3-b832-9876541c1b75", drugOrder.getOrderType().getUuid());
    assertEquals("Take as needed", drugOrder.getInstructions());
    assertEquals(new DateTime("2013-09-30T09:26:09.717Z").toDate(), drugOrder.getStartDate());
    assertEquals(new DateTime("2013-10-02T09:26:09.717Z").toDate(), drugOrder.getAutoExpireDate());
    assertEquals("6302096d-2696-11e3-895c-0800271c1b75", drugOrder.getFrequency());
    assertEquals("632aa422-2696-11e3-895c-0800271c1b75", drugOrder.getUnits());
    assertEquals("test drug", drugOrder.getDrug().getDisplayName());
    assertEquals(Double.valueOf(1), drugOrder.getDose());
    assertEquals(true, drugOrder.getPrn());

    List<TestOrder> testOrders = getOrdersOfType(orders, TestOrder.class);
    assertEquals(1, testOrders.size());
    TestOrder testOrder = testOrders.get(0);
    assertEquals("d102c80f-1yz9-4da3-bb88-8122ce8868dd", testOrder.getConcept().getUuid());
    assertEquals("a76e8d23-0c38-408c-b2a8-ea5540f01b51", testOrder.getPatient().getUuid());
    assertEquals("f13d6fae-baa9-4553-955d-920098bec08f", testOrder.getEncounter().getUuid());
    assertEquals("1a61ef2a-250c-11e3-b832-0800271c1b75", testOrder.getOrderType().getUuid());
    assertEquals("do it", testOrder.getInstructions());
  }
  @Test
  public void shouldUpdateMatchingEncounterWhenCustomMatchingStrategyIsProvided() throws Exception {
    executeDataSet("shouldUpdateMatchingEncounterWhenCustomMatchingStrategyIsProvided.xml");

    String json =
        "{ \"patientUuid\" : \"a76e8d23-0c38-408c-b2a8-ea5540f01b51\", "
            + "\"visitTypeUuid\" : \"b45ca846-c79a-11e2-b0c0-8e397087571c\", "
            + "\"encounterTypeUuid\": \"2b377dba-62c3-4e53-91ef-b51c68899890\" }";

    EncounterTransaction response =
        deserialize(
            handle(newPostRequest("/rest/emrapi/encounter", json)), EncounterTransaction.class);

    assertEquals("f13d6fae-baa9-4553-955d-920098bec08g", response.getEncounterUuid());
  }
  @Override
  public void forSave(Encounter encounter, EncounterTransaction encounterTransaction) {
    List<EncounterTransaction.Diagnosis> diagnoses = encounterTransaction.getDiagnoses();
    if (!diagnoses.isEmpty()) {
      Set<Obs> obsAtTopLevel = encounter.getObsAtTopLevel(false);
      Concept bahmniDiagnosisStatusConcept =
          bahmniDiagnosisMetadata.diagnosisSchemaContainsStatus()
              ? bahmniDiagnosisMetadata.getBahmniDiagnosisStatusConcept()
              : null;
      Concept bahmniInitialDiagnosisConcept =
          bahmniDiagnosisMetadata.getBahmniInitialDiagnosisConcept();
      Concept bahmniDiagnosisRevisedConcept =
          bahmniDiagnosisMetadata.getBahmniDiagnosisRevisedConcept();

      for (EncounterTransaction.Diagnosis diagnosis : diagnoses) {
        BahmniDiagnosisRequest bahmniDiagnosisRequest = (BahmniDiagnosisRequest) diagnosis;
        addExtraMetadata(
            obsAtTopLevel,
            bahmniDiagnosisRequest,
            bahmniInitialDiagnosisConcept,
            bahmniDiagnosisStatusConcept,
            bahmniDiagnosisRevisedConcept);
        updateRevisedFlagOfPreviousDiagnosis(bahmniDiagnosisRequest, bahmniDiagnosisRevisedConcept);
      }
    }
  }
  @Test
  public void shouldCreateVisitWhenNoVisitsAreActive() throws Exception {
    executeDataSet("shouldCreateVisitWhenNoVisitsAreActive.xml");

    String json =
        "{ \"patientUuid\" : \"a76e8d23-0c38-408c-b2a8-ea5540f01b51\", \"visitTypeUuid\" : \"b45ca846-c79a-11e2-b0c0-8e397087571c\","
            + "\"encounterTypeUuid\": \"2b377dba-62c3-4e53-91ef-b51c68899890\" }";

    EncounterTransaction response =
        deserialize(
            handle(newPostRequest("/rest/emrapi/encounter", json)), EncounterTransaction.class);

    Visit visit = visitService.getVisitByUuid(response.getVisitUuid());
    assertEquals("a76e8d23-0c38-408c-b2a8-ea5540f01b51", visit.getPatient().getUuid());
    assertEquals("b45ca846-c79a-11e2-b0c0-8e397087571c", visit.getVisitType().getUuid());
  }
  @Test
  public void shouldAddNewObservation() throws Exception {
    executeDataSet("shouldAddNewObservation.xml");
    String encounterDateTime = "2005-01-02T00:00:00.000+0000";
    String json =
        "{ \"patientUuid\" : \"a76e8d23-0c38-408c-b2a8-ea5540f01b51\", "
            + "\"visitTypeUuid\" : \"b45ca846-c79a-11e2-b0c0-8e397087571c\", "
            + "\"encounterTypeUuid\": \"2b377dba-62c3-4e53-91ef-b51c68899890\", "
            + "\"encounterDateTime\" : \""
            + encounterDateTime
            + "\", "
            + "\"observations\":["
            + "{\"concept\": {\"uuid\": \"d102c80f-1yz9-4da3-bb88-8122ce8868dd\"}, \"conceptName\":\"Should be Ignored\", \"value\":20}, "
            + "{\"concept\": {\"uuid\": \"8f8e7340-a067-11e3-a5e2-0800200c9a66\"}, \"value\": {\"uuid\": \"e7167090-a067-11e3-a5e2-0800200c9a66\"}}, "
            + "{\"concept\": {\"uuid\": \"e102c80f-1yz9-4da3-bb88-8122ce8868dd\"}, \"value\":\"text value\", \"comment\":\"overweight\"}]}";

    MockHttpServletResponse response1 = handle(newPostRequest("/rest/emrapi/encounter", json));

    EncounterTransaction response = deserialize(response1, EncounterTransaction.class);

    Visit visit = visitService.getVisitByUuid(response.getVisitUuid());
    Encounter encounter = visit.getEncounters().iterator().next();

    assertEquals(3, encounter.getObs().size());
    Iterator<Obs> obsIterator = encounter.getObs().iterator();

    Map<String, Obs> map = new HashMap<String, Obs>();
    while (obsIterator.hasNext()) {
      Obs obs = obsIterator.next();
      map.put(obs.getConcept().getDatatype().getHl7Abbreviation(), obs);
    }
    Obs textObservation = map.get(ConceptDatatype.TEXT);
    assertEquals("text value", textObservation.getValueText());
    assertEquals("a76e8d23-0c38-408c-b2a8-ea5540f01b51", textObservation.getPerson().getUuid());
    assertEquals("e102c80f-1yz9-4da3-bb88-8122ce8868dd", textObservation.getConcept().getUuid());
    assertEquals("f13d6fae-baa9-4553-955d-920098bec08f", textObservation.getEncounter().getUuid());
    assertEquals("overweight", textObservation.getComment());
    //        TODO : change the observation startTime logic to take current time as start time when
    // startTime is not passed by the client
    //        assertEquals(DateUtils.parseDate(encounterDateTime, dateTimeFormat),
    // textObservation.getObsDatetime());

    assertEquals(
        "e7167090-a067-11e3-a5e2-0800200c9a66",
        map.get(ConceptDatatype.CODED).getValueCoded().getUuid());
    assertEquals(new Double(20.0), map.get(ConceptDatatype.NUMERIC).getValueNumeric());
  }
  @Test
  public void shouldAddDiagnosesAdObservation() throws Exception {
    executeDataSet("baseMetaData.xml");
    executeDataSet("diagnosisMetaData.xml");
    executeDataSet("shouldAddDiagnosisAsObservation.xml");
    String cancerDiagnosisUuid = "d102c80f-1yz9-4da3-bb88-8122ce8868dh";
    String encounterDateTime = "2005-01-02T00:00:00.000+0000";
    String diagnosisDateTime = "2005-01-02T01:00:00.000+0000";
    String postData =
        "{"
            + "\"patientUuid\" : \"a76e8d23-0c38-408c-b2a8-ea5540f01b51\", "
            + "\"visitTypeUuid\" : \"b45ca846-c79a-11e2-b0c0-8e397087571c\", "
            + "\"encounterTypeUuid\": \"2b377dba-62c3-4e53-91ef-b51c68899891\", "
            + "\"encounterDateTime\" : \""
            + encounterDateTime
            + "\", "
            + "\"diagnoses\":["
            + "{\"order\":\"PRIMARY\", \"certainty\": \"CONFIRMED\", \"codedAnswer\": { \"uuid\": \""
            + cancerDiagnosisUuid
            + "\"}, \"diagnosisDateTime\": \""
            + diagnosisDateTime
            + "\" }"
            + "]"
            + "}";

    EncounterTransaction response =
        deserialize(
            handle(newPostRequest("/rest/emrapi/encounter", postData)), EncounterTransaction.class);

    Visit visit = visitService.getVisitByUuid(response.getVisitUuid());
    Encounter encounter = visit.getEncounters().iterator().next();

    Set<Obs> obsAtTopLevel = encounter.getObsAtTopLevel(false);
    assertEquals(1, obsAtTopLevel.size());
    Obs parentObservation = obsAtTopLevel.iterator().next();
    assertTrue(parentObservation.isObsGrouping());
    assertEquals(
        DateUtils.parseDate(diagnosisDateTime, dateTimeFormat), parentObservation.getObsDatetime());

    Set<Obs> diagnosisObservationGroupMembers = parentObservation.getGroupMembers();
    assertEquals(3, diagnosisObservationGroupMembers.size());
    ArrayList<String> valueCodedNames = getValuCodedNames(diagnosisObservationGroupMembers);
    assertTrue(valueCodedNames.contains("Confirmed"));
    assertTrue(valueCodedNames.contains("Primary"));
    assertTrue(valueCodedNames.contains("Cancer"));
  }
  @Test
  public void shouldAddNewObservationGroup() throws Exception {
    executeDataSet("shouldAddNewObservation.xml");
    String encounterDateTime = "2005-01-02T00:00:00.000+0000";
    String observationTime = "2005-01-02T12:00:00.000+0000";
    String json =
        "{ \"patientUuid\" : \"a76e8d23-0c38-408c-b2a8-ea5540f01b51\", "
            + "\"visitTypeUuid\" : \"b45ca846-c79a-11e2-b0c0-8e397087571c\", "
            + "\"encounterTypeUuid\": \"2b377dba-62c3-4e53-91ef-b51c68899890\", "
            + "\"encounterDateTime\" : \""
            + encounterDateTime
            + "\", "
            + "\"observations\":["
            + "{\"concept\":{\"uuid\": \"e102c80f-1yz9-4da3-bb88-8122ce8868dd\"}, "
            + " \"groupMembers\" : [{\"concept\":{\"uuid\": \"d102c80f-1yz9-4da3-bb88-8122ce8868dd\"}, \"value\":20, \"comment\":\"overweight\", \"observationDateTime\": \""
            + observationTime
            + "\"}] }"
            + "]}";

    EncounterTransaction response =
        deserialize(
            handle(newPostRequest("/rest/emrapi/encounter", json)), EncounterTransaction.class);

    Visit visit = visitService.getVisitByUuid(response.getVisitUuid());
    Encounter encounter = (Encounter) visit.getEncounters().toArray()[0];

    assertEquals(1, encounter.getObs().size());
    Obs obs = (Obs) encounter.getAllObs().toArray()[0];
    assertEquals("e102c80f-1yz9-4da3-bb88-8122ce8868dd", obs.getConcept().getUuid());

    assertEquals(1, obs.getGroupMembers().size());
    Obs member = obs.getGroupMembers().iterator().next();
    assertEquals("d102c80f-1yz9-4da3-bb88-8122ce8868dd", member.getConcept().getUuid());
    assertEquals(new Double(20.0), member.getValueNumeric());
    assertEquals("a76e8d23-0c38-408c-b2a8-ea5540f01b51", member.getPerson().getUuid());
    assertEquals("f13d6fae-baa9-4553-955d-920098bec08f", member.getEncounter().getUuid());
    assertEquals("overweight", member.getComment());
    assertEquals(
        new SimpleDateFormat(dateTimeFormat).parse(observationTime), member.getObsDatetime());
  }
  @Test
  public void filterTestOrders_shouldNotFilterByConcept() throws Exception {
    Map<String, Encounter> encounterTestOrderUuidMap = new HashMap<>();
    EncounterTransaction.Order order1 =
        createOrder("uuid1", "concept1", Order.Action.NEW.toString(), null);
    when(encounterTransaction.getOrders()).thenReturn(Arrays.asList(order1));

    List<EncounterTransaction.Order> orders =
        labOrderResultsServiceImpl.filterTestOrders(
            encounterTransaction, encounter, encounterTestOrderUuidMap, null);

    assertEquals(1, orders.size());
  }
  @Test
  public void shouldUpdateObservations() throws Exception {
    executeDataSet("shouldUpdateObservations.xml");

    String json =
        "{ \"patientUuid\" : \"a76e8d23-0c38-408c-b2a8-ea5540f01b51\", "
            + "\"visitTypeUuid\" : \"b45ca846-c79a-11e2-b0c0-8e397087571c\", "
            + "\"encounterTypeUuid\": \"2b377dba-62c3-4e53-91ef-b51c68899890\","
            + "\"encounterDateTime\" : \"2013-01-01T00:00:00.000+0000\", "
            + "\"observations\":["
            + "{\"uuid\":\"z9fb7f47-e80a-4056-9285-bd798be13c63\", "
            + " \"groupMembers\" : [{\"uuid\":\"ze48cdcb-6a76-47e3-9f2e-2635032f3a9a\", \"value\":20, \"comment\":\"new gc\" }] }, "
            + "{\"uuid\":\"zf616900-5e7c-4667-9a7f-dcb260abf1de\", \"comment\" : \"new c\", \"value\":100 }"
            + "]}";

    EncounterTransaction response =
        deserialize(
            handle(newPostRequest("/rest/emrapi/encounter", json)), EncounterTransaction.class);

    Visit visit = visitService.getVisitByUuid(response.getVisitUuid());
    Encounter encounter = (Encounter) visit.getEncounters().toArray()[0];

    assertEquals(2, encounter.getObsAtTopLevel(false).size());
    Iterator<Obs> iterator = encounter.getObsAtTopLevel(false).iterator();

    Obs obs1 = iterator.next();
    assertEquals("zf616900-5e7c-4667-9a7f-dcb260abf1de", obs1.getUuid());
    assertEquals(new Double(100), obs1.getValueNumeric());
    assertEquals("new c", obs1.getComment());

    Obs obs2 = iterator.next();
    assertEquals("z9fb7f47-e80a-4056-9285-bd798be13c63", obs2.getUuid());
    assertEquals(1, obs2.getGroupMembers().size());
    Obs member = obs2.getGroupMembers().iterator().next();
    assertEquals(new Double(20), member.getValueNumeric());
    assertEquals("new gc", member.getComment());
  }
  @Test
  public void filterTestOrders_EvenWhenTheyAreDiscontinued() throws Exception {
    List<String> concepts = Arrays.asList("concept1", "concept2", "concept3");
    Map<String, Encounter> encounterTestOrderUuidMap = new HashMap<>();
    EncounterTransaction.Order order1 =
        createOrder("uuid1", "concept1", Order.Action.NEW.toString(), null);
    EncounterTransaction.Order order2 =
        createOrder("uuid2", "concept2", Order.Action.REVISE.toString(), null);
    EncounterTransaction.Order order3 =
        createOrder("uuid3", "concept3", Order.Action.NEW.toString(), new Date());
    when(encounterTransaction.getOrders()).thenReturn(Arrays.asList(order1, order2, order3));

    List<EncounterTransaction.Order> orders =
        labOrderResultsServiceImpl.filterTestOrders(
            encounterTransaction, encounter, encounterTestOrderUuidMap, concepts);

    assertEquals(3, orders.size());
  }
  @Test
  public void shouldGetEncounterTransactionByDate() throws Exception {
    executeDataSet("baseMetaData.xml");
    executeDataSet("dispositionMetaData.xml");
    executeDataSet("diagnosisMetaData.xml");
    executeDataSet("shouldGetEncounterTransactionByDate.xml");
    String dispositionDateTime = "2005-01-01T01:00:00.000+0000";
    String encounter1PostData =
        "{"
            + "\"patientUuid\" : \"a76e8d23-0c38-408c-b2a8-ea5540f01b51\", "
            + "\"visitTypeUuid\" : \"b45ca846-c79a-11e2-b0c0-8e397087571c\", "
            + "\"encounterTypeUuid\": \"4f3c2244-9d6a-439e-b88a-6e8873489ea7\", "
            + "\"encounterDateTime\" : \"2004-01-01T10:00:00.000+0000\" "
            + "}";
    EncounterTransaction encounter1Response =
        deserialize(
            handle(newPostRequest("/rest/emrapi/encounter", encounter1PostData)),
            EncounterTransaction.class);
    String cancerDiagnosisUuid = "d102c80f-1yz9-4da3-bb88-8122ce8868dh";
    String malariaDiagnosisUuid = "604dcce9-bcd9-48a8-b2f5-112743cf1db8";
    String visitUuid = encounter1Response.getVisitUuid();
    String encounter2PostData =
        "{"
            + "\"patientUuid\" : \"a76e8d23-0c38-408c-b2a8-ea5540f01b51\", "
            + "\"visitTypeUuid\" : \"b45ca846-c79a-11e2-b0c0-8e397087571c\", "
            + "\"visitUuid\": \""
            + visitUuid
            + "\", "
            + "\"encounterTypeUuid\": \"2b377dba-62c3-4e53-91ef-b51c68899891\", "
            + "\"encounterDateTime\" : \"2005-01-01T10:00:00.000+0000\", "
            + "\"observations\":["
            + "{\""
            + "concept\":{\"uuid\": \"4f3c2244-9d6a-439e-b88a-6e8873489ea7\"}, "
            + "\"groupMembers\" : [{\"concept\":{\"uuid\": \"82e5f23e-e0b3-4e53-b6bb-c09c1c7fb8b0\"}, \"value\":20, \"comment\":\"overweight\" }] "
            + "}"
            + "],"
            + "\"diagnoses\":["
            + "{\"order\":\"PRIMARY\", \"certainty\": \"CONFIRMED\", \"codedAnswer\": { \"uuid\": \""
            + cancerDiagnosisUuid
            + "\"} },"
            + "{\"order\":\"PRIMARY\", \"certainty\": \"CONFIRMED\", \"codedAnswer\": { \"uuid\": \""
            + malariaDiagnosisUuid
            + "\"} }"
            + "], "
            + "\"disposition\": {"
            + "    \"code\": \"ADMIT\","
            + "    \"dispositionDateTime\": \""
            + dispositionDateTime
            + "\","
            + "    \"additionalObs\": ["
            + "        {"
            + "            \"value\": \"Admit him to ICU.\","
            + "            \"concept\": {"
            + "                \"uuid\": \"9169366f-3c7f-11e3-8f4c-005056823ee5\","
            + "                \"name\": \"Disposition Note\""
            + "            }"
            + "        }"
            + "    ]"
            + "}"
            + "}";
    EncounterTransaction encounter2Response =
        deserialize(
            handle(newPostRequest("/rest/emrapi/encounter", encounter2PostData)),
            EncounterTransaction.class);
    assertEquals(encounter1Response.getVisitUuid(), encounter2Response.getVisitUuid());
    assertNotEquals(encounter1Response.getEncounterUuid(), encounter2Response.getEncounterUuid());

    List<EncounterTransaction> encounterTransactions =
        deserialize(
            handle(
                newGetRequest(
                    "/rest/emrapi/encounter",
                    new Parameter[] {
                      new Parameter("visitUuid", visitUuid),
                      new Parameter("encounterDate", "2005-01-01"),
                      new Parameter("includeAll", "false")
                    })),
            new TypeReference<List<EncounterTransaction>>() {});

    assertEquals(1, encounterTransactions.size());
    EncounterTransaction fetchedEncounterTransaction = encounterTransactions.get(0);
    assertEquals(visitUuid, fetchedEncounterTransaction.getVisitUuid());
    assertEquals(
        "a76e8d23-0c38-408c-b2a8-ea5540f01b51", fetchedEncounterTransaction.getPatientUuid());
    assertEquals(
        "b45ca846-c79a-11e2-b0c0-8e397087571c", fetchedEncounterTransaction.getVisitTypeUuid());
    assertEquals(
        "2b377dba-62c3-4e53-91ef-b51c68899891", fetchedEncounterTransaction.getEncounterTypeUuid());
    assertEquals(
        "2005-01-01",
        new SimpleDateFormat("yyyy-MM-dd")
            .format(fetchedEncounterTransaction.getEncounterDateTime()));
    // Assert Observations
    assertEquals(1, fetchedEncounterTransaction.getObservations().size());
    assertEquals(
        "4f3c2244-9d6a-439e-b88a-6e8873489ea7",
        fetchedEncounterTransaction.getObservations().get(0).getConcept().getUuid());
    assertEquals(1, fetchedEncounterTransaction.getObservations().get(0).getGroupMembers().size());
    assertEquals(
        "82e5f23e-e0b3-4e53-b6bb-c09c1c7fb8b0",
        fetchedEncounterTransaction
            .getObservations()
            .get(0)
            .getGroupMembers()
            .get(0)
            .getConcept()
            .getUuid());
    assertEquals(
        20.0,
        fetchedEncounterTransaction.getObservations().get(0).getGroupMembers().get(0).getValue());
    // Assert Diagnosis data
    assertEquals(2, fetchedEncounterTransaction.getDiagnoses().size());
    EncounterTransaction.Diagnosis cancerDiagnosis =
        getDiagnosisByUuid(fetchedEncounterTransaction.getDiagnoses(), cancerDiagnosisUuid);
    assertNotNull(cancerDiagnosis);
    assertEquals("PRIMARY", cancerDiagnosis.getOrder());
    assertEquals("CONFIRMED", cancerDiagnosis.getCertainty());
    assertEquals(cancerDiagnosisUuid, cancerDiagnosis.getCodedAnswer().getUuid());
    assertNotNull(
        getDiagnosisByUuid(fetchedEncounterTransaction.getDiagnoses(), malariaDiagnosisUuid));
    // Assert Disposition data
    EncounterTransaction.Disposition fetchedDisposition =
        fetchedEncounterTransaction.getDisposition();
    assertEquals("ADMIT", fetchedDisposition.getCode());
    assertEquals(
        DateUtils.parseDate(dispositionDateTime, dateTimeFormat),
        fetchedDisposition.getDispositionDateTime());
    assertNotNull(fetchedDisposition.getExistingObs());
    assertEquals(1, fetchedDisposition.getAdditionalObs().size());
    assertEquals("Admit him to ICU.", fetchedDisposition.getAdditionalObs().get(0).getValue());
    assertEquals(
        "Disposition Note", fetchedDisposition.getAdditionalObs().get(0).getConcept().getName());
  }