public async Task Should_successfully_clone_hearing() { var hearingId = Guid.NewGuid(); var request = new CloneHearingRequest { Dates = new List <DateTime> { DateTime.Now.AddDays(2), DateTime.Now.AddDays(3) } }; var hearing = GetHearing("123"); var caseName = $"{hearing.GetCases().First().Name} Day {1} of 3"; QueryHandlerMock .Setup(x => x.Handle <GetHearingByIdQuery, VideoHearing>(It.IsAny <GetHearingByIdQuery>())) .ReturnsAsync(hearing); var result = await Controller.CloneHearing(hearingId, request); result.Should().NotBeNull(); var objectResult = (NoContentResult)result; objectResult.Should().NotBeNull(); CommandHandlerMock.Verify(c => c.Handle(It.Is <CreateVideoHearingCommand>(c => c.ScheduledDateTime == request.Dates[0] && c.Cases[0].Name == "Case name Day 2 of 3")), Times.Once); CommandHandlerMock.Verify(c => c.Handle(It.Is <CreateVideoHearingCommand>(c => c.ScheduledDateTime == request.Dates[1] && c.Cases[0].Name == "Case name Day 3 of 3")), Times.Once); HearingServiceMock.Verify(h => h.UpdateHearingCaseName(It.Is <Guid>(g => g == hearingId), It.Is <string>(x => x == caseName)), Times.Once); }
private void SetupCloneRequest(Guid hearingId, List <DateTime> dates) { var request = new CloneHearingRequest { Dates = dates }; _cloneRequest = request; var jsonBody = RequestHelper.Serialise(request); Context.HttpContent = new StringContent(jsonBody, Encoding.UTF8, "application/json"); Context.Uri = ApiUriFactory.HearingsEndpoints.CloneHearing(hearingId); Context.HttpMethod = HttpMethod.Post; }
public ValidationResult ValidateDates(CloneHearingRequest request) { var errors = new List <ValidationFailure>(); if (request.Dates.Any(x => x.DayOfYear <= _originalHearing.ScheduledDateTime.DayOfYear)) { errors.Add(new ValidationFailure(nameof(request.Dates), InvalidDateRangeErrorMessage)); } var allDays = request.Dates.Select(x => x.DayOfYear).ToList(); if (allDays.Count != allDays.Distinct().Count()) { errors.Add(new ValidationFailure(nameof(request.Dates), DuplicateDateErrorMessage)); } return(new ValidationResult(errors)); }
public void should_fail_validation_when_dates_are_same_as_original_hearing() { var originalHearing = new VideoHearingBuilder().Build(); var request = new CloneHearingRequest { Dates = new List <DateTime> { originalHearing.ScheduledDateTime } }; var validator = new CloneHearingRequestValidation(originalHearing); var result = validator.ValidateDates(request); result.IsValid.Should().BeFalse(); result.Errors.Count.Should().Be(1); result.Errors.Any(x => x.ErrorMessage == CloneHearingRequestValidation.InvalidDateRangeErrorMessage) .Should().BeTrue(); }
public void should_fail_validation_when_list_contains_duplicate_dates() { var originalHearing = new VideoHearingBuilder().Build(); var date = originalHearing.ScheduledDateTime.GetNextWorkingDay(); var request = new CloneHearingRequest { Dates = new List <DateTime> { date, date } }; var validator = new CloneHearingRequestValidation(originalHearing); var result = validator.ValidateDates(request); result.IsValid.Should().BeFalse(); result.Errors.Count.Should().Be(1); result.Errors.Any(x => x.ErrorMessage == CloneHearingRequestValidation.DuplicateDateErrorMessage) .Should().BeTrue(); }
public async Task <IActionResult> CloneHearing([FromRoute] Guid hearingId, [FromBody] CloneHearingRequest request) { var getHearingByIdQuery = new GetHearingByIdQuery(hearingId); var videoHearing = await _queryHandler.Handle <GetHearingByIdQuery, VideoHearing>(getHearingByIdQuery); if (videoHearing == null) { return(NotFound()); } var validationResult = new CloneHearingRequestValidation(videoHearing) .ValidateDates(request); if (!validationResult.IsValid) { ModelState.AddFluentValidationErrors(validationResult.Errors); return(BadRequest(ModelState)); } var orderedDates = request.Dates.OrderBy(x => x).ToList(); var totalDays = orderedDates.Count + 1; // include original hearing var commands = orderedDates.Select((newDate, index) => { var hearingDay = index + 2; // zero index including original hearing return(CloneHearingToCommandMapper.CloneToCommand(videoHearing, newDate, _randomGenerator, _kinlyConfiguration.SipAddressStem, totalDays, hearingDay)); }).ToList(); foreach (var command in commands) { // dbcontext is not thread safe. loop one at a time await _commandHandler.Handle(command); } var existingCase = videoHearing.GetCases().First(); await _hearingService.UpdateHearingCaseName(hearingId, $"{existingCase.Name} Day {1} of {totalDays}"); return(NoContent()); }
public void should_pass_validation_when_dates_are_ahead_of_original_hearing() { var originalHearing = new VideoHearingBuilder().Build(); var date1 = originalHearing.ScheduledDateTime.GetNextWorkingDay(); var date2 = date1.GetNextWorkingDay(); var date3 = date2.GetNextWorkingDay(); var dates = new List <DateTime> { date1, date2, date3 }; var request = new CloneHearingRequest { Dates = dates }; var validator = new CloneHearingRequestValidation(originalHearing); var result = validator.ValidateDates(request); result.IsValid.Should().BeTrue(); }
public async Task <IActionResult> CloneHearing(Guid hearingId, MultiHearingRequest hearingRequest) { _logger.LogDebug("Attempting to clone hearing {Hearing}", hearingId); var publicHolidays = await _publicHolidayRetriever.RetrieveUpcomingHolidays(); var listOfDates = DateListMapper.GetListOfWorkingDates(hearingRequest.StartDate, hearingRequest.EndDate, publicHolidays); if (listOfDates.Count == 0) { _logger.LogWarning("No working dates provided to clone to"); return(BadRequest()); } var cloneHearingRequest = new CloneHearingRequest { Dates = listOfDates }; try { _logger.LogDebug("Sending request to clone hearing to Bookings API"); await _bookingsApiClient.CloneHearingAsync(hearingId, cloneHearingRequest); _logger.LogDebug("Successfully cloned hearing {Hearing}", hearingId); return(NoContent()); } catch (BookingsApiException e) { _logger.LogError(e, "There was a problem cloning the booking. Status Code {StatusCode} - Message {Message}", e.StatusCode, e.Response); if (e.StatusCode == (int)HttpStatusCode.BadRequest) { return(BadRequest(e.Response)); } throw; } }
public async Task Should_create_multi_day_conference_from_hearing() { var request = new BookHearingRequestBuilder(Context.Config.UsernameStem).MoveScheduledDateIfWeekend().Build(); var initialHearing = await BookingApiClient.BookNewHearingAsync(request); Hearings.Add(initialHearing); const int numberOfDays = 2; var numberOfDaysNotIncludingWeekends = CalculateDaysWithoutWeekend(numberOfDays, initialHearing.ScheduledDateTime); var start = initialHearing.ScheduledDateTime; var end = initialHearing.ScheduledDateTime.AddDays(numberOfDaysNotIncludingWeekends); var dates = DateListMapper.GetListOfWorkingDates(start, end); dates.Count.Should().Be(numberOfDays); // Add the initial hearing day const int totalNumberOfDays = numberOfDays + 1; var multiHearingsRequest = new CloneHearingRequest() { Dates = dates }; await BookingApiClient.CloneHearingAsync(initialHearing.Id, multiHearingsRequest); var anyParticipant = initialHearing.Participants.First(); var multiDays = await PollForAllMultiDayHearings(anyParticipant.Username, initialHearing.Cases.Single().Name, totalNumberOfDays); Hearings.AddRange(multiDays); multiDays.Count.Should().Be(totalNumberOfDays); foreach (var day in multiDays) { await ConfirmMultiDayHearing(day); } }