public async Task Confirm_submit_application_submit_application_request_includes_organisation_type()
        {
            var application = new Apply
            {
                ApplicationId     = Guid.NewGuid(),
                ApplicationStatus = ApplicationStatus.InProgress,
                ApplyData         = new ApplyData
                {
                    ApplyDetails = new ApplyDetails(),
                    Sequences    = new List <ApplySequence>()
                }
            };

            var model = new SubmitApplicationViewModel
            {
                ApplicationId                                = application.ApplicationId,
                ConfirmSubmitApplication                     = true,
                ConfirmFurtherInfoSubmitApplication          = true,
                ConfirmChangeOfOwnershipSubmitApplication    = true,
                ConfirmFurtherCommunicationSubmitApplication = true,
                ErrorMessages                                = new List <ValidationErrorDetail>()
            };

            var organisationDetails = new Organisation
            {
                OrganisationUkprn = 10003000,
                Name = "Organisation Name",
                OrganisationDetails = new OrganisationDetails
                {
                    TradingName = "Trading name"
                }
            };

            _apiClient.Setup(x => x.GetOrganisationByUserId(It.IsAny <Guid>())).ReturnsAsync(organisationDetails);

            _apiClient.Setup(x => x.GetApplicationByUserId(It.IsAny <Guid>(), It.IsAny <Guid>())).ReturnsAsync(application);

            _qnaApiClient.Setup(x => x.GetSections(It.IsAny <Guid>())).ReturnsAsync(() => new List <ApplicationSection>
            {
                new ApplicationSection {
                    SectionId = 2, SequenceId = 2
                }
            });

            var applicationData = new JObject {
                { "OrganisationPublicBody", "test" }
            };

            _qnaApiClient.Setup(x => x.GetApplicationData(It.IsAny <Guid>()))
            .ReturnsAsync(() => applicationData);

            _qnaApiClient.Setup(x => x.GetPage(It.IsAny <Guid>(), It.IsAny <Guid>(), It.IsAny <string>()))
            .ReturnsAsync(() => new Page
            {
                Active        = false,
                PageOfAnswers = new List <PageOfAnswers>
                {
                    new PageOfAnswers {
                        Answers = new List <Answer>
                        {
                            new Answer {
                                QuestionId = "FH-140", Value = "1"
                            },
                            new Answer {
                                QuestionId = "FH-150", Value = "2"
                            },
                            new Answer {
                                QuestionId = "FH-160", Value = "3"
                            },
                            new Answer {
                                QuestionId = "FH-170", Value = "4"
                            },
                            new Answer {
                                QuestionId = "FH-180", Value = "5"
                            },
                            new Answer {
                                QuestionId = "FH-190", Value = "6"
                            },
                            new Answer {
                                QuestionId = "FH-200", Value = "7"
                            },
                            new Answer {
                                QuestionId = "FH-210", Value = "8"
                            },
                            new Answer {
                                QuestionId = "FH-220", Value = "9"
                            },
                            new Answer {
                                QuestionId = "FH-420", Value = "01,01,2021"
                            },
                            new Answer {
                                QuestionId = "FH-430", Value = "10"
                            }
                        }
                    }
                }
            });

            var providerRouteAnswer = new Answer
            {
                QuestionId = "YO-1",
                Value      = ApplicationRoute.MainProviderApplicationRoute.ToString()
            };

            _qnaApiClient.Setup(x => x.GetAnswerByTag(It.IsAny <Guid>(), RoatpWorkflowQuestionTags.ProviderRoute, It.IsAny <string>())).ReturnsAsync(providerRouteAnswer);

            _apiClient.Setup(x => x.GetApplication(It.IsAny <Guid>())).ReturnsAsync(application);

            _apiClient.Setup(x => x.SubmitApplication(It.IsAny <Application.Apply.Submit.SubmitApplicationRequest>())).ReturnsAsync(true);

            _submitApplicationEmailService.Setup(x => x.SendSubmitConfirmationEmail(It.IsAny <ApplicationSubmitConfirmation>())).Returns(Task.FromResult(true));

            await _controller.ConfirmSubmitApplication(model);

            _apiClient.Verify(x =>
                              x.SubmitApplication(It.Is <SubmitApplicationRequest>(r => r.OrganisationType == "test")));
        }
        public async Task Confirm_submit_application_submit_application_request_includes_financial_data()
        {
            var application = new Apply
            {
                ApplicationId     = Guid.NewGuid(),
                ApplicationStatus = ApplicationStatus.InProgress,
                ApplyData         = new ApplyData
                {
                    ApplyDetails = new ApplyDetails(),
                    Sequences    = new List <ApplySequence>()
                }
            };

            var model = new SubmitApplicationViewModel
            {
                ApplicationId                                = application.ApplicationId,
                ConfirmSubmitApplication                     = true,
                ConfirmFurtherInfoSubmitApplication          = true,
                ConfirmChangeOfOwnershipSubmitApplication    = true,
                ConfirmFurtherCommunicationSubmitApplication = true,
                ErrorMessages                                = new List <ValidationErrorDetail>()
            };

            var organisationDetails = new Organisation
            {
                OrganisationUkprn = 10003000,
                Name = "Organisation Name",
                OrganisationDetails = new OrganisationDetails
                {
                    TradingName = "Trading name"
                }
            };

            _apiClient.Setup(x => x.GetOrganisationByUserId(It.IsAny <Guid>())).ReturnsAsync(organisationDetails);

            _apiClient.Setup(x => x.GetApplicationByUserId(It.IsAny <Guid>(), It.IsAny <Guid>())).ReturnsAsync(application);

            _qnaApiClient.Setup(x => x.GetSections(It.IsAny <Guid>())).ReturnsAsync(() => new List <ApplicationSection>
            {
                new ApplicationSection {
                    SectionId = 2, SequenceId = 2
                }
            });

            _qnaApiClient.Setup(x => x.GetApplicationData(It.IsAny <Guid>()))
            .ReturnsAsync(() => new JObject
            {
                new JProperty(RoatpWorkflowQuestionTags.Turnover, "1"),
                new JProperty(RoatpWorkflowQuestionTags.Depreciation, "2"),
                new JProperty(RoatpWorkflowQuestionTags.ProfitLoss, "3"),
                new JProperty(RoatpWorkflowQuestionTags.Dividends, "4"),
                new JProperty(RoatpWorkflowQuestionTags.Assets, "5"),
                new JProperty(RoatpWorkflowQuestionTags.Liabilities, "6"),
                new JProperty(RoatpWorkflowQuestionTags.Borrowings, "7"),
                new JProperty(RoatpWorkflowQuestionTags.ShareholderFunds, "8"),
                new JProperty(RoatpWorkflowQuestionTags.IntangibleAssets, "9"),
                new JProperty(RoatpWorkflowQuestionTags.AccountingReferenceDate, "01,01,2021"),
                new JProperty(RoatpWorkflowQuestionTags.AccountingPeriod, "10"),
                new JProperty(RoatpWorkflowQuestionTags.AverageNumberofFTEEmployees, "11")
            });

            var providerRouteAnswer = new Answer
            {
                QuestionId = "YO-1",
                Value      = ApplicationRoute.MainProviderApplicationRoute.ToString()
            };

            _qnaApiClient.Setup(x => x.GetAnswerByTag(It.IsAny <Guid>(), RoatpWorkflowQuestionTags.ProviderRoute, It.IsAny <string>())).ReturnsAsync(providerRouteAnswer);

            _apiClient.Setup(x => x.GetApplication(It.IsAny <Guid>())).ReturnsAsync(application);

            _apiClient.Setup(x => x.SubmitApplication(It.IsAny <Application.Apply.Submit.SubmitApplicationRequest>())).ReturnsAsync(true);

            _submitApplicationEmailService.Setup(x => x.SendSubmitConfirmationEmail(It.IsAny <ApplicationSubmitConfirmation>())).Returns(Task.FromResult(true));

            await _controller.ConfirmSubmitApplication(model);

            _apiClient.Verify(x =>
                              x.SubmitApplication(It.Is <SubmitApplicationRequest>(r =>
                                                                                   r.FinancialData.TurnOver == 1 &&
                                                                                   r.FinancialData.Depreciation == 2 &&
                                                                                   r.FinancialData.ProfitLoss == 3 &&
                                                                                   r.FinancialData.Dividends == 4 &&
                                                                                   r.FinancialData.Assets == 5 &&
                                                                                   r.FinancialData.Liabilities == 6 &&
                                                                                   r.FinancialData.Borrowings == 7 &&
                                                                                   r.FinancialData.ShareholderFunds == 8 &&
                                                                                   r.FinancialData.IntangibleAssets == 9 &&
                                                                                   r.FinancialData.AccountingReferenceDate == new DateTime(2021, 1, 1) &&
                                                                                   r.FinancialData.AccountingPeriod == 10 &&
                                                                                   r.FinancialData.AverageNumberofFTEEmployees == 11
                                                                                   )));
        }
        public async Task Confirm_submit_application_submit_application_request_includes_null_financial_data_if_financial_page_is_not_active()
        {
            var application = new Apply
            {
                ApplicationId     = Guid.NewGuid(),
                ApplicationStatus = ApplicationStatus.InProgress,
                ApplyData         = new ApplyData
                {
                    ApplyDetails = new ApplyDetails(),
                    Sequences    = new List <ApplySequence>()
                }
            };

            var model = new SubmitApplicationViewModel
            {
                ApplicationId                                = application.ApplicationId,
                ConfirmSubmitApplication                     = true,
                ConfirmFurtherInfoSubmitApplication          = true,
                ConfirmChangeOfOwnershipSubmitApplication    = true,
                ConfirmFurtherCommunicationSubmitApplication = true,
                ErrorMessages                                = new List <ValidationErrorDetail>()
            };

            var organisationDetails = new Organisation
            {
                OrganisationUkprn = 10003000,
                Name = "Organisation Name",
                OrganisationDetails = new OrganisationDetails
                {
                    TradingName = "Trading name"
                }
            };

            _apiClient.Setup(x => x.GetOrganisationByUserId(It.IsAny <Guid>())).ReturnsAsync(organisationDetails);

            _apiClient.Setup(x => x.GetApplicationByUserId(It.IsAny <Guid>(), It.IsAny <Guid>())).ReturnsAsync(application);

            _qnaApiClient.Setup(x => x.GetSections(It.IsAny <Guid>())).ReturnsAsync(() => new List <ApplicationSection>
            {
                new ApplicationSection {
                    SectionId = 2, SequenceId = 2
                }
            });

            var applicationData = new JObject();

            _qnaApiClient.Setup(x => x.GetApplicationData(It.IsAny <Guid>()))
            .ReturnsAsync(() => applicationData);

            _qnaApiClient.Setup(x => x.GetPage(It.IsAny <Guid>(), It.IsAny <Guid>(), It.IsAny <string>()))
            .ReturnsAsync(() => new Page
            {
                Active        = false,
                PageOfAnswers = new List <PageOfAnswers>
                {
                    new PageOfAnswers {
                        Answers = new List <Answer>
                        {
                            new Answer {
                                QuestionId = "FH-140", Value = "1"
                            },
                            new Answer {
                                QuestionId = "FH-150", Value = "2"
                            },
                            new Answer {
                                QuestionId = "FH-160", Value = "3"
                            },
                            new Answer {
                                QuestionId = "FH-170", Value = "4"
                            },
                            new Answer {
                                QuestionId = "FH-180", Value = "5"
                            },
                            new Answer {
                                QuestionId = "FH-190", Value = "6"
                            },
                            new Answer {
                                QuestionId = "FH-200", Value = "7"
                            },
                            new Answer {
                                QuestionId = "FH-210", Value = "8"
                            },
                            new Answer {
                                QuestionId = "FH-220", Value = "9"
                            },
                            new Answer {
                                QuestionId = "FH-420", Value = "01,01,2021"
                            },
                            new Answer {
                                QuestionId = "FH-430", Value = "10"
                            }
                        }
                    }
                }
            });

            var providerRouteAnswer = new Answer
            {
                QuestionId = "YO-1",
                Value      = ApplicationRoute.MainProviderApplicationRoute.ToString()
            };

            _qnaApiClient.Setup(x => x.GetAnswerByTag(It.IsAny <Guid>(), RoatpWorkflowQuestionTags.ProviderRoute, It.IsAny <string>())).ReturnsAsync(providerRouteAnswer);

            _apiClient.Setup(x => x.GetApplication(It.IsAny <Guid>())).ReturnsAsync(application);

            _apiClient.Setup(x => x.SubmitApplication(It.IsAny <Application.Apply.Submit.SubmitApplicationRequest>())).ReturnsAsync(true);

            _submitApplicationEmailService.Setup(x => x.SendSubmitConfirmationEmail(It.IsAny <ApplicationSubmitConfirmation>())).Returns(Task.FromResult(true));

            await _controller.ConfirmSubmitApplication(model);

            _apiClient.Verify(x =>
                              x.SubmitApplication(It.Is <SubmitApplicationRequest>(r =>
                                                                                   r.FinancialData.TurnOver == null &&
                                                                                   r.FinancialData.Depreciation == null &&
                                                                                   r.FinancialData.ProfitLoss == null &&
                                                                                   r.FinancialData.Dividends == null &&
                                                                                   r.FinancialData.Assets == null &&
                                                                                   r.FinancialData.Liabilities == null &&
                                                                                   r.FinancialData.Borrowings == null &&
                                                                                   r.FinancialData.ShareholderFunds == null &&
                                                                                   r.FinancialData.IntangibleAssets == null &&
                                                                                   r.FinancialData.AccountingReferenceDate == null &&
                                                                                   r.FinancialData.AccountingPeriod == null
                                                                                   )));
        }
        public async Task Confirm_submit_application_updates_application_status_and_sends_confirmation_email_if_they_have_confirmed_details_are_correct()
        {
            var application = new Apply
            {
                ApplicationId     = Guid.NewGuid(),
                ApplicationStatus = ApplicationStatus.InProgress,
                ApplyData         = new ApplyData
                {
                    ApplyDetails = new ApplyDetails(),
                    Sequences    = new List <ApplySequence>()
                }
            };

            var model = new SubmitApplicationViewModel
            {
                ApplicationId                                = application.ApplicationId,
                ConfirmSubmitApplication                     = true,
                ConfirmFurtherInfoSubmitApplication          = true,
                ConfirmChangeOfOwnershipSubmitApplication    = true,
                ConfirmFurtherCommunicationSubmitApplication = true,
                ErrorMessages                                = new List <ValidationErrorDetail>()
            };

            var organisationDetails = new Organisation
            {
                OrganisationUkprn = 10003000,
                Name = "Organisation Name",
                OrganisationDetails = new OrganisationDetails
                {
                    TradingName = "Trading name"
                }
            };

            _apiClient.Setup(x => x.GetOrganisationByUserId(It.IsAny <Guid>())).ReturnsAsync(organisationDetails);

            _apiClient.Setup(x => x.GetApplicationByUserId(It.IsAny <Guid>(), It.IsAny <Guid>())).ReturnsAsync(application);

            _qnaApiClient.Setup(x => x.GetSections(It.IsAny <Guid>())).ReturnsAsync(() => new List <ApplicationSection>
            {
                new ApplicationSection {
                    SectionId = 2, SequenceId = 2,
                }
            });

            _qnaApiClient.Setup(x => x.GetApplicationData(It.IsAny <Guid>()))
            .ReturnsAsync(() => new JObject());

            _qnaApiClient.Setup(x => x.GetPage(It.IsAny <Guid>(), It.IsAny <Guid>(), It.IsAny <string>()))
            .ReturnsAsync(() => new Page
            {
                PageOfAnswers = new List <PageOfAnswers>
                {
                    new PageOfAnswers {
                        Answers = new List <Answer>()
                    }
                }
            });

            var providerRouteAnswer = new Answer
            {
                QuestionId = "YO-1",
                Value      = ApplicationRoute.MainProviderApplicationRoute.ToString()
            };

            _qnaApiClient.Setup(x => x.GetAnswerByTag(It.IsAny <Guid>(), RoatpWorkflowQuestionTags.ProviderRoute, It.IsAny <string>())).ReturnsAsync(providerRouteAnswer);

            _apiClient.Setup(x => x.GetApplication(It.IsAny <Guid>())).ReturnsAsync(application);

            _apiClient.Setup(x => x.SubmitApplication(It.IsAny <Application.Apply.Submit.SubmitApplicationRequest>())).ReturnsAsync(true);

            _submitApplicationEmailService.Setup(x => x.SendSubmitConfirmationEmail(It.IsAny <ApplicationSubmitConfirmation>())).Returns(Task.FromResult(true));

            var result = await _controller.ConfirmSubmitApplication(model);

            var redirectResult = result as RedirectToActionResult;

            redirectResult.Should().NotBeNull();
            redirectResult.ActionName.Should().Be("ApplicationSubmitted");

            _submitApplicationEmailService.VerifyAll();
        }