public void SetUp() { _validator = new AssessorPageValidator(); _command = new SubmitAssessorPageAnswerCommand { Heading = "heading" }; }
public async Task <ValidationResponse> Validate(SubmitAssessorPageAnswerCommand command) { var validationResponse = new ValidationResponse { Errors = new List <ValidationErrorDetail>() }; if (string.IsNullOrWhiteSpace(command.Status)) { validationResponse.Errors.Add(new ValidationErrorDetail("Status", ValidationHelper.StatusMandatoryValidationMessage(command.PageId, command.Heading))); } else { switch (command.Status) { case AssessorPageReviewStatus.Pass: { var wordCount = ValidationHelper.GetWordCount(command.OptionPassText); if (wordCount > MaxWordsCount) { validationResponse.Errors.Add(new ValidationErrorDetail(nameof(command.OptionPassText), TooManyWords)); } break; } case AssessorPageReviewStatus.Fail: { var wordCount = ValidationHelper.GetWordCount(command.OptionFailText); if (wordCount < RequiredMinimumWordsCount) { validationResponse.Errors.Add(new ValidationErrorDetail(nameof(command.OptionFailText), FailDetailsRequired)); } else if (wordCount > MaxWordsCount) { validationResponse.Errors.Add(new ValidationErrorDetail(nameof(command.OptionFailText), TooManyWords)); } break; } case AssessorPageReviewStatus.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> ValidateAndUpdatePageAnswer <RAVM>(SubmitAssessorPageAnswerCommand command, Func <Task <RAVM> > viewModelBuilder, string errorView) where RAVM : AssessorReviewAnswersViewModel { var validationResponse = await _assessorPageValidator.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 _assessorApiClient.SubmitAssessorPageReviewOutcome(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", "AssessorOverview", new { applicationId = command.ApplicationId }, $"sequence-{command.SequenceNumber}")); } else { return(RedirectToAction("ReviewPageAnswers", new { applicationId = command.ApplicationId, sequenceNumber = command.SequenceNumber, sectionNumber = command.SectionNumber, pageId = command.NextPageId })); } }
protected async Task <IActionResult> ValidateAndUpdateSectorPageAnswer <SVM>(SubmitAssessorPageAnswerCommand command, Func <Task <SVM> > viewModelBuilder, string errorView) where SVM : AssessorSectorDetailsViewModel { var validationResponse = await _assessorPageValidator.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 _assessorApiClient.SubmitAssessorPageReviewOutcome(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_AssessorPageReviewOutcome() { int sequenceNumber = 4; int sectionNumber = 2; string pageId = "4200"; var viewModel = new AssessorReviewAnswersViewModel { ApplicationId = _applicationId, SequenceNumber = sequenceNumber, SectionNumber = sectionNumber, PageId = pageId, Status = AssessorPageReviewStatus.Pass, OptionPassText = "test" }; var command = new SubmitAssessorPageAnswerCommand(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 } }; _assessorPageValidator.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)); _assessorApiClient.Verify(x => x.SubmitAssessorPageReviewOutcome(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_AssessorPageReviewOutcome() { int sequenceNumber = 4; int sectionNumber = 2; string pageId = "4200"; var viewModel = new AssessorReviewAnswersViewModel { ApplicationId = _applicationId, SequenceNumber = sequenceNumber, SectionNumber = sectionNumber, PageId = pageId, Status = AssessorPageReviewStatus.Pass, OptionPassText = "test" }; var command = new SubmitAssessorPageAnswerCommand(viewModel); _sectionReviewOrchestrator.Setup(x => x.GetReviewAnswersViewModel(It.IsAny <GetReviewAnswersRequest>())).ReturnsAsync(viewModel); var validationResponse = new ValidationResponse(); _assessorPageValidator.Setup(x => x.Validate(command)).ReturnsAsync(validationResponse); _assessorApiClient.Setup(x => x.SubmitAssessorPageReviewOutcome(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("AssessorOverview", result.ControllerName); Assert.AreEqual("ViewApplication", result.ActionName); _assessorApiClient.Verify(x => x.SubmitAssessorPageReviewOutcome(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, SubmitAssessorPageAnswerCommand command) { var userId = HttpContext.User.UserId(); Func <Task <AssessorSectorDetailsViewModel> > viewModelBuilder = () => _sectionReviewOrchestrator.GetSectorDetailsViewModel(new GetSectorDetailsRequest(command.ApplicationId, command.PageId, userId)); return(await ValidateAndUpdateSectorPageAnswer(command, viewModelBuilder, $"~/Views/AssessorSectionReview/ReviewSectorAnswers.cshtml")); }