@Test
public void testGetTherapiesForDocumentation()
{

  final DateTime when = new DateTime(2014, 6, 16, 12, 0, 0);
  //mock
  final MedicationDto medicationDto1 = new MedicationDto();
  medicationDto1.setId(1L);
  medicationDto1.setName("Lekadol 20x500mg");
  final HibernateMedicationsDao medicationsDaoMock = mock(HibernateMedicationsDao.class);
  medicationsBo.setMedicationsDao(medicationsDaoMock);
  final MedicationRouteDto route = new MedicationRouteDto();
  route.setName("route1");
  route.setId(1L);
  final MedicationRouteDto route2 = new MedicationRouteDto();
  route2.setName("route2");
  route2.setId(2L);
  final Map<Long, MedicationRouteDto> routes = new HashMap<>();
  routes.put(2L, route2);
  routes.put(1L, route);
  Mockito.when(medicationRoutesValueHolder.getValue()).thenReturn(routes);
  final Map<Long, MedicationDataForTherapyDto> medicationsDataMap = new HashMap<>();
  final MedicationDataForTherapyDto medicationData1 = new MedicationDataForTherapyDto();
  medicationData1.setGenericName("Paracetamol");
  medicationData1.setCustomGroupName("Group 1");
  medicationData1.setAtcGroupCode("ATC 1");
  medicationsDataMap.put(1L, medicationData1);
  //similar to admission
  final MedicationOrderComposition composition1 =
      MedicationsTestUtils.buildTestMedicationOrderComposition("uid1::1", new DateTime(2013, 11, 11, 0, 0, 0), "aaa");
  final MedicationInstructionInstruction instruction1 =
      MedicationsTestUtils.buildTestMedicationInstruction("MedicationInstructionInstruction 1");
  composition1.getMedicationDetail().getMedicationInstruction().add(instruction1);
  final OrderActivity orderActivity1 =
      MedicationsTestUtils.buildTestOrderActivity(
          "Lekadol", 1L, 500.0, "mg", null, null, null, null, 1L, "ORAL", "1", "TBL");
  instruction1.getOrder().add(orderActivity1);
  final MedicationTimingCluster medicationTiming1 =
      MedicationsTestUtils.buildMedicationTimingCluster(
          2L, null, null, null, new DateTime(2014, 6, 9, 13, 0, 0), new DateTime(2014, 6, 11, 13, 0, 0), null);
  orderActivity1.setMedicationTiming(medicationTiming1);
  final List<Pair<MedicationOrderComposition, MedicationInstructionInstruction>> instructionPairs1 = new ArrayList<>();
  instructionPairs1.add(Pair.of(composition1, instruction1));
  final DocumentationTherapiesDto groups1 =
      medicationsBo.getTherapiesForDocumentation(
          null,
          null,
          Intervals.infiniteFrom(new DateTime(2014, 6, 9, 12, 0, 0)),
          instructionPairs1,
          medicationsDataMap,
          false,
          when,
          new Locale("en"));
  assertEquals(1L, groups1.getAdmissionTherapies().size());
  //similar to discharge
  final MedicationOrderComposition composition2 =
      MedicationsTestUtils.buildTestMedicationOrderComposition("uid1::1", new DateTime(2013, 11, 11, 0, 0, 0), "aaa");
  final MedicationInstructionInstruction instruction2 =
      MedicationsTestUtils.buildTestMedicationInstruction("MedicationInstructionInstruction 1");
  composition2.getMedicationDetail().getMedicationInstruction().add(instruction2);
  final OrderActivity orderActivity2 =
      MedicationsTestUtils.buildTestOrderActivity(
          "Lekadol", 1L, 1000.0, "mg", null, null, null, null, 1L, "ORAL", "1", "TBL");
  instruction2.getOrder().add(orderActivity2);
  final MedicationTimingCluster medicationTiming2 =
      MedicationsTestUtils.buildMedicationTimingCluster(
          2L, null, null, null, new DateTime(2014, 6, 11, 13, 0, 0), new DateTime(2014, 6, 12, 13, 0, 0), null);
  orderActivity2.setMedicationTiming(medicationTiming2);
  instructionPairs1.add(Pair.of(composition2, instruction2));
  final DocumentationTherapiesDto groups2 =
      medicationsBo.getTherapiesForDocumentation(
          null,
          null,
          Intervals.infiniteFrom(new DateTime(2014, 6, 9, 12, 0, 0)),
          instructionPairs1,
          medicationsDataMap,
          false,
          when,
          new Locale("en"));
  assertEquals(1L, groups2.getAdmissionTherapies().size());
  //linked to discharge
  final MedicationOrderComposition composition3 =
      MedicationsTestUtils.buildTestMedicationOrderComposition("uid1::1", new DateTime(2013, 11, 11, 0, 0, 0), "aaa");
  final MedicationInstructionInstruction instruction3 =
      MedicationsTestUtils.buildTestMedicationInstruction("MedicationInstructionInstruction 1");
  composition3.getMedicationDetail().getMedicationInstruction().add(instruction3);
  final OrderActivity orderActivity3 =
      MedicationsTestUtils.buildTestOrderActivity(
          "Lekadol", 1L, 500.0, "mg", null, null, null, null, 1L, "ORAL", "1", "TBL");
  instruction3.getOrder().add(orderActivity3);
  final MedicationTimingCluster medicationTiming3 =
      MedicationsTestUtils.buildMedicationTimingCluster(
          2L, null, null, null, new DateTime(2014, 6, 12, 10, 0, 0), null, null);
  orderActivity3.setMedicationTiming(medicationTiming3);
  final List<Pair<MedicationOrderComposition, MedicationInstructionInstruction>> instructionPairs2 = new ArrayList<>();
  instructionPairs2.add(Pair.of(composition2, instruction2));
  instructionPairs2.add(Pair.of(composition3, instruction3));
  final DocumentationTherapiesDto groups3 =
      medicationsBo.getTherapiesForDocumentation(
          null,
          null,
          Intervals.infiniteFrom(new DateTime(2014, 6, 9, 12, 0, 0)),
          instructionPairs2,
          medicationsDataMap,
          false,
          when,
          new Locale("en"));
  assertEquals(1L, groups3.getDischargeTherapies().size());
  assertEquals(0L, groups3.getAdmissionTherapies().size());
  final DocumentationTherapiesDto groups4 =
      medicationsBo.getTherapiesForDocumentation(
          null,
          null,
          new Interval(new DateTime(2014, 6, 9, 12, 0, 0), new DateTime(2014, 6, 18, 12, 0, 0)),
          instructionPairs2,
          medicationsDataMap,
          false,
          when,
          new Locale("en"));
  assertEquals(1L, groups4.getDischargeTherapies().size());
  assertEquals(0L, groups4.getTherapies().size());
  //linked regular
  final MedicationOrderComposition composition4 =
      MedicationsTestUtils.buildTestMedicationOrderComposition("uid1::1", new DateTime(2013, 11, 11, 0, 0, 0), "aaa");
  final MedicationInstructionInstruction instruction4 =
      MedicationsTestUtils.buildTestMedicationInstruction("MedicationInstructionInstruction 1");
  composition4.getMedicationDetail().getMedicationInstruction().add(instruction4);
  final OrderActivity orderActivity4 =
      MedicationsTestUtils.buildTestOrderActivity(
          "Lekadol", 1L, 500.0, "mg", null, null, null, null, 1L, "ORAL", "1", "TBL");
  instruction4.getOrder().add(orderActivity4);
  final MedicationTimingCluster medicationTiming4 =
      MedicationsTestUtils.buildMedicationTimingCluster(
          2L, null, null, null, new DateTime(2014, 6, 12, 10, 0, 0), new DateTime(2014, 6, 15, 10, 0, 0), null);
  orderActivity4.setMedicationTiming(medicationTiming4);
  final List<Pair<MedicationOrderComposition, MedicationInstructionInstruction>> instructionPairs4 = new ArrayList<>();
  final Link linkToInstruction11 =
      OpenEhrRefUtils.getLinkToTdoTarget("update", EhrLinkType.UPDATE.getName(), composition2, instruction2);
  instruction2.getLinks().add(linkToInstruction11);
  final Link linkToInstruction22 =
      OpenEhrRefUtils.getLinkToTdoTarget("update", EhrLinkType.UPDATE.getName(), composition4, instruction4);
  instruction3.getLinks().add(linkToInstruction22);
  instructionPairs4.add(Pair.of(composition2, instruction2));
  instructionPairs4.add(Pair.of(composition4, instruction4));
  final DocumentationTherapiesDto groups5 =
      medicationsBo.getTherapiesForDocumentation(
          null,
          null,
          new Interval(new DateTime(2014, 6, 9, 12, 0, 0), new DateTime(2014, 6, 18, 12, 0, 0)),
          instructionPairs4,
          medicationsDataMap,
          false,
          when,
          new Locale("en"));
  assertEquals(1L, groups5.getTherapies().size());
}