Example #1
0
        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;
            }
        }
Example #9
0
        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);
            }
        }