public void SetUp()
 {
     _validator = new ModeratorPageValidator();
     _command   = new SubmitModeratorPageAnswerCommand {
         Heading = "heading"
     };
 }
        protected async Task <IActionResult> ValidateAndUpdatePageAnswer <RAVM>(SubmitModeratorPageAnswerCommand command,
                                                                                Func <Task <RAVM> > viewModelBuilder,
                                                                                string errorView) where RAVM : ModeratorReviewAnswersViewModel
        {
            var validationResponse = await _moderatorPageValidator.Validate(command);

            if (validationResponse.Errors.Any())
            {
                foreach (var error in validationResponse.Errors)
                {
                    ModelState.AddModelError(error.Field, error.ErrorMessage);
                }
            }

            var submittedPageOutcomeSuccessfully = false;

            if (ModelState.IsValid)
            {
                var userId   = HttpContext.User.UserId();
                var userName = HttpContext.User.UserDisplayName();

                submittedPageOutcomeSuccessfully = await _moderationApiClient.SubmitModeratorPageReviewOutcome(command.ApplicationId,
                                                                                                               command.SequenceNumber,
                                                                                                               command.SectionNumber,
                                                                                                               command.PageId,
                                                                                                               userId,
                                                                                                               userName,
                                                                                                               command.Status,
                                                                                                               command.ReviewComment);

                if (!submittedPageOutcomeSuccessfully)
                {
                    ModelState.AddModelError(string.Empty, "Unable to save outcome as this time");
                }
            }

            if (!submittedPageOutcomeSuccessfully)
            {
                var viewModel = await viewModelBuilder.Invoke();

                viewModel.Status               = command.Status;
                viewModel.OptionFailText       = command.OptionFailText;
                viewModel.OptionInProgressText = command.OptionInProgressText;
                viewModel.OptionPassText       = command.OptionPassText;

                return(View(errorView, viewModel));
            }
            else if (string.IsNullOrEmpty(command.NextPageId))
            {
                return(RedirectToAction("ViewApplication", "ModeratorOverview", new { applicationId = command.ApplicationId }, $"sequence-{command.SequenceNumber}"));
            }
            else
            {
                return(RedirectToAction("ReviewPageAnswers", new { applicationId = command.ApplicationId, sequenceNumber = command.SequenceNumber, sectionNumber = command.SectionNumber, pageId = command.NextPageId }));
            }
        }
        public async Task <ValidationResponse> Validate(SubmitModeratorPageAnswerCommand command)
        {
            var validationResponse = new ValidationResponse
            {
                Errors = new List <ValidationErrorDetail>()
            };

            if (string.IsNullOrWhiteSpace(command.Status))
            {
                validationResponse.Errors.Add(new ValidationErrorDetail("OptionPass", ValidationHelper.StatusMandatoryValidationMessage(command.PageId, command.Heading)));
            }
            else
            {
                switch (command.Status)
                {
                case ModeratorPageReviewStatus.Pass:
                {
                    var wordCount = ValidationHelper.GetWordCount(command.OptionPassText);
                    if (wordCount > MaxWordsCount)
                    {
                        validationResponse.Errors.Add(new ValidationErrorDetail(nameof(command.OptionPassText), TooManyWords));
                    }

                    break;
                }

                case ModeratorPageReviewStatus.Fail:
                {
                    var wordCount = ValidationHelper.GetWordCount(command.OptionFailText);
                    if (wordCount < RequiredMinimumWordsCount)
                    {
                        validationResponse.Errors.Add(new ValidationErrorDetail(nameof(command.OptionFailText), FailCommentRequired));
                    }
                    else if (wordCount > MaxWordsCount)
                    {
                        validationResponse.Errors.Add(new ValidationErrorDetail(nameof(command.OptionFailText), FailTooManyWords));
                    }

                    break;
                }

                case ModeratorPageReviewStatus.InProgress:
                {
                    var wordCount = ValidationHelper.GetWordCount(command.OptionInProgressText);
                    if (wordCount > MaxWordsCount)
                    {
                        validationResponse.Errors.Add(new ValidationErrorDetail(nameof(command.OptionInProgressText), TooManyWords));
                    }

                    break;
                }
                }
            }

            return(await Task.FromResult(validationResponse));
        }
        protected async Task <IActionResult> ValidateAndUpdateSectorPageAnswer <SVM>(SubmitModeratorPageAnswerCommand command,
                                                                                     Func <Task <SVM> > viewModelBuilder,
                                                                                     string errorView) where SVM : ModeratorSectorDetailsViewModel
        {
            var validationResponse = await _moderatorPageValidator.Validate(command);

            if (validationResponse.Errors.Any())
            {
                foreach (var error in validationResponse.Errors)
                {
                    ModelState.AddModelError(error.Field, error.ErrorMessage);
                }
            }

            var submittedPageOutcomeSuccessfully = false;

            if (ModelState.IsValid)
            {
                var userId   = HttpContext.User.UserId();
                var userName = HttpContext.User.UserDisplayName();

                submittedPageOutcomeSuccessfully = await _moderationApiClient.SubmitModeratorPageReviewOutcome(command.ApplicationId,
                                                                                                               SequenceIds.DeliveringApprenticeshipTraining,
                                                                                                               SectionIds.DeliveringApprenticeshipTraining.YourSectorsAndEmployees,
                                                                                                               command.PageId,
                                                                                                               userId,
                                                                                                               userName,
                                                                                                               command.Status,
                                                                                                               command.ReviewComment);

                if (!submittedPageOutcomeSuccessfully)
                {
                    ModelState.AddModelError(string.Empty, "Unable to save outcome as this time");
                }
            }

            if (!submittedPageOutcomeSuccessfully)
            {
                var viewModel = await viewModelBuilder.Invoke();

                viewModel.Status               = command.Status;
                viewModel.OptionFailText       = command.OptionFailText;
                viewModel.OptionInProgressText = command.OptionInProgressText;
                viewModel.OptionPassText       = command.OptionPassText;

                return(View(errorView, viewModel));
            }

            return(RedirectToAction("ReviewPageAnswers", new
            {
                applicationId = command.ApplicationId,
                sequenceNumber = SequenceIds.DeliveringApprenticeshipTraining,
                sectionNumber = SectionIds.DeliveringApprenticeshipTraining.YourSectorsAndEmployees
            }));
        }
        public async Task POST_ReviewPageAnswers_When_Invalid_does_not_submit_ModeratorPageReviewOutcome()
        {
            int    sequenceNumber = 4;
            int    sectionNumber  = 2;
            string pageId         = "4200";

            var viewModel = new ModeratorReviewAnswersViewModel
            {
                ApplicationId  = _applicationId,
                SequenceNumber = sequenceNumber,
                SectionNumber  = sectionNumber,
                PageId         = pageId,
                Status         = ModeratorPageReviewStatus.Pass,
                OptionPassText = "test"
            };

            var command = new SubmitModeratorPageAnswerCommand(viewModel);

            _sectionReviewOrchestrator.Setup(x => x.GetReviewAnswersViewModel(It.IsAny <GetReviewAnswersRequest>())).ReturnsAsync(viewModel);

            var error = new ValidationErrorDetail {
                Field = "Status", ErrorMessage = "Error"
            };
            var validationResponse = new ValidationResponse {
                Errors = new List <ValidationErrorDetail> {
                    error
                }
            };

            _moderatorPageValidator.Setup(x => x.Validate(command)).ReturnsAsync(validationResponse);

            // act
            var result = await _controller.ReviewPageAnswers(_applicationId, sequenceNumber, sectionNumber, pageId, command) as ViewResult;

            var actualViewModel = result?.Model as ReviewAnswersViewModel;

            // assert
            Assert.That(result, Is.Not.Null);
            Assert.That(actualViewModel, Is.Not.Null);
            Assert.That(actualViewModel, Is.SameAs(viewModel));

            _moderationApiClient.Verify(x => x.SubmitModeratorPageReviewOutcome(command.ApplicationId,
                                                                                command.SequenceNumber,
                                                                                command.SectionNumber,
                                                                                command.PageId,
                                                                                _controller.User.UserId(),
                                                                                _controller.User.UserDisplayName(),
                                                                                command.Status,
                                                                                command.ReviewComment), Times.Never);
        }
        public async Task POST_ReviewPageAnswers_When_Valid_submits_ModeratorPageReviewOutcome()
        {
            int    sequenceNumber = 4;
            int    sectionNumber  = 2;
            string pageId         = "4200";

            var viewModel = new ModeratorReviewAnswersViewModel
            {
                ApplicationId  = _applicationId,
                SequenceNumber = sequenceNumber,
                SectionNumber  = sectionNumber,
                PageId         = pageId,
                Status         = ModeratorPageReviewStatus.Pass,
                OptionPassText = "test"
            };

            var command = new SubmitModeratorPageAnswerCommand(viewModel);

            _sectionReviewOrchestrator.Setup(x => x.GetReviewAnswersViewModel(It.IsAny <GetReviewAnswersRequest>())).ReturnsAsync(viewModel);

            var validationResponse = new ValidationResponse();

            _moderatorPageValidator.Setup(x => x.Validate(command)).ReturnsAsync(validationResponse);

            _moderationApiClient.Setup(x => x.SubmitModeratorPageReviewOutcome(command.ApplicationId,
                                                                               command.SequenceNumber,
                                                                               command.SectionNumber,
                                                                               command.PageId,
                                                                               _controller.User.UserId(),
                                                                               _controller.User.UserDisplayName(),
                                                                               command.Status,
                                                                               command.ReviewComment)).ReturnsAsync(true);

            // act
            var result = await _controller.ReviewPageAnswers(_applicationId, sequenceNumber, sectionNumber, pageId, command) as RedirectToActionResult;

            // assert
            Assert.AreEqual("ModeratorOverview", result.ControllerName);
            Assert.AreEqual("ViewApplication", result.ActionName);

            _moderationApiClient.Verify(x => x.SubmitModeratorPageReviewOutcome(command.ApplicationId,
                                                                                command.SequenceNumber,
                                                                                command.SectionNumber,
                                                                                command.PageId,
                                                                                _controller.User.UserId(),
                                                                                _controller.User.UserDisplayName(),
                                                                                command.Status,
                                                                                command.ReviewComment), Times.Once);
        }
コード例 #7
0
        public async Task <IActionResult> ReviewSectorAnswers(Guid applicationId, string pageId, SubmitModeratorPageAnswerCommand command)
        {
            var userId = HttpContext.User.UserId();
            Func <Task <ModeratorSectorDetailsViewModel> > viewModelBuilder = () => _sectionReviewOrchestrator.GetSectorDetailsViewModel(new GetSectorDetailsRequest(command.ApplicationId, command.PageId, userId));

            return(await ValidateAndUpdateSectorPageAnswer(command, viewModelBuilder, $"~/Views/ModeratorSectionReview/ReviewSectorAnswers.cshtml"));
        }