public void Before_each_test()
        {
            _roatpOrganisationApiClient = new Mock <IRoatpOrganisationApiClient>();
            _applicationApplyApiClient  = new Mock <IRoatpApplicationApiClient>();
            _clarificationValidator     = new Mock <IRoatpFinancialClarificationViewModelValidator>();
            _qnaApiClient     = new Mock <IQnaApiClient>();
            _csvExportService = new Mock <ICsvExportService>();


            _financialReviewDetails = new FinancialReviewDetails();
            MockHttpContextAccessor = SetupMockedHttpContextAccessor();

            _controller = new RoatpFinancialController(_roatpOrganisationApiClient.Object,
                                                       _applicationApplyApiClient.Object,
                                                       _qnaApiClient.Object,
                                                       MockHttpContextAccessor.Object, _clarificationValidator.Object, _csvExportService.Object)
            {
                ControllerContext = MockedControllerContext.Setup()
            };
        }
        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);
        }
        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");
        }