[Test, AutoData] //note cannot use moqautodata to construct controller here due to modelmetadata usage.
        public async Task And_Course_Validation_Error_Then_Returns_Validation_Error_Details(
            ReservationsRouteModel routeModel,
            TrainingDateModel trainingDateModel,
            ApprenticeshipTrainingFormModel formModel)
        {
            formModel.StartDate        = JsonConvert.SerializeObject(trainingDateModel);
            formModel.SelectedCourseId = _course.Id;

            _mediator.Setup(mediator =>
                            mediator.Send(It.IsAny <CacheReservationCourseCommand>(), It.IsAny <CancellationToken>()))
            .ThrowsAsync(new ValidationException(
                             new ValidationResult("Failed",
                                                  new List <string> {
                "CourseId|The CourseId field is invalid."
            }), null, null));

            var result = await _controller.PostApprenticeshipTraining(routeModel, formModel);

            Assert.IsNotNull(result);
            var actualViewResult = result as ViewResult;

            Assert.IsNotNull(actualViewResult);
            Assert.IsFalse(actualViewResult.ViewData.ModelState.IsValid);
            Assert.IsTrue(actualViewResult.ViewData.ModelState.ContainsKey("CourseId"));
        }
        public void GivenIHaveNotChosenAStartDate()
        {
            var controller                      = Services.GetService <ReservationsController>();
            var trainingDateViewModel           = new TrainingDateViewModel(new TrainingDateModel());
            var apprenticeshipTrainingFormModel = new ApprenticeshipTrainingFormModel
            {
                StartDate = trainingDateViewModel.SerializedModel,
                AccountLegalEntityPublicHashedId = TestData.AccountLegalEntity.AccountLegalEntityPublicHashedId
            };

            TestData.ActionResult = controller.PostApprenticeshipTraining(TestData.ReservationRouteModel, apprenticeshipTrainingFormModel)
                                    .Result as ViewResult;
        }
        public async Task Then_Adds_Guid_To_RouteModel(
            ReservationsRouteModel routeModel,
            TrainingDateModel trainingDateModel,
            ApprenticeshipTrainingFormModel formModel)
        {
            formModel.StartDate        = JsonConvert.SerializeObject(trainingDateModel);
            formModel.SelectedCourseId = _course.Id;

            var result = await _controller.PostApprenticeshipTraining(routeModel, formModel) as RedirectToRouteResult;

            result.RouteValues.Should().ContainKey("Id")
            .WhichValue.Should().Be(routeModel.Id);
        }
        public async Task And_Has_Ukprn_Then_Redirects_To_Provider_Route(
            ReservationsRouteModel routeModel,
            TrainingDateModel trainingDateModel,
            ApprenticeshipTrainingFormModel formModel)
        {
            formModel.StartDate        = JsonConvert.SerializeObject(trainingDateModel);
            formModel.SelectedCourseId = null;

            var result = await _controller.PostApprenticeshipTraining(routeModel, formModel) as RedirectToRouteResult;

            result.Should().NotBeNull($"result was not a {typeof(RedirectToRouteResult)}");
            result.RouteName.Should().Be(RouteNames.ProviderReview);
        }
        public async Task Then_The_Model_Is_Validated_And_Confirmation_Returned(
            ApprenticeshipTrainingFormModel model,
            TrainingDateModel trainingDateModel,
            ReservationsRouteModel routeModel)
        {
            model.StartDate = JsonConvert.SerializeObject(trainingDateModel);
            _controller.ModelState.AddModelError("StartDate", "StartDate");

            var actual = await _controller.PostApprenticeshipTraining(routeModel, model);

            var actualModel = actual as ViewResult;

            Assert.IsNotNull(actualModel);
            Assert.AreEqual("ApprenticeshipTraining", actualModel.ViewName);
        }
        public async Task And_CachedReservationNotFoundException_And_Has_Ukprn_Then_Redirect_To_ProviderIndex(
            ReservationsRouteModel routeModel,
            TrainingDateModel trainingDateModel,
            ApprenticeshipTrainingFormModel formModel,
            CachedReservationNotFoundException notFoundException)
        {
            formModel.StartDate        = JsonConvert.SerializeObject(trainingDateModel);
            formModel.SelectedCourseId = _course.Id;

            _mediator
            .Setup(mediator => mediator.Send(It.IsAny <GetCachedReservationQuery>(), It.IsAny <CancellationToken>()))
            .ThrowsAsync(notFoundException);

            var actual = await _controller.PostApprenticeshipTraining(routeModel, formModel) as RedirectToRouteResult;

            actual.Should().NotBeNull();
            actual.RouteName.Should().Be(RouteNames.ProviderIndex);
        }
        public void GivenIHaveAReservationStartDateOfAugust(string month)
        {
            TestData.BuildTrainingDateModel(month);

            var controller            = Services.GetService <ReservationsController>();
            var trainingDateViewModel = new TrainingDateViewModel(TestData.TrainingDate);

            var apprenticeshipTrainingFormModel = new ApprenticeshipTrainingFormModel
            {
                StartDate = trainingDateViewModel.SerializedModel,
                AccountLegalEntityPublicHashedId = TestData.AccountLegalEntity.AccountLegalEntityPublicHashedId
            };

            var result = controller.PostApprenticeshipTraining(TestData.ReservationRouteModel, apprenticeshipTrainingFormModel)
                         .Result as RedirectToRouteResult;

            Assert.IsNotNull(result);
            Assert.AreEqual(RouteNames.EmployerReview, result.RouteName);
        }
        public void WhenIChooseACourseAndDateOnBehalfOfAnEmployer(string month)
        {
            TestData.BuildTrainingDateModel(month);
            var trainingDateViewModel     = new TrainingDateViewModel(TestData.TrainingDate);
            var postSelectCourseViewModel = new ApprenticeshipTrainingFormModel
            {
                AccountLegalEntityPublicHashedId = TestData.ReservationRouteModel.AccountLegalEntityPublicHashedId,
                SelectedCourseId = TestData.Course.Id,
                StartDate        = trainingDateViewModel.SerializedModel
            };

            var controller = Services.GetService <ReservationsController>();

            var result = controller.PostApprenticeshipTraining(TestData.ReservationRouteModel, postSelectCourseViewModel)
                         .Result as RedirectToRouteResult;

            result.RouteName.Should().Be(RouteNames.ProviderReview);
            result.RouteValues["Id"].Should().Be(TestData.ReservationRouteModel.Id);
            result.RouteValues["UkPrn"].Should().Be(TestData.ReservationRouteModel.UkPrn);
        }
        public async Task And_No_Course_Then_Caches_Draft_Reservation(
            ReservationsRouteModel routeModel,
            TrainingDateModel trainingDateModel,
            ApprenticeshipTrainingFormModel formModel)
        {
            formModel.StartDate        = JsonConvert.SerializeObject(trainingDateModel);
            formModel.SelectedCourseId = null;

            await _controller.PostApprenticeshipTraining(routeModel, formModel);

            _mediator.Verify(mediator => mediator.Send(
                                 It.Is <CacheReservationCourseCommand>(c =>
                                                                       c.SelectedCourseId == null),
                                 It.IsAny <CancellationToken>()));

            _mediator.Verify(mediator => mediator.Send(
                                 It.Is <CacheReservationStartDateCommand>(c =>
                                                                          c.TrainingDate.Equals(trainingDateModel) &&
                                                                          c.UkPrn.Equals(routeModel.UkPrn)),
                                 It.IsAny <CancellationToken>()));
        }
        public async Task And_No_Ukprn_Then_Caches_StartDate_Only(
            ReservationsRouteModel routeModel,
            TrainingDateModel trainingDateModel,
            ApprenticeshipTrainingFormModel formModel)
        {
            routeModel.UkPrn           = null;
            formModel.StartDate        = JsonConvert.SerializeObject(trainingDateModel);
            formModel.SelectedCourseId = _course.Id;

            await _controller.PostApprenticeshipTraining(routeModel, formModel);

            _mediator.Verify(mediator => mediator.Send(
                                 It.Is <CacheReservationCourseCommand>(c =>
                                                                       c.SelectedCourseId.Equals(_course.Id)),
                                 It.IsAny <CancellationToken>()), Times.Never);

            _mediator.Verify(mediator => mediator.Send(
                                 It.Is <CacheReservationStartDateCommand>(c =>
                                                                          c.TrainingDate.Equals(trainingDateModel)),
                                 It.IsAny <CancellationToken>()));
        }
        public async Task Then_If_There_Is_An_Error_The_Model_Is_Correctly_Built_And_Returned_To_The_View_And_The_Back_Link_Is_Correct(
            string cohortDetailsUrl,
            ReservationsRouteModel routeModel,
            TrainingDateModel trainingDateModel,
            ApprenticeshipTrainingFormModel formModel)
        {
            formModel.FromReview = true;
            formModel.CohortRef  = string.Empty;
            formModel.StartDate  = JsonConvert.SerializeObject(trainingDateModel);
            _controller.ModelState.AddModelError("StartDate", "StartDate");

            var result = await _controller.PostApprenticeshipTraining(routeModel, formModel);

            var actualViewResult = result as ViewResult;

            Assert.IsNotNull(actualViewResult);
            Assert.IsFalse(actualViewResult.ViewData.ModelState.IsValid);
            var actualModel = actualViewResult.Model as ApprenticeshipTrainingViewModel;

            Assert.IsNotNull(actualModel);
            Assert.AreEqual(RouteNames.ProviderReview, actualModel.BackLink);
        }
        public async Task Then_If_There_Is_An_Error_The_Model_Is_Correctly_Built_And_Returned_To_The_View(
            string cohortDetailsUrl,
            ReservationsRouteModel routeModel,
            TrainingDateModel trainingDateModel,
            ApprenticeshipTrainingFormModel formModel)
        {
            formModel.FromReview = false;
            _urlHelper.Setup(helper => helper.GenerateCohortDetailsUrl(routeModel.UkPrn, routeModel.EmployerAccountId, formModel.CohortRef, false))
            .Returns(cohortDetailsUrl);
            formModel.StartDate = JsonConvert.SerializeObject(trainingDateModel);
            _controller.ModelState.AddModelError("StartDate", "StartDate");

            var result = await _controller.PostApprenticeshipTraining(routeModel, formModel);

            var actualViewResult = result as ViewResult;

            Assert.IsNotNull(actualViewResult);
            Assert.IsFalse(actualViewResult.ViewData.ModelState.IsValid);
            var actualModel = actualViewResult.Model as ApprenticeshipTrainingViewModel;

            Assert.IsNotNull(actualModel);
            Assert.AreEqual(cohortDetailsUrl, actualModel.BackLink);
        }
Beispiel #13
0
        public async Task <IActionResult> PostApprenticeshipTraining(ReservationsRouteModel routeModel, ApprenticeshipTrainingFormModel formModel)
        {
            var isProvider = routeModel.UkPrn != null;
            TrainingDateModel trainingDateModel = null;

            try
            {
                if (!string.IsNullOrWhiteSpace(formModel.StartDate))
                {
                    trainingDateModel = JsonConvert.DeserializeObject <TrainingDateModel>(formModel.StartDate);
                }

                if (!ModelState.IsValid)
                {
                    var model = await BuildApprenticeshipTrainingViewModel(
                        isProvider,
                        formModel.AccountLegalEntityPublicHashedId,
                        formModel.SelectedCourseId,
                        trainingDateModel,
                        formModel.FromReview,
                        formModel.CohortRef,
                        routeModel.UkPrn,
                        routeModel.EmployerAccountId);

                    return(View("ApprenticeshipTraining", model));
                }

                var cachedReservation = await _mediator.Send(new GetCachedReservationQuery { Id = routeModel.Id.GetValueOrDefault() });

                if (isProvider)
                {
                    var courseCommand = new CacheReservationCourseCommand
                    {
                        Id = cachedReservation.Id,
                        SelectedCourseId = formModel.SelectedCourseId,
                        UkPrn            = routeModel.UkPrn
                    };

                    await _mediator.Send(courseCommand);
                }

                var startDateCommand = new CacheReservationStartDateCommand
                {
                    Id           = cachedReservation.Id,
                    TrainingDate = trainingDateModel,
                    UkPrn        = routeModel.UkPrn
                };

                await _mediator.Send(startDateCommand);
            }
            catch (ValidationException e)
            {
                foreach (var member in e.ValidationResult.MemberNames)
                {
                    ModelState.AddModelError(member.Split('|')[0], member.Split('|')[1]);
                }

                var model = await BuildApprenticeshipTrainingViewModel(
                    isProvider,
                    formModel.AccountLegalEntityPublicHashedId,
                    formModel.SelectedCourseId,
                    trainingDateModel,
                    formModel.FromReview,
                    formModel.CohortRef,
                    routeModel.UkPrn,
                    routeModel.EmployerAccountId);

                return(View("ApprenticeshipTraining", model));
            }
            catch (CachedReservationNotFoundException ex)
            {
                _logger.LogWarning(ex, "Expected a cached reservation but did not find one.");
                return(RedirectToRoute(routeModel.UkPrn.HasValue ? RouteNames.ProviderIndex : RouteNames.EmployerIndex, routeModel));
            }

            var reviewRouteName = isProvider ?
                                  RouteNames.ProviderReview :
                                  RouteNames.EmployerReview;

            return(RedirectToRoute(reviewRouteName, routeModel));
        }