@Test
  public void createNewOrderFromEtOrder() throws Exception {
    Provider provider = mock(Provider.class);
    handleEncounterProvider(provider);

    Concept mrsBloodConcept = mock(Concept.class);
    when(conceptService.getConceptByUuid("bloodConceptUuid")).thenReturn(mrsBloodConcept);

    Date currentDate = new Date();

    EncounterTransaction.Concept blood =
        new EncounterTransaction.Concept("bloodConceptUuid", "blood");

    EncounterTransaction.Order etOrder = new EncounterTransaction.Order();
    etOrder.setConcept(blood);
    etOrder.setDateCreated(currentDate);

    OpenMRSOrderMapper orderMapper = new OpenMRSOrderMapper(orderService, conceptService);

    Order order = orderMapper.map(etOrder, encounter);

    Assert.assertEquals(encounter, order.getEncounter());
    Assert.assertEquals(mrsBloodConcept, order.getConcept());
    Assert.assertEquals(provider, order.getOrderer());
  }
  @Test
  public void createRevisedOrderFromEtOrder() {
    Provider provider = mock(Provider.class);
    handleEncounterProvider(provider);

    Order originalOrder = new Order();
    when(orderService.getOrderByUuid("previousOrderUuid")).thenReturn(originalOrder);

    Date currentDate = new Date();

    EncounterTransaction.Order etOrder = new EncounterTransaction.Order();
    etOrder.setUuid(null);
    etOrder.setPreviousOrderUuid("previousOrderUuid");
    etOrder.setAutoExpireDate(currentDate);
    etOrder.setCommentToFulfiller("Comment");

    OpenMRSOrderMapper orderMapper = new OpenMRSOrderMapper(orderService, conceptService);

    Order order = orderMapper.map(etOrder, encounter);

    verify(orderService).getOrderByUuid("previousOrderUuid");
    Assert.assertEquals(encounter, order.getEncounter());
    Assert.assertEquals("Comment", order.getCommentToFulfiller());
    Assert.assertEquals(currentDate, order.getAutoExpireDate());
    Assert.assertEquals(provider, order.getOrderer());
  }
  @Test
  public void mapOrdersWithObs_shouldMapLabTestWithoutResultToLabOrderResult() {
    EncounterTransaction.Order order1 =
        createOrder("uuid1", "concept1", Order.Action.NEW.toString(), null);
    List<EncounterTransaction.Order> testOrders = Arrays.asList(order1);
    Map<String, Encounter> orderToEncounterMapping = new HashMap<>();
    orderToEncounterMapping.put(order1.getUuid(), encounter);

    List<LabOrderResult> results =
        labOrderResultsServiceImpl.mapOrdersWithObs(
            testOrders,
            new ArrayList<EncounterTransaction.Observation>(),
            orderToEncounterMapping,
            new HashMap(),
            new HashMap());

    assertEquals(1, results.size());
  }
  @Test
  public void mapOrdersWithObs_shouldMapAllObservationsToLabOrderResults() {
    EncounterTransaction.Order order1 =
        createOrder("uuid1", "concept1", Order.Action.NEW.toString(), null);
    EncounterTransaction.Order order2 =
        createOrder("uuid2", "concept2", Order.Action.REVISE.toString(), null);
    List<EncounterTransaction.Order> testOrders = Arrays.asList(order1, order2);
    EncounterTransaction.Observation order1_Obs1 = createObservation("obsuuid1", order1.getUuid());
    EncounterTransaction.Observation order1_Obs2 = createObservation("obsuuid2", order1.getUuid());
    EncounterTransaction.Observation order2_Obs1 = createObservation("obsuuid3", order2.getUuid());
    List<EncounterTransaction.Observation> observations =
        Arrays.asList(order1_Obs1, order1_Obs2, order2_Obs1);
    Map<String, Encounter> orderToEncounterMapping = new HashMap<>();
    orderToEncounterMapping.put(order1.getUuid(), encounter);
    orderToEncounterMapping.put(order2.getUuid(), encounter);
    Map<String, Encounter> observationToEncounterMapping = new HashMap<>();
    observationToEncounterMapping.put(order1_Obs1.getUuid(), encounter);
    observationToEncounterMapping.put(order1_Obs2.getUuid(), encounter);
    observationToEncounterMapping.put(order2_Obs1.getUuid(), encounter);

    List<LabOrderResult> results =
        labOrderResultsServiceImpl.mapOrdersWithObs(
            testOrders,
            observations,
            orderToEncounterMapping,
            observationToEncounterMapping,
            new HashMap());

    assertEquals(3, results.size());
  }
 private EncounterTransaction.Order createOrder(
     String uuid, String conceptName, String action, Date dateStopped) {
   EncounterTransaction.Order order = new EncounterTransaction.Order();
   EncounterTransaction.Concept concept = new EncounterTransaction.Concept();
   concept.setName(conceptName);
   order.setConcept(concept);
   order.setAction(action);
   order.setDateStopped(dateStopped);
   order.setUuid(uuid);
   order.setOrderType(LabOrderResultsServiceImpl.LAB_ORDER_TYPE);
   return order;
 }
 @Override
 public EncounterTransaction.Order mapOrder(Order order) {
   EncounterTransaction.Order emrOrder = new EncounterTransaction.Order();
   emrOrder.setUuid(order.getUuid());
   emrOrder.setConcept(conceptMapper.map(order.getConcept()));
   emrOrder.setOrderType(order.getOrderType().getName());
   emrOrder.setInstructions(order.getInstructions());
   emrOrder.setDateCreated(order.getDateCreated());
   emrOrder.setDateChanged(order.getDateChanged());
   emrOrder.setDateStopped(order.getDateStopped());
   emrOrder.setOrderNumber(order.getOrderNumber());
   emrOrder.setCommentToFulfiller(order.getCommentToFulfiller());
   emrOrder.setAction(order.getAction().name());
   org.openmrs.Order previousOrder = order.getPreviousOrder();
   if (previousOrder != null && StringUtils.isNotBlank(previousOrder.getUuid())) {
     emrOrder.setPreviousOrderUuid(previousOrder.getUuid());
   }
   return emrOrder;
 }