public void Then_Is_Correctly_Built_With_No_Optionals(int pageNumber,
                                                              int pageSize)
        {
            var actual = new GetVacanciesRequest(pageNumber, pageSize);

            actual.GetUrl.Should().Be($"api/Vacancies?pageNumber={pageNumber}&pageSize={pageSize}");
        }
Beispiel #2
0
        public async Task Then_If_No_Results_From_Zero_Page_Size_Then_Response_Returned(
            GetVacanciesQuery query,
            List <string> categories,
            [Frozen] Mock <ICourseService> courseService,
            [Frozen] Mock <IFindApprenticeshipApiClient <FindApprenticeshipApiConfiguration> > apiClient,
            GetVacanciesQueryHandler handler)
        {
            query.Routes   = null;
            query.PageSize = 0;
            courseService.Setup(x => x.MapRoutesToCategories(query.Routes)).Returns(categories);
            query.AccountLegalEntityPublicHashedId = "";
            var expectedGetRequest = new GetVacanciesRequest(query.PageNumber, query.PageSize,
                                                             query.AccountLegalEntityPublicHashedId, query.Ukprn, query.AccountPublicHashedId, query.StandardLarsCode,
                                                             query.NationWideOnly, query.Lat, query.Lon, query.DistanceInMiles, categories, query.PostedInLastNumberOfDays, query.Sort);

            apiClient.Setup(x =>
                            x.Get <GetVacanciesResponse>(It.Is <GetVacanciesRequest>(c =>
                                                                                     c.GetUrl.Equals(expectedGetRequest.GetUrl)))).ReturnsAsync(new GetVacanciesResponse
            {
                Total = 0,
                ApprenticeshipVacancies = new List <GetVacanciesListItem>(),
                TotalFound = 0
            });

            var actual = await handler.Handle(query, CancellationToken.None);

            actual.Vacancies.Should().BeEmpty();
            actual.Total.Should().Be(0);
            actual.TotalFiltered.Should().Be(0);
            actual.TotalPages.Should().Be(0);
        }
Beispiel #3
0
        public async Task Then_The_Api_Is_Called_With_The_Request_And_Vacancies_Returned(
            GetVacanciesQuery query,
            GetVacanciesResponse apiResponse,
            List <string> categories,
            GetStandardsListItem courseResponse,
            [Frozen] Mock <ICourseService> courseService,
            [Frozen] Mock <IFindApprenticeshipApiClient <FindApprenticeshipApiConfiguration> > apiClient,
            GetVacanciesQueryHandler handler)
        {
            courseService.Setup(x => x.MapRoutesToCategories(query.Routes)).Returns(categories);
            query.AccountLegalEntityPublicHashedId = "";
            var expectedGetRequest = new GetVacanciesRequest(query.PageNumber, query.PageSize,
                                                             query.AccountLegalEntityPublicHashedId, query.Ukprn, query.AccountPublicHashedId, query.StandardLarsCode,
                                                             query.NationWideOnly, query.Lat, query.Lon, query.DistanceInMiles, categories, query.PostedInLastNumberOfDays, query.Sort);

            apiClient.Setup(x =>
                            x.Get <GetVacanciesResponse>(It.Is <GetVacanciesRequest>(c =>
                                                                                     c.GetUrl.Equals(expectedGetRequest.GetUrl)))).ReturnsAsync(apiResponse);
            courseService.Setup(x => x.GetActiveStandards <GetStandardsListResponse>(nameof(GetStandardsListResponse))).ReturnsAsync(new GetStandardsListResponse
            {
                Standards = new List <GetStandardsListItem> {
                    courseResponse
                }
            });

            var actual = await handler.Handle(query, CancellationToken.None);

            actual.Vacancies.Should().BeEquivalentTo(apiResponse.ApprenticeshipVacancies);
            actual.Total.Should().Be(apiResponse.Total);
            actual.TotalFiltered.Should().Be(apiResponse.TotalFound);
            actual.TotalPages.Should().Be((int)Math.Ceiling((decimal)apiResponse.TotalFound / query.PageSize));
        }
Beispiel #4
0
        public async Task And_The_AccountIdentifier_Is_External_Then_HashedIds_Are_Not_Set(
            Guid externalId,
            GetVacanciesQuery query,
            GetVacanciesResponse apiResponse,
            GetProviderAccountLegalEntitiesResponse providerAccountLegalEntitiesResponse,
            GetStandardsListResponse courses,
            [Frozen] Mock <ICourseService> courseService,
            [Frozen] Mock <IAccountLegalEntityPermissionService> accountLegalEntityPermissionService,
            [Frozen] Mock <IFindApprenticeshipApiClient <FindApprenticeshipApiConfiguration> > apiClient,
            GetVacanciesQueryHandler handler)
        {
            query.Routes = new List <string>();
            query.AccountPublicHashedId = "";
            query.AccountIdentifier     = new AccountIdentifier($"External-{externalId}-Product");
            var expectedGetRequest = new GetVacanciesRequest(query.PageNumber, query.PageSize,
                                                             "", query.Ukprn, query.AccountPublicHashedId, query.StandardLarsCode,
                                                             query.NationWideOnly, query.Lat, query.Lon, query.DistanceInMiles, new List <string>(), query.PostedInLastNumberOfDays, query.Sort);

            courseService.Setup(x => x.MapRoutesToCategories(query.Routes)).Returns(new List <string>());
            apiClient.Setup(x =>
                            x.Get <GetVacanciesResponse>(It.Is <GetVacanciesRequest>(c =>
                                                                                     c.GetUrl.Equals(expectedGetRequest.GetUrl)))).ReturnsAsync(apiResponse);
            courseService.Setup(x => x.GetActiveStandards <GetStandardsListResponse>(nameof(GetStandardsListResponse))).ReturnsAsync(courses);

            var actual = await handler.Handle(query, CancellationToken.None);

            actual.Vacancies.Should().BeEquivalentTo(apiResponse.ApprenticeshipVacancies);
            accountLegalEntityPermissionService
            .Verify(x => x.GetAccountLegalEntity(It.IsAny <AccountIdentifier>(),
                                                 query.AccountLegalEntityPublicHashedId), Times.Never);
        }
Beispiel #5
0
        public async Task And_The_AccountLegalEntityPublicHashedId_And_Ukprn_Is_Not_Null_And_AccountPublicHashedId_Is_Null_Then_Permission_Checked(
            GetVacanciesQuery query,
            GetVacanciesResponse apiResponse,
            AccountLegalEntityItem accountLegalEntityItem,
            GetStandardsListResponse courses,
            [Frozen] Mock <ICourseService> courseService,
            [Frozen] Mock <IAccountLegalEntityPermissionService> accountLegalEntityPermissionService,
            [Frozen] Mock <IFindApprenticeshipApiClient <FindApprenticeshipApiConfiguration> > apiClient,
            GetVacanciesQueryHandler handler)
        {
            query.Routes            = null;
            query.AccountIdentifier = new AccountIdentifier("Employer-ABC123-Product");
            var expectedGetRequest = new GetVacanciesRequest(query.PageNumber, query.PageSize,
                                                             query.AccountLegalEntityPublicHashedId, query.Ukprn, query.AccountPublicHashedId, query.StandardLarsCode,
                                                             query.NationWideOnly, query.Lat, query.Lon, query.DistanceInMiles, new List <string>(), query.PostedInLastNumberOfDays, query.Sort);

            courseService.Setup(x => x.MapRoutesToCategories(query.Routes)).Returns(new List <string>());
            apiClient.Setup(x =>
                            x.Get <GetVacanciesResponse>(It.Is <GetVacanciesRequest>(c =>
                                                                                     c.GetUrl.Equals(expectedGetRequest.GetUrl)))).ReturnsAsync(apiResponse);
            accountLegalEntityPermissionService
            .Setup(x => x.GetAccountLegalEntity(It.Is <AccountIdentifier>(c => c.Equals(query.AccountIdentifier)),
                                                query.AccountLegalEntityPublicHashedId)).ReturnsAsync(accountLegalEntityItem);
            courseService.Setup(x => x.GetActiveStandards <GetStandardsListResponse>(nameof(GetStandardsListResponse))).ReturnsAsync(courses);

            var actual = await handler.Handle(query, CancellationToken.None);

            actual.Vacancies.Should().BeEquivalentTo(apiResponse.ApprenticeshipVacancies);
        }
Beispiel #6
0
        public async Task And_The_AccountLegalEntityPublicHashedId_Is_Null_Then_No_LegalEntity_Check_Is_Performed(
            GetVacanciesQuery query,
            GetVacanciesResponse apiResponse,
            GetStandardsListResponse courses,
            [Frozen] Mock <ICourseService> courseService,
            [Frozen] Mock <IAccountsApiClient <AccountsConfiguration> > accountsApi,
            [Frozen] Mock <IProviderRelationshipsApiClient <ProviderRelationshipsApiConfiguration> > providerRelationshipsApiClient,
            [Frozen] Mock <IFindApprenticeshipApiClient <FindApprenticeshipApiConfiguration> > apiClient,
            GetVacanciesQueryHandler handler)
        {
            query.Routes = null;
            query.AccountLegalEntityPublicHashedId = "";
            var expectedGetRequest = new GetVacanciesRequest(query.PageNumber, query.PageSize,
                                                             query.AccountLegalEntityPublicHashedId, query.Ukprn, query.AccountPublicHashedId, query.StandardLarsCode,
                                                             query.NationWideOnly, query.Lat, query.Lon, query.DistanceInMiles, new List <string>(), query.PostedInLastNumberOfDays, query.Sort);

            courseService.Setup(x => x.MapRoutesToCategories(query.Routes)).Returns(new List <string>());
            apiClient.Setup(x =>
                            x.Get <GetVacanciesResponse>(It.Is <GetVacanciesRequest>(c =>
                                                                                     c.GetUrl.Equals(expectedGetRequest.GetUrl)))).ReturnsAsync(apiResponse);
            courseService.Setup(x => x.GetActiveStandards <GetStandardsListResponse>(nameof(GetStandardsListResponse))).ReturnsAsync(courses);

            await handler.Handle(query, CancellationToken.None);

            accountsApi.Verify(x => x.Get <AccountDetail>(It.IsAny <GetAllEmployerAccountLegalEntitiesRequest>()), Times.Never);
            providerRelationshipsApiClient.Verify(x => x.Get <GetProviderAccountLegalEntitiesResponse>(It.IsAny <GetProviderAccountLegalEntitiesRequest>()), Times.Never);
        }
Beispiel #7
0
        public async Task <GetAdvertsQueryResult> Handle(GetAdvertsQuery request, CancellationToken cancellationToken)
        {
            var routesTask    = _courseService.GetRoutes();
            var standardsTask =
                _courseService.GetActiveStandards <GetStandardsListResponse>(nameof(GetStandardsListResponse));
            var locationTask = _locationLookupService.GetLocationInformation(request.Postcode, 0, 0);

            await Task.WhenAll(routesTask, locationTask, standardsTask);

            if (locationTask.Result == null)
            {
                return(new GetAdvertsQueryResult
                {
                    Routes = routesTask.Result.Routes,
                    Vacancies = new List <GetVacanciesListItem>()
                });
            }


            var standardLarsCode = standardsTask.Result.Standards.Where(c => c.Route.Equals(request.Route, StringComparison.CurrentCultureIgnoreCase)).Select(c => c.LarsCode).ToList();

            var apprenticeshipVacancies = new List <GetVacanciesListItem>();

            var skip = 0;
            var take = 15;

            while (true)
            {
                var standards = standardLarsCode.Skip(skip).Take(take).ToList();

                if (standards.Count == 0)
                {
                    break;
                }

                var advertRequest = new GetVacanciesRequest(0, 20, null, null, null,
                                                            standards, null,
                                                            locationTask.Result.GeoPoint.FirstOrDefault(), locationTask.Result.GeoPoint.LastOrDefault(),
                                                            request.Distance, null, null, "DistanceAsc");

                var adverts = await _findApprenticeshipApiClient.Get <GetVacanciesResponse>(advertRequest);

                apprenticeshipVacancies.AddRange(adverts.ApprenticeshipVacancies.ToList());
                skip += take;
            }

            foreach (var advert in apprenticeshipVacancies)
            {
                advert.VacancyUrl = $"{_configuration.FindAnApprenticeshipBaseUrl}/apprenticeship/reference/{advert.VacancyReference}";
            }

            return(new GetAdvertsQueryResult
            {
                Location = locationTask.Result,
                Routes = routesTask.Result.Routes,
                TotalFound = apprenticeshipVacancies.Count,
                Vacancies = apprenticeshipVacancies.OrderBy(c => c.Distance).Take(20)
            });
        }
Beispiel #8
0
        public async Task Then_The_Route_And_CourseTitle_Are_Taken_From_Standards_Service_And_Ignored_For_Null(
            int standardLarsCode,
            string findAnApprenticeshipBaseUrl,
            GetVacanciesQuery query,
            GetVacanciesResponse apiResponse,
            GetStandardsListItem courseResponse,
            [Frozen] Mock <IFindApprenticeshipApiClient <FindApprenticeshipApiConfiguration> > apiClient,
            [Frozen] Mock <ICourseService> courseService,
            [Frozen] Mock <IOptions <VacanciesConfiguration> > vacanciesConfiguration,
            GetVacanciesQueryHandler handler)
        {
            vacanciesConfiguration.Object.Value.FindAnApprenticeshipBaseUrl = findAnApprenticeshipBaseUrl;
            courseResponse.LarsCode = standardLarsCode;
            foreach (var vacanciesItem in apiResponse.ApprenticeshipVacancies)
            {
                vacanciesItem.StandardLarsCode = standardLarsCode;
            }
            apiResponse.ApprenticeshipVacancies.First().StandardLarsCode = null;
            query.AccountLegalEntityPublicHashedId = "";
            var expectedGetRequest = new GetVacanciesRequest(query.PageNumber, query.PageSize,
                                                             query.AccountLegalEntityPublicHashedId, query.Ukprn, query.AccountPublicHashedId, query.StandardLarsCode,
                                                             query.NationWideOnly, query.Lat, query.Lon, query.DistanceInMiles, new List <string>(), query.PostedInLastNumberOfDays, query.Sort);

            apiClient.Setup(x =>
                            x.Get <GetVacanciesResponse>(It.Is <GetVacanciesRequest>(c =>
                                                                                     c.GetUrl.Equals(expectedGetRequest.GetUrl)))).ReturnsAsync(apiResponse);
            courseService.Setup(x => x.GetActiveStandards <GetStandardsListResponse>(nameof(GetStandardsListResponse))).ReturnsAsync(new GetStandardsListResponse
            {
                Standards = new List <GetStandardsListItem> {
                    courseResponse
                }
            });
            courseService.Setup(x => x.MapRoutesToCategories(query.Routes)).Returns(new List <string>());

            var actual = await handler.Handle(query, CancellationToken.None);

            actual.Vacancies.ToList().TrueForAll(c =>
                                                 c.CourseTitle.Equals(courseResponse.Title) &&
                                                 c.Route.Equals(courseResponse.Route) &&
                                                 c.CourseLevel.Equals(courseResponse.Level)
                                                 ).Should().BeTrue();

            foreach (var vacancy in actual.Vacancies)
            {
                vacancy.VacancyUrl.Should().Be($"{findAnApprenticeshipBaseUrl}/apprenticeship/reference/{vacancy.VacancyReference}");
            }
        }
Beispiel #9
0
        public async Task Then_The_Routes_Are_Filtered_And_Postcode_Searched_And_Adverts_Returned(
            string findAnApprenticeshipBaseUrl,
            GetAdvertsQuery query,
            List <string> categories,
            LocationItem locationItem,
            GetVacanciesResponse vacanciesResponse,
            GetRoutesListResponse getRoutesListResponse,
            GetStandardsListResponse standards,
            [Frozen] Mock <IOptions <CampaignConfiguration> > configuration,
            [Frozen] Mock <ICourseService> courseService,
            [Frozen] Mock <ILocationLookupService> locationLookupService,
            [Frozen] Mock <IFindApprenticeshipApiClient <FindApprenticeshipApiConfiguration> > faaApiClient,
            GetAdvertsQueryHandler handler)
        {
            //Arrange
            query.Route = standards.Standards.First().Route.ToLower();
            configuration.Object.Value.FindAnApprenticeshipBaseUrl = findAnApprenticeshipBaseUrl;
            var expectedAdvertUrl = new GetVacanciesRequest(0, 20, null, null, null, new List <int> {
                standards.Standards.First().LarsCode
            }, null,
                                                            locationItem.GeoPoint.First(), locationItem.GeoPoint.Last(), query.Distance, null, null, "DistanceAsc");

            locationLookupService.Setup(x => x.GetLocationInformation(query.Postcode, 0, 0, false))
            .ReturnsAsync(locationItem);
            faaApiClient
            .Setup(x => x.Get <GetVacanciesResponse>(It.Is <GetVacanciesRequest>(c =>
                                                                                 c.GetUrl.Equals(expectedAdvertUrl.GetUrl)))).ReturnsAsync(vacanciesResponse);
            courseService.Setup(x => x.GetRoutes()).ReturnsAsync(getRoutesListResponse);
            courseService.Setup(x => x.GetActiveStandards <GetStandardsListResponse>(nameof(GetStandardsListResponse))).ReturnsAsync(standards);

            var actual = await handler.Handle(query, CancellationToken.None);

            actual.Vacancies.Should().BeEquivalentTo(vacanciesResponse.ApprenticeshipVacancies);
            actual.TotalFound.Should().Be(vacanciesResponse.ApprenticeshipVacancies.Count());
            actual.Routes.Should().BeEquivalentTo(getRoutesListResponse.Routes);
            actual.Location.Should().BeEquivalentTo(locationItem);

            foreach (var vacancy in actual.Vacancies)
            {
                vacancy.VacancyUrl.Should().Be($"{findAnApprenticeshipBaseUrl}/apprenticeship/reference/{vacancy.VacancyReference}");
            }
        }
        public void Then_The_Request_Is_Correctly_Built(
            int pageNumber,
            int pageSize,
            string accountPublicHashedId,
            string accountLegalEntityPublicHashedId,
            int?ukprn,
            List <int> standardLarsCode,
            bool?nationwideOnly,
            double?lat,
            double?lon,
            uint?distanceInMiles,
            List <string> routes,
            uint?postedInLastNumberOfDays,
            string sort)
        {
            accountLegalEntityPublicHashedId = $"{accountLegalEntityPublicHashedId} %£$^ {accountLegalEntityPublicHashedId}";

            var actual = new GetVacanciesRequest(pageNumber, pageSize, accountLegalEntityPublicHashedId, ukprn, accountPublicHashedId, standardLarsCode, nationwideOnly, lat, lon, distanceInMiles, routes, postedInLastNumberOfDays, sort);

            actual.GetUrl.Should().Be($"api/Vacancies?pageNumber={pageNumber}&pageSize={pageSize}&ukprn={ukprn}&accountLegalEntityPublicHashedId={HttpUtility.UrlEncode(accountLegalEntityPublicHashedId)}&accountPublicHashedId={accountPublicHashedId}&standardLarsCode={string.Join("&standardLarsCode=",standardLarsCode)}&nationwideOnly={nationwideOnly}&lat={lat}&lon={lon}&distanceInMiles={distanceInMiles}&categories={string.Join("&categories=",routes)}&sort={sort}&postedInLastNumberOfDays={postedInLastNumberOfDays}");
        }