public void When_FilesToUpload_has_file_that_is_not_a_pdf_then_an_error_is_returned() { var _viewModel = new RoatpFinancialClarificationViewModel { SatisfactoryFinancialDueDate = new FinancialDueDate { Day = DateTime.Today.AddDays(-1).Day.ToString(), Month = DateTime.Today.Month.ToString(), Year = DateTime.Today.Year.ToString() }, FinancialReviewDetails = new FinancialReviewDetails { SelectedGrade = FinancialApplicationSelectedGrade.Satisfactory, } }; _viewModel.FilesToUpload = new FormFileCollection { GenerateClarificationFile("ClarificationFile.txt", false, 10) }; var response = _validator.Validate(_viewModel, true, false); Assert.IsFalse(response.IsValid); Assert.AreEqual("The selected file must be a PDF", response.Errors.First().ErrorMessage); Assert.AreEqual("ClarificationFile", response.Errors.First().Field); }
private static RoatpFinancialClarificationViewModel ConvertFinancialApplicationToFinancialClarificationViewModel(RoatpFinancialApplicationViewModel vm, string internalComments) { var viewModel = new RoatpFinancialClarificationViewModel { ClarificationComments = vm.ClarificationComments, InadequateComments = vm.InadequateComments, InadequateExternalComments = vm.InadequateExternalComments, ApplicantEmailAddress = vm.ApplicantEmailAddress, FinancialReviewDetails = vm.FinancialReviewDetails, ApplicationId = vm.ApplicationId, ApplicationReference = vm.ApplicationReference, ApplicationRoute = vm.ApplicationRoute, DeclaredInApplication = vm.DeclaredInApplication, Sections = vm.Sections, OutstandingFinancialDueDate = vm.OutstandingFinancialDueDate, GoodFinancialDueDate = vm.GoodFinancialDueDate, SatisfactoryFinancialDueDate = vm.SatisfactoryFinancialDueDate, InternalComments = internalComments, Ukprn = vm.Ukprn, OrganisationName = vm.OrganisationName, SubmittedDate = vm.SubmittedDate }; return(viewModel); }
private FinancialReviewDetails RebuildFinancialReviewDetailsForSubmission(RoatpFinancialClarificationViewModel vm) { var comments = vm.Comments; var externalComments = default(string); if (vm.FinancialReviewDetails.SelectedGrade == FinancialApplicationSelectedGrade.Inadequate) { comments = vm.InadequateComments; externalComments = vm.InadequateExternalComments; } var financialReviewDetails = new FinancialReviewDetails { GradedBy = _contextAccessor.HttpContext.User.UserDisplayName(), GradedDateTime = DateTime.UtcNow, SelectedGrade = vm.FinancialReviewDetails.SelectedGrade, FinancialDueDate = GetFinancialDueDate(vm), Comments = comments, ExternalComments = externalComments, ClarificationResponse = vm.ClarificationResponse, ClarificationRequestedOn = vm.FinancialReviewDetails.ClarificationRequestedOn, ClarificationFiles = vm.FinancialReviewDetails.ClarificationFiles }; return(financialReviewDetails); }
public void When_FilesToUpload_has_file_that_exceeds_maximum_filesize_then_an_error_is_returned() { const int currentMaxFileSizeInBytes = 5 * 1024 * 1024; var _viewModel = new RoatpFinancialClarificationViewModel { SatisfactoryFinancialDueDate = new FinancialDueDate { Day = DateTime.Today.AddDays(-1).Day.ToString(), Month = DateTime.Today.Month.ToString(), Year = DateTime.Today.Year.ToString() }, FinancialReviewDetails = new FinancialReviewDetails { SelectedGrade = FinancialApplicationSelectedGrade.Satisfactory, } }; _viewModel.FilesToUpload = new FormFileCollection { GenerateClarificationFile("ClarificationFile.pdf", true, currentMaxFileSizeInBytes + 1) }; var response = _validator.Validate(_viewModel, true, false); Assert.IsFalse(response.IsValid); Assert.AreEqual("The selected file must be smaller than 5MB", response.Errors.First().ErrorMessage); Assert.AreEqual("ClarificationFile", response.Errors.First().Field); }
public async Task <IActionResult> SubmitClarification(Guid applicationId, RoatpFinancialClarificationViewModel vm) { var removeClarificationFileName = string.Empty; var application = await _applyApiClient.GetApplication(vm.ApplicationId); if (application is null) { return(RedirectToAction(nameof(OpenApplications))); } var financialReview = await _applyApiClient.GetFinancialReviewDetails(vm.ApplicationId); var isClarificationFilesUpload = HttpContext.Request.Form["submitClarificationFiles"].Count != 0; var isClarificationOutcome = HttpContext.Request.Form["submitClarificationOutcome"].Count == 1; if (!isClarificationFilesUpload && !isClarificationOutcome && HttpContext.Request.Form["removeClarificationFile"].Count == 1) { removeClarificationFileName = HttpContext.Request.Form["removeClarificationFile"].ToString(); } vm.FinancialReviewDetails.ClarificationFiles = financialReview.ClarificationFiles; vm.FilesToUpload = HttpContext.Request.Form.Files; var validationResponse = _clarificationValidator.Validate(vm, isClarificationFilesUpload, isClarificationOutcome); if (validationResponse.Errors != null && validationResponse.Errors.Count > 0) { var newClarificationViewModel = await ProcessErrorMessagesAndRebuildModel(vm, application, validationResponse); return(View("~/Views/Roatp/Apply/Financial/Application_Clarification.cshtml", newClarificationViewModel)); } if (isClarificationFilesUpload) { var newClarificationVm = await ProcessUploadedFilesAndRebuildViewModel(applicationId, vm, application); return(View("~/Views/Roatp/Apply/Financial/Application_Clarification.cshtml", newClarificationVm)); } if (!string.IsNullOrEmpty(removeClarificationFileName)) { var newClarificationVm = await RemoveUploadedFileAndRebuildViewModel(applicationId, vm, removeClarificationFileName, application); return(View("~/Views/Roatp/Apply/Financial/Application_Clarification.cshtml", newClarificationVm)); } var financialReviewDetails = RebuildFinancialReviewDetailsForSubmission(vm); await _applyApiClient.ReturnFinancialReview(vm.ApplicationId, financialReviewDetails); return(RedirectToAction(nameof(Graded), new { vm.ApplicationId })); }
public void Validator_rejects_missing_SelectedGrade() { var _viewModel = new RoatpFinancialClarificationViewModel { FinancialReviewDetails = new FinancialReviewDetails { SelectedGrade = null } }; var validationResponse = _validator.Validate(_viewModel, false, true); var error = validationResponse.Errors.FirstOrDefault(x => x.Field == "FinancialReviewDetails.SelectedGrade"); error.Should().NotBeNull(); }
public void Validator_rejects_InadequateExternalComments_above_maxwordcount_when_graded_Inadequate() { var _viewModel = new RoatpFinancialClarificationViewModel { InadequateComments = "comments", InadequateExternalComments = string.Join(" ", Enumerable.Repeat("a", MaxWordCount + 1)), FinancialReviewDetails = new FinancialReviewDetails { SelectedGrade = FinancialApplicationSelectedGrade.Inadequate, } }; var validationResponse = _validator.Validate(_viewModel, false, true); var error = validationResponse.Errors.FirstOrDefault(x => x.Field == "InadequateExternalComments"); error.Should().NotBeNull(); }
public void Validator_rejects_missing_InadequateExternalComments_when_graded_Inadequate() { var _viewModel = new RoatpFinancialClarificationViewModel { InadequateComments = "comments", InadequateExternalComments = null, FinancialReviewDetails = new FinancialReviewDetails { SelectedGrade = FinancialApplicationSelectedGrade.Inadequate, } }; var validationResponse = _validator.Validate(_viewModel, false, true); var error = validationResponse.Errors.FirstOrDefault(x => x.Field == "InadequateExternalComments"); error.Should().NotBeNull(); }
public void Validator_rejects_missing_FinancialDueDate_when_graded_Satisfactory() { var _viewModel = new RoatpFinancialClarificationViewModel { SatisfactoryFinancialDueDate = new FinancialDueDate { }, FinancialReviewDetails = new FinancialReviewDetails { SelectedGrade = FinancialApplicationSelectedGrade.Satisfactory, } }; var validationResponse = _validator.Validate(_viewModel, false, true); var error = validationResponse.Errors.FirstOrDefault(x => x.Field == "SatisfactoryFinancialDueDate"); error.Should().NotBeNull(); }
public void Validator_rejects_FinancialDueDate_before_today_when_graded_Satisfactory() { var _viewModel = new RoatpFinancialClarificationViewModel { SatisfactoryFinancialDueDate = new FinancialDueDate { Day = DateTime.Today.AddDays(-1).Day.ToString(), Month = DateTime.Today.AddDays(-1).Month.ToString(), Year = DateTime.Today.AddDays(-1).Year.ToString() }, FinancialReviewDetails = new FinancialReviewDetails { SelectedGrade = FinancialApplicationSelectedGrade.Satisfactory, } }; var validationResponse = _validator.Validate(_viewModel, false, true); var error = validationResponse.Errors.FirstOrDefault(x => x.Field == "SatisfactoryFinancialDueDate"); error.Should().NotBeNull(); }
public void Validator_rejects_invalid_FinancialDueDate_when_graded_Good() { var _viewModel = new RoatpFinancialClarificationViewModel { GoodFinancialDueDate = new FinancialDueDate { Day = "999", Month = DateTime.Today.Month.ToString(), Year = DateTime.Today.Year.ToString() }, FinancialReviewDetails = new FinancialReviewDetails { SelectedGrade = FinancialApplicationSelectedGrade.Good, } }; var validationResponse = _validator.Validate(_viewModel, false, true); var error = validationResponse.Errors.FirstOrDefault(x => x.Field == "GoodFinancialDueDate"); error.Should().NotBeNull(); }
public void Validator_rejects_unparseable_FinancialDueDate_when_graded_Good() { var _viewModel = new RoatpFinancialClarificationViewModel { GoodFinancialDueDate = new FinancialDueDate { Day = "test", Month = "test", Year = "test" }, FinancialReviewDetails = new FinancialReviewDetails { SelectedGrade = FinancialApplicationSelectedGrade.Good, } }; var validationResponse = _validator.Validate(_viewModel, false, true); var error = validationResponse.Errors.FirstOrDefault(x => x.Field == "GoodFinancialDueDate"); error.Should().NotBeNull(); }
public void When_FilesToUpload_has_no_file() { var _viewModel = new RoatpFinancialClarificationViewModel { SatisfactoryFinancialDueDate = new FinancialDueDate { Day = DateTime.Today.AddDays(-1).Day.ToString(), Month = DateTime.Today.Month.ToString(), Year = DateTime.Today.Year.ToString() }, FinancialReviewDetails = new FinancialReviewDetails { SelectedGrade = FinancialApplicationSelectedGrade.Satisfactory, } }; _viewModel.FilesToUpload = new FormFileCollection(); var response = _validator.Validate(_viewModel, true, false); Assert.IsFalse(response.IsValid); Assert.AreEqual("Select a file", response.Errors.First().ErrorMessage); Assert.AreEqual("ClarificationFile", response.Errors.First().Field); }
private async Task <RoatpFinancialClarificationViewModel> RemoveUploadedFileAndRebuildViewModel(Guid applicationId, RoatpFinancialClarificationViewModel vm, string removeClarificationFileName, RoatpApply application) { var fileRemoved = await _applyApiClient.RemoveClarificationFile(applicationId, _contextAccessor.HttpContext.User.UserId(), removeClarificationFileName); var financialReviewDets = vm.FinancialReviewDetails; if (fileRemoved) { var clarificationFiles = financialReviewDets.ClarificationFiles; var newClarificationFiles = new List <ClarificationFile>(); if (clarificationFiles != null) { foreach (var file in clarificationFiles) { if (file.Filename != removeClarificationFileName) { newClarificationFiles.Add(file); } } financialReviewDets.ClarificationFiles = newClarificationFiles; } } var applicationVm = await RebuildApplicationViewModel(vm, application, financialReviewDets); var newClarificationVm = ConvertFinancialApplicationToFinancialClarificationViewModel(applicationVm, vm.InternalComments); return(newClarificationVm); }
public ValidationResponse Validate(RoatpFinancialClarificationViewModel vm, bool isClarificationFilesUpload, bool isClarificationOutcome) { var validationResponse = new ValidationResponse { Errors = new List <ValidationErrorDetail>() }; if (isClarificationFilesUpload && vm.FilesToUpload != null) { foreach (var file in vm.FilesToUpload) { if (!FileContentIsValidForPdfFile(file)) { validationResponse.Errors.Add(new ValidationErrorDetail(ClarificationFile, FileMustBePdf)); break; } else if (file.Length > MaxFileSizeInBytes) { validationResponse.Errors.Add(new ValidationErrorDetail(ClarificationFile, MaxFileSizeExceeded)); break; } } if (vm.FilesToUpload.Count == 0) { validationResponse.Errors.Add(new ValidationErrorDetail(ClarificationFile, "Select a file")); } } if (isClarificationOutcome) { if (string.IsNullOrWhiteSpace(vm.ClarificationResponse)) { validationResponse.Errors.Add(new ValidationErrorDetail(ClarificationResponse, "Enter clarification response")); } else if (HasExceededWordCount(vm.ClarificationResponse)) { validationResponse.Errors.Add(new ValidationErrorDetail(ClarificationResponse, "Your comments must be 500 words or less")); } if (vm?.FinancialReviewDetails is null || string.IsNullOrWhiteSpace(vm.FinancialReviewDetails.SelectedGrade)) { validationResponse.Errors.Add(new ValidationErrorDetail("FinancialReviewDetails.SelectedGrade", "Select the outcome of this financial health assessment")); } else { switch (vm.FinancialReviewDetails.SelectedGrade) { case FinancialApplicationSelectedGrade.Exempt: break; case FinancialApplicationSelectedGrade.Inadequate: if (string.IsNullOrWhiteSpace(vm.InadequateComments)) { validationResponse.Errors.Add(new ValidationErrorDetail("InadequateComments", "Enter internal comments")); } else if (HasExceededWordCount(vm.InadequateComments)) { validationResponse.Errors.Add(new ValidationErrorDetail("InadequateComments", "Your internal comments must be 500 words or less")); } if (string.IsNullOrWhiteSpace(vm.InadequateExternalComments)) { validationResponse.Errors.Add(new ValidationErrorDetail("InadequateExternalComments", "Enter external comments")); } else if (HasExceededWordCount(vm.InadequateExternalComments)) { validationResponse.Errors.Add(new ValidationErrorDetail("InadequateExternalComments", "Your external comments must be 500 words or less")); } break; case FinancialApplicationSelectedGrade.Outstanding: case FinancialApplicationSelectedGrade.Good: case FinancialApplicationSelectedGrade.Satisfactory: switch (vm.FinancialReviewDetails.SelectedGrade) { case FinancialApplicationSelectedGrade.Outstanding: ProcessDate(vm.OutstandingFinancialDueDate, "OutstandingFinancialDueDate", validationResponse); break; case FinancialApplicationSelectedGrade.Good: ProcessDate(vm.GoodFinancialDueDate, "GoodFinancialDueDate", validationResponse); break; case FinancialApplicationSelectedGrade.Satisfactory: ProcessDate(vm.SatisfactoryFinancialDueDate, "SatisfactoryFinancialDueDate", validationResponse); break; } break; } } }
private async Task <RoatpFinancialApplicationViewModel> RebuildApplicationViewModel(RoatpFinancialClarificationViewModel vm, RoatpApply application, FinancialReviewDetails financialReviewDetails) { var clarificationVm = await CreateRoatpFinancialApplicationViewModel(application); clarificationVm.ApplicantEmailAddress = vm.ApplicantEmailAddress; clarificationVm.ClarificationComments = vm.ClarificationComments; clarificationVm.FinancialReviewDetails = financialReviewDetails; clarificationVm.OutstandingFinancialDueDate = vm.OutstandingFinancialDueDate; clarificationVm.GoodFinancialDueDate = vm.GoodFinancialDueDate; clarificationVm.SatisfactoryFinancialDueDate = vm.SatisfactoryFinancialDueDate; clarificationVm.InadequateComments = vm.InadequateComments; clarificationVm.InadequateExternalComments = vm.InadequateExternalComments; return(clarificationVm); }
private async Task <RoatpFinancialClarificationViewModel> ProcessErrorMessagesAndRebuildModel(RoatpFinancialClarificationViewModel vm, RoatpApply application, ValidationResponse validationResponse) { var applicationViewModel = await RebuildApplicationViewModel(vm, application, vm.FinancialReviewDetails); var newClarificationViewModel = ConvertFinancialApplicationToFinancialClarificationViewModel(applicationViewModel, vm.InternalComments); newClarificationViewModel.ErrorMessages = validationResponse.Errors; return(newClarificationViewModel); }
private async Task <RoatpFinancialClarificationViewModel> ProcessUploadedFilesAndRebuildViewModel(Guid applicationId, RoatpFinancialClarificationViewModel vm, RoatpApply application) { var financialReviewDets = vm.FinancialReviewDetails; if (vm.FilesToUpload != null && vm.FilesToUpload.Count > 0) { var fileToUpload = vm.FilesToUpload[0].FileName; if (!FileAlreadyInClarifications(financialReviewDets.ClarificationFiles, fileToUpload)) { var fileUploadedSuccessfully = await _applyApiClient.UploadClarificationFile(applicationId, _contextAccessor.HttpContext.User.UserId(), vm.FilesToUpload); if (fileUploadedSuccessfully) { if (financialReviewDets.ClarificationFiles == null) { financialReviewDets.ClarificationFiles = new List <ClarificationFile>(); } financialReviewDets.ClarificationFiles.Add(new ClarificationFile { Filename = fileToUpload }); } } } var clarificationVm = await RebuildApplicationViewModel(vm, application, financialReviewDets); var newClarificationVm = ConvertFinancialApplicationToFinancialClarificationViewModel(clarificationVm, vm.InternalComments); return(newClarificationVm); }
public void SubmitClarification_valid_submission(string grade) { _clarificationValidator.Setup(x => x.Validate(It.IsAny <RoatpFinancialClarificationViewModel>(), It.IsAny <bool>(), It.IsAny <bool>())) .Returns(new ValidationResponse { }); _applicationApplyApiClient.Setup(x => x.GetApplication(It.IsAny <Guid>())).ReturnsAsync( new RoatpApply { ApplicationId = _applicationId, ApplyData = new RoatpApplyData { ApplyDetails = new RoatpApplyDetails { OrganisationName = "org name", UKPRN = "12344321", ReferenceNumber = "3443", ProviderRouteName = "main", ApplicationSubmittedOn = DateTime.Today }, Sequences = new List <RoatpApplySequence> { new RoatpApplySequence { SequenceNo = 5, NotRequired = true } } } }); _financialReviewDetails = new FinancialReviewDetails { GradedBy = MockHttpContextAccessor.Name, GradedOn = DateTime.UtcNow, SelectedGrade = grade, FinancialDueDate = DateTime.Today.AddDays(5), Comments = "comments", ExternalComments = grade == FinancialApplicationSelectedGrade.Inadequate ? "external comments" : null, ClarificationResponse = "clarification response", ClarificationRequestedOn = DateTime.UtcNow }; _applicationApplyApiClient.Setup(x => x.GetFinancialReviewDetails(_applicationId)).ReturnsAsync(_financialReviewDetails); var vm = new RoatpFinancialClarificationViewModel { ApplicationId = _applicationId, FinancialReviewDetails = _financialReviewDetails, OutstandingFinancialDueDate = new FinancialDueDate { Day = "1", Month = "1", Year = (DateTime.Now.Year + 1).ToString() }, ClarificationResponse = "clarification response", ClarificationComments = "clarification comments", FilesToUpload = null }; var result = _controller.SubmitClarification(_applicationId, vm).Result as RedirectToActionResult; _applicationApplyApiClient.Verify(x => x.ReturnFinancialReview(_applicationId, It.IsAny <FinancialReviewDetails>()), Times.Once); Assert.AreEqual("Graded", result.ActionName); }
public void When_clarification_file_is_removed_and_page_is_refreshed_with_filename_removed_from_model() { var buttonPressed = "removeClarificationFile"; _applicationApplyApiClient.Setup(x => x.GetRoatpSequences()).ReturnsAsync(new List <RoatpSequence>()); _qnaApiClient.Setup(x => x.GetSectionBySectionNo(_applicationId, RoatpQnaConstants.RoatpSequences.YourOrganisation, RoatpQnaConstants.RoatpSections.YourOrganisation.OrganisationDetails)) .ReturnsAsync(new Section { ApplicationId = _applicationId, QnAData = new QnAData() }); _qnaApiClient.Setup(x => x.GetSectionBySectionNo(_applicationId, RoatpQnaConstants.RoatpSequences.YourOrganisation, RoatpQnaConstants.RoatpSections.YourOrganisation.DescribeYourOrganisation)) .ReturnsAsync(new Section { ApplicationId = _applicationId, QnAData = new QnAData() }); _controller = new RoatpFinancialController(_roatpOrganisationApiClient.Object, _applicationApplyApiClient.Object, _qnaApiClient.Object, MockHttpContextAccessor.Object, _clarificationValidator.Object, Mock.Of <ICsvExportService>()) { ControllerContext = MockedControllerContext.Setup(buttonPressed) }; _clarificationValidator.Setup(x => x.Validate(It.IsAny <RoatpFinancialClarificationViewModel>(), It.IsAny <bool>(), It.IsAny <bool>())) .Returns(new ValidationResponse { }); var fileToBeRemoved = "file.pdf"; _financialReviewDetails = new FinancialReviewDetails { GradedBy = MockHttpContextAccessor.Name, GradedDateTime = DateTime.UtcNow, SelectedGrade = FinancialApplicationSelectedGrade.Good, FinancialDueDate = DateTime.Today.AddDays(5), Comments = "comments", ClarificationResponse = "clarification response", ClarificationRequestedOn = DateTime.UtcNow, ClarificationFiles = new List <ClarificationFile> { new ClarificationFile { Filename = fileToBeRemoved }, new ClarificationFile { Filename = "second.pdf" } } }; _applicationApplyApiClient.Setup(x => x.GetApplication(It.IsAny <Guid>())).ReturnsAsync( new RoatpApply { ApplicationId = _applicationId, ApplyData = new RoatpApplyData { ApplyDetails = new RoatpApplyDetails { OrganisationName = "org name", UKPRN = "12344321", ReferenceNumber = "3443", ProviderRouteName = "main", ApplicationSubmittedOn = DateTime.Today }, Sequences = new List <RoatpApplySequence> { new RoatpApplySequence { SequenceNo = 5, NotRequired = true } } }, FinancialGrade = _financialReviewDetails }); _applicationApplyApiClient.Setup(x => x.RemoveClarificationFile(_applicationId, It.IsAny <string>(), fileToBeRemoved)) .ReturnsAsync(true); var vm = new RoatpFinancialClarificationViewModel { ApplicationId = _applicationId, FinancialReviewDetails = _financialReviewDetails, OutstandingFinancialDueDate = new FinancialDueDate { Day = "1", Month = "1", Year = (DateTime.Now.Year + 1).ToString() }, ClarificationResponse = "clarification response", ClarificationComments = "clarification comments", FilesToUpload = null }; var result = _controller.SubmitClarification(_applicationId, vm).Result as ViewResult; Assert.IsTrue(result.ViewName.Contains("Application_Clarification.cshtml")); var resultModel = result.Model as RoatpFinancialClarificationViewModel; Assert.IsTrue(resultModel.FinancialReviewDetails.ClarificationFiles.Count == 1); Assert.IsTrue(resultModel.FinancialReviewDetails.ClarificationFiles[0].Filename == "second.pdf"); }
public void when_validation_errors_occur_page_refreshes_with_validation_messages() { var buttonPressed = "submitClarificationFiles"; _applicationApplyApiClient.Setup(x => x.GetRoatpSequences()).ReturnsAsync(new List <RoatpSequence>()); _qnaApiClient.Setup(x => x.GetSectionBySectionNo(_applicationId, RoatpQnaConstants.RoatpSequences.YourOrganisation, RoatpQnaConstants.RoatpSections.YourOrganisation.OrganisationDetails)) .ReturnsAsync(new Section { ApplicationId = _applicationId, QnAData = new QnAData() }); _qnaApiClient.Setup(x => x.GetSectionBySectionNo(_applicationId, RoatpQnaConstants.RoatpSequences.YourOrganisation, RoatpQnaConstants.RoatpSections.YourOrganisation.DescribeYourOrganisation)) .ReturnsAsync(new Section { ApplicationId = _applicationId, QnAData = new QnAData() }); _controller = new RoatpFinancialController(_roatpOrganisationApiClient.Object, _applicationApplyApiClient.Object, _qnaApiClient.Object, _searchTermValidator.Object, _clarificationValidator.Object, Mock.Of <ICsvExportService>()) { ControllerContext = MockedControllerContext.Setup(buttonPressed) }; _clarificationValidator.Setup(x => x.Validate(It.IsAny <RoatpFinancialClarificationViewModel>(), It.IsAny <bool>(), It.IsAny <bool>())) .Returns(new ValidationResponse { Errors = new List <ValidationErrorDetail> { new ValidationErrorDetail { ErrorMessage = "error message", Field = "errorField" } } }); _applicationApplyApiClient.Setup(x => x.GetApplication(It.IsAny <Guid>())).ReturnsAsync( new RoatpApply { ApplicationId = _applicationId, ApplyData = new RoatpApplyData { ApplyDetails = new RoatpApplyDetails { OrganisationName = "org name", UKPRN = "12344321", ReferenceNumber = "3443", ProviderRouteName = "main", ApplicationSubmittedOn = DateTime.Today }, Sequences = new List <RoatpApplySequence> { new RoatpApplySequence { SequenceNo = 5, NotRequired = true } } } }); _applicationApplyApiClient.Setup(x => x.UploadClarificationFile(_applicationId, It.IsAny <string>(), It.IsAny <IFormFileCollection>())) .ReturnsAsync(true); _financialReviewDetails = new FinancialReviewDetails { GradedBy = MockHttpContextAccessor.Name, GradedOn = DateTime.UtcNow, SelectedGrade = FinancialApplicationSelectedGrade.Good, FinancialDueDate = DateTime.Today.AddDays(5), Comments = "comments", ClarificationResponse = "clarification response", ClarificationRequestedOn = DateTime.UtcNow }; _applicationApplyApiClient.Setup(x => x.GetFinancialReviewDetails(_applicationId)).ReturnsAsync(_financialReviewDetails); var vm = new RoatpFinancialClarificationViewModel { ApplicationId = _applicationId, FinancialReviewDetails = _financialReviewDetails, OutstandingFinancialDueDate = new FinancialDueDate { Day = "1", Month = "1", Year = (DateTime.Now.Year + 1).ToString() }, ClarificationResponse = "clarification response", ClarificationComments = "clarification comments", FilesToUpload = null }; var result = _controller.SubmitClarification(_applicationId, vm).Result as ViewResult; Assert.IsTrue(result.ViewName.Contains("Application_Clarification.cshtml")); var resultModel = result.Model as RoatpFinancialClarificationViewModel; Assert.AreEqual(1, resultModel.ErrorMessages.Count); }