public async Task And_Nothing_Is_Selected_Then_Error_Is_Returned()
        {
            // Arrange
            _mockStandardVersionApiClient.Setup(m => m.GetEpaoRegisteredStandardVersions(It.IsAny <string>(), "ST0001"))
            .ReturnsAsync(new List <StandardVersion>()
            {
                new StandardVersion()
                {
                    Version = "1.0"
                },
                new StandardVersion()
                {
                    Version = "1.1"
                },
                new StandardVersion()
                {
                    Version = "1.2"
                }
            });

            var model = new CheckWithdrawalRequestViewModel()
            {
                Continue = null
            };

            // Act
            var result = await _sut.CheckWithdrawalRequest("ST0001", "1.1,1.2", null, model) as RedirectToActionResult;

            // Assert
            _sut.ModelState.IsValid.Should().BeFalse();
            _sut.ModelState["Continue"].Errors.Should().Contain(x => x.ErrorMessage == "Select Yes or No");
        }
        public async Task And_No_Is_Selected_Then_Redirected_To_WithdrawalApplications()
        {
            // Arrange
            _mockStandardVersionApiClient.Setup(m => m.GetEpaoRegisteredStandardVersions(It.IsAny <string>(), "ST0001"))
            .ReturnsAsync(new List <StandardVersion>()
            {
                new StandardVersion()
                {
                    Version = "1.0"
                },
                new StandardVersion()
                {
                    Version = "1.1"
                },
                new StandardVersion()
                {
                    Version = "1.2"
                }
            });

            var model = new CheckWithdrawalRequestViewModel()
            {
                Continue = "No"
            };

            // Act
            var result = await _sut.CheckWithdrawalRequest("ST0001", "1.1,1.2", null, model) as RedirectToActionResult;

            // Assert
            result.ActionName.Should().Be(nameof(ApplyForWithdrawalController.WithdrawalApplications));
            result.ControllerName.Should().Be(nameof(ApplyForWithdrawalController).RemoveController());
        }
        public async Task And_Yes_Is_Selected_For_Standard_Then_Application_Is_Created()
        {
            // Arrange
            _mockApplicationApiClient.Setup(m => m.GetWithdrawalApplications(It.IsAny <Guid>()))
            .ReturnsAsync(new List <ApplicationResponse>());

            _mockStandardVersionApiClient.Setup(m => m.GetEpaoRegisteredStandardVersions(It.IsAny <string>(), "ST0001"))
            .ReturnsAsync(new List <StandardVersion>()
            {
                new StandardVersion()
                {
                    Version = "1.0"
                },
                new StandardVersion()
                {
                    Version = "1.1"
                },
                new StandardVersion()
                {
                    Version = "1.2"
                }
            });

            var applicationId = Guid.NewGuid();

            _mockApplicationApiClient
            .Setup(r => r.CreateApplication(It.IsAny <CreateApplicationRequest>()))
            .ReturnsAsync(applicationId);

            var model = new CheckWithdrawalRequestViewModel()
            {
                Continue = "yes"
            };

            // Act
            var result = await _sut.CheckWithdrawalRequest("ST0001", null, null, model) as RedirectToActionResult;

            // Assert
            result.ActionName.Should().Be(nameof(ApplicationController.Sequence));
            result.ControllerName.Should().Be(nameof(ApplicationController).RemoveController());
            result.RouteValues.GetValueOrDefault("Id").Should().Be(applicationId);

            _mockApplicationApiClient.Verify(m => m.UpdateStandardData(applicationId, It.IsAny <int>(), "ST0001", It.IsAny <string>(),
                                                                       null, StandardApplicationTypes.StandardWithdrawal));
        }
        public async Task And_Yes_Is_Selected_For_Organisation_Withdrawal_Then_Application_Is_Created()
        {
            // Arrange
            var applicationId = Guid.NewGuid();

            _mockApplicationApiClient
            .Setup(r => r.CreateApplication(It.IsAny <CreateApplicationRequest>()))
            .ReturnsAsync(applicationId);

            var model = new CheckWithdrawalRequestViewModel()
            {
                Continue = "yes"
            };

            // Act
            var result = await _sut.CheckWithdrawalRequest(null, null, null, model) as RedirectToActionResult;

            // Assert
            result.ActionName.Should().Be(nameof(ApplicationController.Sequence));
            result.ControllerName.Should().Be(nameof(ApplicationController).RemoveController());
            result.RouteValues.GetValueOrDefault("Id").Should().Be(applicationId);
        }
        public async Task <IActionResult> CheckWithdrawalRequest(string iFateReferenceNumber, string versionsToWithdrawal, [FromQuery] string backAction, CheckWithdrawalRequestViewModel model)
        {
            var contact = await GetUserContact();

            var organisation = await _orgApiClient.GetOrganisationByUserId(contact.Id);

            var versions = await _standardVersionApiClient.GetEpaoRegisteredStandardVersions(organisation.EndPointAssessorOrganisationId, iFateReferenceNumber);

            var standard = versions.FirstOrDefault();

            if (string.IsNullOrWhiteSpace(model.Continue))
            {
                ModelState.AddModelError(nameof(model.Continue), "Select Yes or No");
            }

            if (!ModelState.IsValid)
            {
                model.IFateReferenceNumber = iFateReferenceNumber;
                model.Level        = standard?.Level ?? default;
                model.StandardName = standard?.Title;
                model.BackAction   = backAction;
                return(View(model));
            }

            if (model.Continue.Equals("no", StringComparison.InvariantCultureIgnoreCase))
            {
                return(RedirectToAction(
                           nameof(WithdrawalApplications),
                           nameof(ApplyForWithdrawalController).RemoveController()));
            }

            if (string.IsNullOrWhiteSpace(iFateReferenceNumber))
            {
                var id = await CreateOrganisationWithdrawalApplication(contact, organisation);

                return(RedirectToAction(
                           nameof(ApplicationController.Sequence),
                           nameof(ApplicationController).RemoveController(),
                           new { Id = id, sequenceNo = ApplyConst.ORGANISATION_WITHDRAWAL_SEQUENCE_NO }));
            }
            else
            {
                if (string.IsNullOrWhiteSpace(versionsToWithdrawal))
                {
                    var applications = await GetInProgressWithdrawalVersionApplications(contact.Id, iFateReferenceNumber);

                    if (applications.Any())
                    {
                        await _applicationApiClient.DeleteApplications(new DeleteApplicationsRequest()
                        {
                            ApplicationIds    = applications.Select(x => x.Id),
                            DeletingContactId = null
                        });
                    }
                }

                var id = await CreateWithdrawalApplication(contact, organisation,
                                                           standard.LarsCode,
                                                           iFateReferenceNumber,
                                                           standard.Title,
                                                           string.IsNullOrWhiteSpace(versionsToWithdrawal)?StandardOrVersion.Standard : StandardOrVersion.Version,
                                                           versionsToWithdrawal?.Split(","));

                return(RedirectToAction(
                           nameof(ApplicationController.Sequence),
                           nameof(ApplicationController).RemoveController(),
                           new { Id = id, sequenceNo = ApplyConst.STANDARD_WITHDRAWAL_SEQUENCE_NO }));
            }
        }
        public async Task And_Yes_Is_Selected_For_Standard_And_InProgress_Applications_Then_Version_Applications_Are_Deleted()
        {
            var applicationId          = Guid.NewGuid();
            var existingApplicationId1 = Guid.NewGuid();
            var existingApplicationId2 = Guid.NewGuid();

            // Arrange
            _mockApplicationApiClient.Setup(m => m.GetWithdrawalApplications(It.IsAny <Guid>()))
            .ReturnsAsync(new List <ApplicationResponse>()
            {
                new ApplicationResponse()
                {
                    Id = existingApplicationId1,
                    ApplicationStatus = ApplicationStatus.InProgress,
                    ApplicationType   = ApplicationTypes.StandardWithdrawal,
                    StandardReference = "ST0001",
                    ApplyData         = new ApplyData()
                    {
                        Apply = new ApplyTypes.Apply()
                        {
                            StandardReference = "ST0001", Versions = new List <string> {
                                "1.0"
                            }
                        }
                    }
                },
                new ApplicationResponse()
                {
                    Id = existingApplicationId2,
                    ApplicationStatus = ApplicationStatus.InProgress,
                    ApplicationType   = ApplicationTypes.StandardWithdrawal,
                    StandardReference = "ST0001",
                    ApplyData         = new ApplyData()
                    {
                        Apply = new ApplyTypes.Apply()
                        {
                            StandardReference = "ST0001", Versions = new List <string> {
                                "1.1"
                            }
                        }
                    }
                }
            });

            _mockStandardVersionApiClient.Setup(m => m.GetEpaoRegisteredStandardVersions(It.IsAny <string>(), "ST0001"))
            .ReturnsAsync(new List <StandardVersion>()
            {
                new StandardVersion()
                {
                    Version = "1.0"
                },
                new StandardVersion()
                {
                    Version = "1.1"
                },
                new StandardVersion()
                {
                    Version = "1.2"
                }
            });


            _mockApplicationApiClient
            .Setup(r => r.CreateApplication(It.IsAny <CreateApplicationRequest>()))
            .ReturnsAsync(applicationId);

            var model = new CheckWithdrawalRequestViewModel()
            {
                Continue = "yes"
            };

            // Act
            var result = await _sut.CheckWithdrawalRequest("ST0001", null, null, model) as RedirectToActionResult;

            // Assert
            _mockApplicationApiClient.Verify(m => m.DeleteApplications(
                                                 It.Is <DeleteApplicationsRequest>(x => x.ApplicationIds.Any(a => a == existingApplicationId1) &&
                                                                                   x.ApplicationIds.Any(a => a == existingApplicationId2))));
        }