[InlineData("88888")] // will match multiple providers
        public async Task PostSelectTrainingProviderAsync_TrainingProviderSearch_WhenNoSingleProviderFoundShouldNotReturnFoundProvider(string trainingProviderSearch)
        {
            var fixture = new TrainingProviderOrchestratorTestsFixture();

            fixture
            .WithVacacny(
                new Vacancy
            {
                Id = fixture.VacancyId,
                EmployerAccountId = TrainingProviderOrchestratorTestsFixture.EmployerAccountId,
                TrainingProvider  = new TrainingProvider(),
                Title             = "specified for route validation",
                ProgrammeId       = "specified for route validation"
            })
            .Setup();

            var selectTrainingProviderEditModel = new SelectTrainingProviderEditModel
            {
                EmployerAccountId      = TrainingProviderOrchestratorTestsFixture.EmployerAccountId,
                VacancyId              = fixture.Vacancy.Id,
                SelectionType          = TrainingProviderSelectionType.TrainingProviderSearch,
                TrainingProviderSearch = trainingProviderSearch
            };

            var result = await fixture.PostSelectTrainingProviderAsync(selectTrainingProviderEditModel);

            fixture.VerifyNotFoundTrainingProviderUkprn(result);
        }
        public async Task PostSelectTrainingProviderAsync_UKPRN_WhenSingleProviderFoundShouldReturnFoundProvider()
        {
            var fixture = new TrainingProviderOrchestratorTestsFixture();

            fixture
            .WithVacacny(
                new Vacancy
            {
                Id = fixture.VacancyId,
                EmployerAccountId = TrainingProviderOrchestratorTestsFixture.EmployerAccountId,
                TrainingProvider  = new TrainingProvider(),
                Title             = "specified for route validation",
                ProgrammeId       = "specified for route validation"
            })
            .Setup();

            var selectTrainingProviderEditModel = new SelectTrainingProviderEditModel
            {
                EmployerAccountId = TrainingProviderOrchestratorTestsFixture.EmployerAccountId,
                VacancyId         = fixture.Vacancy.Id,
                SelectionType     = TrainingProviderSelectionType.Ukprn,
                Ukprn             = fixture.TrainingProviderOne.Ukprn.ToString()
            };

            var result = await fixture.PostSelectTrainingProviderAsync(selectTrainingProviderEditModel);

            fixture.VerifyFoundTrainingProviderUkprn(result, fixture.TrainingProviderOne.Ukprn.Value);
        }
        public async Task <IActionResult> ConfirmTrainingProvider(ConfirmTrainingProviderEditModel m)
        {
            if (!ModelState.IsValid)
            {
                return(View(m));
            }

            var providerExists = await _orchestrator.ConfirmProviderExists(long.Parse(m.Ukprn));

            if (providerExists == false)
            {
                var vm = new SelectTrainingProviderEditModel {
                    VacancyId = m.VacancyId, Ukprn = m.Ukprn
                };
                return(await ProviderNotFound(vm));
            }

            var response = await _orchestrator.PostConfirmEditModelAsync(m, User.ToVacancyUser());

            if (!response.Success)
            {
                response.AddErrorsToModelState(ModelState);
            }

            if (!ModelState.IsValid)
            {
                var vm = await _orchestrator.GetSelectTrainingProviderViewModel(m);

                return(View(ViewNames.SelectTrainingProvider, vm));
            }

            return(RedirectToRoute(RouteNames.Vacancy_Preview_Get));
        }
        public async Task PostSelectTrainingProviderAsync_TrainingProviderSearch_WhenSingleProviderFoundShouldReturnFoundProvider()
        {
            var vacancy = new Vacancy
            {
                Id = VacancyId,
                EmployerAccountId = EmployerAccountId,
                TrainingProvider  = new TrainingProvider(),
                Title             = "specified for route validation",
                ProgrammeId       = "specified for route validation"
            };

            var orch = GetTrainingProviderOrchestrator(vacancy);

            var m = new SelectTrainingProviderEditModel
            {
                IsTrainingProviderSelected = true,
                SelectionType          = TrainingProviderSelectionType.TrainingProviderSearch,
                TrainingProviderSearch = "MR EGG 88888888",
                EmployerAccountId      = EmployerAccountId,
                VacancyId = VacancyId
            };

            var result = await orch.PostSelectTrainingProviderAsync(m, new VacancyUser());

            result.Data.FoundTrainingProviderUkprn.Should().Be(88888888);
        }
        public async Task <ConfirmTrainingProviderViewModel> GetConfirmViewModel(SelectTrainingProviderEditModel m)
        {
            var vacancy = await Utility.GetAuthorisedVacancyForEditAsync(_client, _vacancyClient, m, RouteNames.TrainingProvider_Confirm_Get);

            if (long.TryParse(m.Ukprn, out var ukprn) && ukprn != vacancy.TrainingProvider?.Ukprn)
            {
                var provider = await _client.GetTrainingProviderAsync(ukprn);

                return(new ConfirmTrainingProviderViewModel
                {
                    EmployerAccountId = m.EmployerAccountId,
                    VacancyId = m.VacancyId,
                    Title = vacancy.Title,
                    Ukprn = provider.Ukprn.Value,
                    ProviderName = provider.Name,
                    ProviderAddress = provider.Address.GetInlineAddress()
                });
            }

            return(new ConfirmTrainingProviderViewModel
            {
                EmployerAccountId = m.EmployerAccountId,
                VacancyId = m.VacancyId,
                Title = vacancy.Title,
                Ukprn = vacancy.TrainingProvider.Ukprn.Value,
                ProviderName = vacancy.TrainingProvider.Name,
                ProviderAddress = vacancy.TrainingProvider.Address.GetInlineAddress()
            });
        }
        private async Task <IActionResult> ProviderNotFound(SelectTrainingProviderEditModel m)
        {
            ModelState.AddModelError(string.Empty, string.Format(InvalidUkprnMessageFormat, m.Ukprn));
            var vm = await _orchestrator.GetSelectTrainingProviderViewModel(m);

            return(View(ViewNames.SelectTrainingProvider, vm));
        }
        public async Task <IActionResult> SelectTrainingProvider(SelectTrainingProviderEditModel m)
        {
            if (!ModelState.IsValid)
            {
                var vm = await _orchestrator.GetSelectTrainingProviderViewModel(m);

                return(View(vm));
            }

            if (long.TryParse(m.Ukprn, out var ukprnAsLong) == false)
            {
                return(await ProviderNotFound(m));
            }

            var providerExists = await _orchestrator.ConfirmProviderExists(ukprnAsLong);

            if (providerExists == false)
            {
                return(await ProviderNotFound(m));
            }

            var confirmDetailsVm = await _orchestrator.GetConfirmViewModel(m);

            TempData.Add(TrainingProviderJourneyTempDataKey, 1);
            return(RedirectToRoute(RouteNames.TrainingProvider_Confirm_Get, confirmDetailsVm));
        }
        public async Task PostSelectTrainingProviderAsync_WhenNotChoosingThenRemoveExistingTrainingProvider()
        {
            var vacancy = new Vacancy
            {
                Id = VacancyId,
                EmployerAccountId = EmployerAccountId,
                TrainingProvider  = new TrainingProvider(),
                Title             = "specified for route validation",
                ProgrammeId       = "specified for route validation"
            };

            var orch = GetTrainingProviderOrchestrator(vacancy);

            var m = new SelectTrainingProviderEditModel
            {
                IsTrainingProviderSelected = false,
                EmployerAccountId          = EmployerAccountId,
                VacancyId = VacancyId
            };

            var result = await orch.PostSelectTrainingProviderAsync(m, new VacancyUser());

            vacancy.TrainingProvider.Should().BeNull();
            result.Data.FoundTrainingProviderUkprn.Should().BeNull();
        }
示例#9
0
        public void ShouldBeValidIfTrainingProviderSearchSpecified()
        {
            var vm = new SelectTrainingProviderEditModel {
                TrainingProviderSearch = "something specified",
                SelectionType          = TrainingProviderSelectionType.TrainingProviderSearch
            };

            var validator = new SelectTrainingProviderEditModelValidator();

            var result = validator.Validate(vm);

            result.IsValid.Should().BeTrue();
        }
示例#10
0
        public void ShouldBeValidIfUkprnSpecified()
        {
            var vm = new SelectTrainingProviderEditModel {
                Ukprn         = "12345678",
                SelectionType = TrainingProviderSelectionType.Ukprn
            };

            var validator = new SelectTrainingProviderEditModelValidator();

            var result = validator.Validate(vm);

            result.IsValid.Should().BeTrue();
        }
示例#11
0
        private async Task <TrainingProviderSummary> GetProviderFromModelAsync(SelectTrainingProviderEditModel model)
        {
            if (model.SelectionType == TrainingProviderSelectionType.TrainingProviderSearch)
            {
                var allProviders = await _vacancyClient.GetAllTrainingProvidersAsync();

                var matches = allProviders.Where(p =>
                                                 FormatSuggestion(p.ProviderName, p.Ukprn).Contains(model.TrainingProviderSearch))
                              .ToList();

                return(matches.Count() == 1 ? matches.First() : null);
            }

            return(await GetProviderAsync(model.Ukprn));
        }
示例#12
0
        public void ShouldErrorIfUkprnIsNotSpecified(string inputUkprn)
        {
            var vm = new SelectTrainingProviderEditModel {
                Ukprn         = inputUkprn,
                SelectionType = TrainingProviderSelectionType.Ukprn
            };

            var validator = new SelectTrainingProviderEditModelValidator();

            var result = validator.Validate(vm);

            result.IsValid.Should().BeFalse();
            result.Errors.Count.Should().Be(1);
            result.Errors[0].PropertyName.Should().Be(nameof(SelectTrainingProviderEditModel.Ukprn));
            result.Errors[0].ErrorMessage.Should().Be("You must provide a UKPRN");
        }
示例#13
0
        public void ShouldErrorIfUkprnIsNotSpecified(string inputUkprn)
        {
            var vm = new SelectTrainingProviderEditModel
            {
                Ukprn = inputUkprn
            };

            var context = new ValidationContext(vm, null, null);
            var result  = new List <ValidationResult>();

            var isValid = Validator.TryValidateObject(vm, context, result, true);

            isValid.Should().BeFalse();
            result.Should().HaveCount(1);
            result.Single(r => r.MemberNames.Single() == "Ukprn").ErrorMessage.Should().Be("The UKPRN field is required.");
        }
示例#14
0
        public void ShouldErrorIfTrainingProviderSearchIsNotSpecified(string inputUkprn)
        {
            var vm = new SelectTrainingProviderEditModel {
                TrainingProviderSearch = inputUkprn,
                SelectionType          = TrainingProviderSelectionType.TrainingProviderSearch
            };

            var validator = new SelectTrainingProviderEditModelValidator();

            var result = validator.Validate(vm);

            result.IsValid.Should().BeFalse();
            result.Errors.Count.Should().Be(1);
            result.Errors[0].PropertyName.Should().Be(nameof(SelectTrainingProviderEditModel.TrainingProviderSearch));
            result.Errors[0].ErrorMessage.Should().Be("You must enter a training provider or UKPRN to continue");
        }
示例#15
0
        public void ShouldErrorIfUkprnIsInvalid()
        {
            var vm = new SelectTrainingProviderEditModel {
                Ukprn         = "invalid ukprn",
                SelectionType = TrainingProviderSelectionType.Ukprn
            };

            var validator = new SelectTrainingProviderEditModelValidator();

            var result = validator.Validate(vm);

            result.IsValid.Should().BeFalse();
            result.Errors.Count.Should().Be(1);
            result.Errors[0].PropertyName.Should().Be(nameof(SelectTrainingProviderEditModel.Ukprn));
            result.Errors[0].ErrorMessage.Should().Be("UKPRN is not recognised");
        }
        public void ShouldErrorIfSelectTrainingProviderNotSpecified()
        {
            var vm = new SelectTrainingProviderEditModel
            {
                IsTrainingProviderSelected = null,
            };

            var validator = new SelectTrainingProviderEditModelValidator();

            var result = validator.Validate(vm);

            result.IsValid.Should().BeFalse();
            result.Errors.Count.Should().Be(1);
            result.Errors[0].PropertyName.Should().Be(nameof(SelectTrainingProviderEditModel.IsTrainingProviderSelected));
            result.Errors[0].ErrorMessage.Should().Be("Select yes if you’ve found a training provider");
        }
示例#17
0
        public void ShouldErrorIfSelectTrainingProviderNotSpecified()
        {
            var vm = new SelectTrainingProviderEditModel
            {
                IsTrainingProviderSelected = null,
            };

            var validator = new SelectTrainingProviderEditModelValidator();

            var result = validator.Validate(vm);

            result.IsValid.Should().BeFalse();
            result.Errors.Count.Should().Be(1);
            result.Errors[0].PropertyName.Should().Be(nameof(SelectTrainingProviderEditModel.IsTrainingProviderSelected));
            result.Errors[0].ErrorMessage.Should().Be("Please select an option to continue");
        }
示例#18
0
        private async Task <TrainingProviderSummary> GetProviderFromModelAsync(SelectTrainingProviderEditModel model)
        {
            if (model.SelectionType == TrainingProviderSelectionType.TrainingProviderSearch)
            {
                if (model.TrainingProviderSearch.EndsWith(EsfaTestTrainingProvider.Ukprn.ToString()))
                {
                    return(await GetProviderAsync(EsfaTestTrainingProvider.Ukprn.ToString()));
                }

                var allProviders = await _trainingProviderSummaryProvider.FindAllAsync();

                var matches = allProviders.Where(p =>
                                                 FormatSuggestion(p.ProviderName, p.Ukprn).Contains(model.TrainingProviderSearch))
                              .ToList();

                return(matches.Count() == 1 ? matches.First() : null);
            }

            return(await GetProviderAsync(model.Ukprn));
        }
        public async Task <IActionResult> SelectTrainingProvider(SelectTrainingProviderEditModel m, [FromQuery] bool wizard)
        {
            if (ModelState.IsValid)
            {
                var response = await _orchestrator.PostSelectTrainingProviderAsync(m, User.ToVacancyUser());

                if (response.Success)
                {
                    return(response.Data.FoundTrainingProviderUkprn.HasValue
                        ? RedirectToRoute(RouteNames.TrainingProvider_Confirm_Get, new { ukprn = response.Data.FoundTrainingProviderUkprn.Value, wizard })
                        : GetRedirectToNextPage(wizard));
                }

                AddTrainingProviderErrorsToModelState(m.SelectionType, m.Ukprn, response, ModelState);
            }

            var vm = await _orchestrator.GetSelectTrainingProviderViewModelAsync(m);

            vm.PageInfo.SetWizard(wizard);
            return(View(vm));
        }
示例#20
0
        public async Task <OrchestratorResponse <PostSelectTrainingProviderResult> > PostSelectTrainingProviderAsync(SelectTrainingProviderEditModel m, VacancyUser user)
        {
            var vacancy = await Utility.GetAuthorisedVacancyForEditAsync(_client, _vacancyClient, m, RouteNames.TrainingProvider_Select_Post);

            if (m.IsTrainingProviderSelected == false)
            {
                if (vacancy.TrainingProvider != null)
                {
                    vacancy.TrainingProvider = null;
                    await _vacancyClient.UpdateDraftVacancyAsync(vacancy, user);
                }

                return(new OrchestratorResponse <PostSelectTrainingProviderResult>(new PostSelectTrainingProviderResult()));
            }

            var providerSummary = await GetProviderFromModelAsync(m);

            TrainingProvider provider = null;

            if (providerSummary != null)
            {
                provider = await _trainingProviderService.GetProviderAsync(providerSummary.Ukprn);
            }

            vacancy.TrainingProvider = provider;

            return(await ValidateAndExecute(
                       vacancy,
                       v => _vacancyClient.Validate(v, ValidationRules),
                       v => Task.FromResult(new PostSelectTrainingProviderResult
            {
                FoundTrainingProviderUkprn = v.TrainingProvider?.Ukprn
            })
                       ));
        }
示例#21
0
        public async Task <SelectTrainingProviderViewModel> GetSelectTrainingProviderViewModelAsync(SelectTrainingProviderEditModel m)
        {
            var vm = await GetSelectTrainingProviderViewModelAsync((VacancyRouteModel)m);

            vm.Ukprn = m.Ukprn;
            vm.TrainingProviderSearch = m.TrainingProviderSearch;
            return(vm);
        }
 public async Task <OrchestratorResponse <PostSelectTrainingProviderResult> > PostSelectTrainingProviderAsync(SelectTrainingProviderEditModel model)
 {
     return(await Sut.PostSelectTrainingProviderAsync(model, User));
 }