public async Task Then_The_BackLink_Is_Set_To_Return_To_SelectLegalEntityView(
            ICollection <Course> courses,
            [Frozen] Mock <IMediator> mockMediator,
            ReservationsRouteModel routeModel,
            EmployerReservationsController controller,
            PostSelectCourseViewModel postSelectCourseViewModel)
        {
            //Arrange
            _cachedReservationResult.CohortRef = "";
            _cachedReservationResult.EmployerHasSingleLegalEntity = false;
            routeModel.CohortReference = "";
            routeModel.FromReview      = false;
            _mediator.Setup(mediator => mediator.Send(It.IsAny <CacheReservationCourseCommand>(), It.IsAny <CancellationToken>()))
            .ThrowsAsync(new ValidationException(new ValidationResult("Failed", new List <string> {
                "Course|The Course field is not valid."
            }), null, null));
            postSelectCourseViewModel.SelectedCourseId = _course.Id;


            //Act
            var result = await _controller.PostSelectCourse(routeModel, postSelectCourseViewModel) as ViewResult;

            var viewModel = result?.Model as EmployerSelectCourseViewModel;

            Assert.IsNotNull(viewModel);
            Assert.AreEqual(RouteNames.EmployerSelectLegalEntity, viewModel.BackLink);
            Assert.AreEqual(routeModel.CohortReference, viewModel.CohortReference);
        }
        public async Task Then_The_BackLink_Is_Set_To_Return_To_CohortDetails_From_ValidationError_If_There_Is_A_Cohort_Ref(
            ReservationsRouteModel routeModel,
            string cohortUrl,
            PostSelectCourseViewModel postSelectCourseViewModel
            )
        {
            //Arrange
            _cachedReservationResult.CohortRef = "ABC123";
            _cachedReservationResult.UkPrn     = null;
            _cachedReservationResult.IsEmptyCohortFromSelect = false;
            _mediator.Setup(mediator => mediator.Send(It.IsAny <CacheReservationCourseCommand>(), It.IsAny <CancellationToken>()))
            .ThrowsAsync(new ValidationException(new ValidationResult("Failed", new List <string> {
                "Course|The Course field is not valid."
            }), null, null));
            postSelectCourseViewModel.SelectedCourseId        = string.Empty;
            postSelectCourseViewModel.ApprenticeTrainingKnown = true;
            _externalUrlHelper
            .Setup(x => x.GenerateCohortDetailsUrl(null, routeModel.EmployerAccountId, _cachedReservationResult.CohortRef, false))
            .Returns(cohortUrl);

            //Act
            var result = await _controller.PostSelectCourse(routeModel, postSelectCourseViewModel) as ViewResult;

            var viewModel = result?.Model as EmployerSelectCourseViewModel;

            Assert.IsNotNull(viewModel);
            Assert.AreEqual(cohortUrl, viewModel.BackLink);
            Assert.AreEqual(_cachedReservationResult.CohortRef, viewModel.CohortReference);
        }
        public void GivenIHaveChosenACourse()
        {
            var controller = Services.GetService <EmployerReservationsController>();
            var postSelectCourseViewModel = new PostSelectCourseViewModel
            {
                SelectedCourseId        = TestData.Course.Id,
                ApprenticeTrainingKnown = true
            };

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

            Assert.IsNotNull(result);
            Assert.AreEqual(RouteNames.EmployerApprenticeshipTraining, result.RouteName);
        }
        public async Task WhenApprenticeshipTrainingNotKnown_ThenRedirectsToGuidancePage(
            ReservationsRouteModel routeModel,
            EmployerReservationsController controller,
            PostSelectCourseViewModel postSelectCourseViewModel)
        {
            //Arrange
            postSelectCourseViewModel.ApprenticeTrainingKnown = false;
            var expectedRouteName = RouteNames.EmployerCourseGuidance;

            //Act
            var result = await controller.PostSelectCourse(routeModel, postSelectCourseViewModel) as RedirectToRouteResult;

            //Assert
            Assert.NotNull(result);
            Assert.AreEqual(expectedRouteName, result.RouteName);
        }
        public async Task Then_Adds_Guid_To_RouteModel(
            ReservationsRouteModel routeModel,
            PostSelectCourseViewModel postSelectCourseViewModel)
        {
            //Assign
            postSelectCourseViewModel.SelectedCourseId = _course.Id;

            //Act
            var result = await _controller.PostSelectCourse(routeModel, postSelectCourseViewModel) as RedirectToRouteResult;

            //Assert
            Assert.IsNotNull(result);

            result.RouteValues.Should().ContainKey("Id")
            .WhichValue.Should().Be(routeModel.Id);
        }
        public async Task WhenApprenticeshipTrainingIsNull_ThenRedirectsToSelectCourse(
            ReservationsRouteModel routeModel,
            PostSelectCourseViewModel postSelectCourseViewModel,
            [Frozen] Mock <IMediator> mockMediator,
            EmployerReservationsController controller)
        {
            //Arrange
            postSelectCourseViewModel.ApprenticeTrainingKnown = null;
            var expectedViewName = "SelectCourse";

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

            //Act
            var result = await _controller.PostSelectCourse(routeModel, postSelectCourseViewModel) as ViewResult;

            //Assert
            Assert.NotNull(result);
            Assert.AreEqual(expectedViewName, result.ViewName);
        }
        [Test, AutoData]//note cannot use moqautodata to construct controller here due to modelmetadata usage.
        public async Task And_Validation_Error_Then_Returns_Validation_Error_Details(
            ReservationsRouteModel routeModel,
            PostSelectCourseViewModel postSelectCourseViewModel)
        {
            //Assign
            postSelectCourseViewModel.SelectedCourseId        = _course.Id;
            postSelectCourseViewModel.ApprenticeTrainingKnown = true;

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

            //Act
            var result = await _controller.PostSelectCourse(routeModel, postSelectCourseViewModel);

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

            Assert.That(actualViewResult.ViewName == "SelectCourse");
            Assert.IsFalse(_controller.ModelState.IsValid);
            Assert.IsTrue(_controller.ModelState.ContainsKey("Course"));
        }
        public async Task <IActionResult> PostSelectCourse(ReservationsRouteModel routeModel, PostSelectCourseViewModel postViewModel)
        {
            if (!ModelState.IsValid)
            {
                var viewModel = await BuildEmployerSelectCourseViewModel(routeModel, postViewModel.ApprenticeTrainingKnown);

                if (viewModel == null)
                {
                    return(View("Index"));
                }

                return(View("SelectCourse", viewModel));
            }

            if (postViewModel.ApprenticeTrainingKnown == false)
            {
                return(RedirectToRoute(RouteNames.EmployerCourseGuidance, routeModel));
            }

            try
            {
                await _mediator.Send(new CacheReservationCourseCommand
                {
                    Id = routeModel.Id.Value,
                    SelectedCourseId = postViewModel.SelectedCourseId
                });

                return(RedirectToRoute(RouteNames.EmployerApprenticeshipTraining, new ReservationsRouteModel
                {
                    Id = routeModel.Id,
                    EmployerAccountId = routeModel.EmployerAccountId,
                    CohortReference = routeModel.CohortReference
                }));
            }
            catch (ValidationException e)
            {
                foreach (var member in e.ValidationResult.MemberNames)
                {
                    ModelState.AddModelError(member.Split('|')[0], member.Split('|')[1]);
                }

                var viewModel = await BuildEmployerSelectCourseViewModel(routeModel, postViewModel.ApprenticeTrainingKnown, true);


                return(View("SelectCourse", viewModel));
            }
            catch (CachedReservationNotFoundException)
            {
                throw new ArgumentException("Reservation not found", nameof(routeModel.Id));
            }
        }