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); }
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")); }