Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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 }));
        }
Пример #6
0
        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();
        }
Пример #7
0
        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();
        }
Пример #8
0
        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();
        }
Пример #9
0
        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();
        }
Пример #10
0
        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();
        }
Пример #11
0
        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();
        }
Пример #12
0
        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();
        }
Пример #13
0
        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);
        }
Пример #14
0
        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);
        }
Пример #15
0
        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;
                    }
                }
            }
Пример #16
0
        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);
        }
Пример #17
0
        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);
        }
Пример #18
0
        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);
        }