@Test
  public void shouldNotCheckLimitationWhenIgnoreLimitationVariableIsTrue() {
    when(clinicDataService.findById(1l)).thenReturn(clinic);
    when(volunteerDataService.create(any(Volunteer.class))).thenReturn(new Volunteer());
    List<Screening> screenings =
        new ArrayList<>(
            Arrays.asList(
                createScreeningVisit(
                    2l, clinic, new LocalDate(2217, 1, 1), new Time(10, 0), new Time(11, 0)),
                createScreeningVisit(
                    3l, clinic, new LocalDate(2217, 1, 1), new Time(9, 0), new Time(10, 0))));

    when(screeningDataService.findByClinicIdAndDateAndStatus(
            1l, new LocalDate(2217, 1, 1), ScreeningStatus.ACTIVE))
        .thenReturn(screenings);

    ScreeningDto screeningDto = createScreeningDto("1", "1", "2217-1-1", "12:00");
    Screening screening = new Screening();
    screening.setId(1l);

    screeningService.add(screeningDto, true);

    verify(visitLimitationHelper, never())
        .checkCapacityForScreening(any(LocalDate.class), any(Clinic.class), anyLong());
    verify(screeningDataService, times(1)).create(any(Screening.class));
  }
  @Test
  public void shouldCheckCapacityLimitFirst() {
    when(clinicDataService.findById(1l)).thenReturn(clinic);
    when(volunteerDataService.create(any(Volunteer.class))).thenReturn(new Volunteer());
    List<Screening> screenings =
        new ArrayList<>(
            Arrays.asList(
                createScreeningVisit(
                    2l, clinic, new LocalDate(2217, 1, 1), new Time(10, 0), new Time(11, 0)),
                createScreeningVisit(
                    3l, clinic, new LocalDate(2217, 1, 1), new Time(9, 0), new Time(10, 0))));

    when(screeningDataService.findByClinicIdAndDateAndStatus(
            1l, new LocalDate(2217, 1, 1), ScreeningStatus.ACTIVE))
        .thenReturn(screenings);

    doThrow(
            new LimitationExceededException(
                "The clinic capacity limit for this day has been reached"))
        .when(visitLimitationHelper)
        .checkCapacityForScreening(any(LocalDate.class), any(Clinic.class), anyLong());

    ScreeningDto screeningDto = createScreeningDto("1", "1", "2217-1-1", "12:00");
    Screening screening = new Screening();
    screening.setId(1l);

    thrown.expect(LimitationExceededException.class);
    thrown.expectMessage("The clinic capacity limit for this day has been reached");
    screeningService.add(screeningDto, false);
  }
  @Test
  public void shouldThrowLimitationExceededExceptionWhenNumberOfRoomsLimitIsReached() {
    when(clinicDataService.findById(1l)).thenReturn(clinic);
    when(volunteerDataService.create(any(Volunteer.class))).thenReturn(new Volunteer());
    List<Screening> screenings =
        new ArrayList<>(
            Arrays.asList(
                createScreeningVisit(
                    2l, clinic, new LocalDate(2217, 1, 1), new Time(11, 0), new Time(12, 0))));

    when(screeningDataService.findByClinicIdAndDateAndStatus(
            1l, new LocalDate(2217, 1, 1), ScreeningStatus.ACTIVE))
        .thenReturn(screenings);

    ScreeningDto screeningDto = createScreeningDto("1", "1", "2217-1-1", "11:00");
    Screening screening = new Screening();
    screening.setId(1l);

    thrown.expect(LimitationExceededException.class);
    thrown.expectMessage("Too many visits at the same time");
    screeningService.add(screeningDto, false);
  }
  @Test
  public void shouldThrowLimitationExceededExceptionWhenTypeOfVisitLimitIsReached() {
    when(clinicDataService.findById(1l)).thenReturn(clinic);
    when(volunteerDataService.create(any(Volunteer.class))).thenReturn(new Volunteer());
    List<Screening> screenings =
        new ArrayList<>(
            Arrays.asList(
                createScreeningVisit(
                    2l, clinic, new LocalDate(2217, 1, 1), new Time(10, 0), new Time(11, 0)),
                createScreeningVisit(
                    3l, clinic, new LocalDate(2217, 1, 1), new Time(9, 0), new Time(10, 0))));

    when(screeningDataService.findByClinicIdAndDateAndStatus(
            1l, new LocalDate(2217, 1, 1), ScreeningStatus.ACTIVE))
        .thenReturn(screenings);

    ScreeningDto screeningDto = createScreeningDto("1", "1", "2217-1-1", "12:00");
    Screening screening = new Screening();
    screening.setId(1l);

    thrown.expect(LimitationExceededException.class);
    thrown.expectMessage("The booking limit for this type of visit has been reached");
    screeningService.add(screeningDto, false);
  }
 private Screening createScreeningVisit(
     Long id, Clinic clinic, LocalDate date, Time startTime, Time endTime) {
   Screening screening = new Screening();
   screening.setId(id);
   screening.setClinic(clinic);
   screening.setDate(date);
   screening.setStartTime(startTime);
   screening.setEndTime(endTime);
   return screening;
 }