public async Task GetResultsListReturnsSuccessForHappyPath()
        {
            // Arrange
            const string requestUrl        = "http://Something.com/";
            const string searchTerm        = "nurse";
            const int    page              = 1;
            const int    pageSize          = 10;
            const int    expectedItemCount = 2;
            var          searchResults     = new SearchResult <JobProfileIndex>()
            {
                Results = A.CollectionOfFake <SearchResultItem <JobProfileIndex> >(expectedItemCount),
                Count   = expectedItemCount,
            };
            var expectedResult = A.Fake <SearchApiModel>();

            expectedResult.Count   = expectedItemCount;
            expectedResult.Results = A.CollectionOfFake <SearchItemApiModel>(expectedItemCount);
            var summaryService = new SearchService(mapper, searchQueryService);

            A.CallTo(() => searchQueryService.SearchAsync(A <string> .Ignored, A <SearchProperties> .Ignored)).Returns(searchResults);
            A.CallTo(() => mapper.Map <SearchApiModel>(searchResults)).Returns(expectedResult);

            // Act
            var results = await summaryService.GetResultsList(requestUrl, searchTerm, page, pageSize).ConfigureAwait(false);

            // Assert
            A.CallTo(() => searchQueryService.SearchAsync(A <string> .Ignored, A <SearchProperties> .Ignored)).MustHaveHappenedOnceExactly();
            A.CallTo(() => mapper.Map <SearchApiModel>(searchResults)).MustHaveHappenedOnceExactly();
            Assert.Equal(expectedResult.Count, results.Count);
        }
Beispiel #2
0
        private void SetUpDependeciesAndCall(bool validJobProfile, bool isContentPreviewMode)
        {
            ////Set up comman call
            mapperCfg = new MapperConfiguration(cfg => { cfg.AddProfile <JobProfilesAutoMapperProfile>(); });

            dummyJobProfile = validJobProfile
                ? new JobProfile
            {
                AlternativeTitle      = nameof(JobProfile.AlternativeTitle),
                SalaryRange           = nameof(JobProfile.SalaryRange),
                Overview              = nameof(JobProfile.Overview),
                Title                 = nameof(JobProfile.Title),
                MaximumHours          = 40,
                MinimumHours          = 10,
                UrlName               = nameof(JobProfile.UrlName),
                WorkingHoursDetails   = nameof(JobProfile.WorkingHoursDetails),
                WorkingPattern        = nameof(JobProfile.WorkingPattern),
                WorkingPatternDetails = nameof(JobProfile.WorkingPatternDetails)
            }
                : null;

            var dummyIndex = new JobProfileIndex
            {
                Title                       = nameof(JobProfileIndex.Title),
                AlternativeTitle            = new[] { "alt" },
                SalaryStarter               = starterSalary,
                SalaryExperienced           = experiencedSalary,
                Overview                    = "overview",
                UrlName                     = "dummy-url",
                JobProfileCategoriesWithUrl = new[] { "CatOneURL|Cat One", "CatTwoURL|Cat Two" }
            };
            var resultsCount      = 1;
            var dummySearchResult = A.Dummy <SearchResult <JobProfileIndex> >();

            dummySearchResult.Count   = resultsCount;
            dummySearchResult.Results = A.CollectionOfDummy <SearchResultItem <JobProfileIndex> >(resultsCount);
            var rawResultItems = new List <SearchResultItem <JobProfileIndex> >
            {
                new SearchResultItem <JobProfileIndex> {
                    ResultItem = dummyIndex
                }
            };

            dummySearchResult.Results = rawResultItems;

            // Set up calls
            A.CallTo(() => searchQueryService.SearchAsync(A <string> ._, A <SearchProperties> ._)).Returns(dummySearchResult);
            A.CallTo(() => repositoryFake.GetByUrlName(A <string> ._)).Returns(dummyJobProfile);
            A.CallTo(() => repositoryFake.GetByUrlNameForPreview(A <string> ._)).Returns(dummyJobProfile);
            A.CallTo(() => webAppContextFake.IsContentPreviewMode).Returns(isContentPreviewMode);
            A.CallTo(() => sitefinityPage.GetDefaultJobProfileToUse(A <string> ._))
            .ReturnsLazily((string defaultProfile) => defaultProfile);
            A.CallTo(() => govUkNotifyFake.SubmitEmail(A <string> ._, null)).Returns(false);
            A.CallTo(() => webAppContextFake.SetVocCookie(Constants.VocPersonalisationCookieName, A <string> ._)).DoesNothing();
            A.CallTo(() => loggerFake.Trace(A <string> ._)).DoesNothing();
        }
        public void ShowMatchingProfileCountOnPageTest(int pageNumber, bool showMatchingProfileCount, bool expectingToShowCount)
        {
            //Setup the fakes and dummies for test
            SetUpFakesAndCalls();
            SetUpStateMangerFakesAndCalls(PreSearchFilterType.Interest, true);

            var config = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile <JobProfilesAutoMapperProfile>();
            });
            var mapper = config.CreateMapper();

            var searchResults = new SearchResult <JobProfileIndex>()
            {
                Count = 5
            };

            A.CallTo(() => fakeBuildSearchFilterService.BuildPreSearchFilters(A <PreSearchFiltersResultsModel> ._, A <Dictionary <string, PreSearchFilterLogicalOperator> > ._)).Returns(nameof(SearchProperties.FilterBy));
            A.CallTo(() => fakeBuildSearchFilterService.GetIndexFieldDefinitions(A <string> .Ignored)).Returns(new List <KeyValuePair <string, PreSearchFilterLogicalOperator> >());
            A.CallTo(() => fakeSearchQueryService.SearchAsync(A <string> ._, A <SearchProperties> ._)).Returns(searchResults);

            //Instantiate & Act
            var preSearchFiltersController =
                new PreSearchFiltersController(loggerFake, mapper, psfRepositoryFactoryFake, fakePsfStateManager, fakeSearchQueryService, fakeBuildSearchFilterService, fakeAsyncHelper, fakeTaxonomyRepository)
            {
                FilterType = PreSearchFilterType.Interest
            };

            preSearchFiltersController.ThisPageNumber      = pageNumber;
            preSearchFiltersController.UsePageProfileCount = showMatchingProfileCount;

            //Act on the index
            var firstVm          = new PsfModel();
            var resultsViewModel = new PsfSearchResultsViewModel
            {
                PreSearchFiltersModel = GeneratePreSEarchFiltersViewModel(PreSearchFilterType.Interest)
            };

            var postFromResultsPageCall = preSearchFiltersController.WithCallTo(c => c.Index(firstVm, resultsViewModel));

            postFromResultsPageCall.ShouldRenderDefaultView().WithModel <PsfModel>(vm =>
            {
                vm.UsePageProfileCount.Should().Be(expectingToShowCount);
            }).AndNoModelErrors();

            if (expectingToShowCount)
            {
                A.CallTo(() => fakeSearchQueryService.SearchAsync(A <string> ._, A <SearchProperties> ._)).MustHaveHappened();
            }
            else
            {
                A.CallTo(() => fakeSearchQueryService.SearchAsync(A <string> ._, A <SearchProperties> ._)).MustNotHaveHappened();
            }
        }
Beispiel #4
0
        private async Task <ActionResult> DisplaySearchResultsAsync(PsfModel model, int page, bool notPaging = true)
        {
            var resultModel = GetPsfSearchResultsViewModel(model, notPaging);

            var pageNumber       = page > 0 ? page : 1;
            var fieldDefinitions = GetIndexFieldDefinitions();
            var resultsModel     = mapper.Map <PreSearchFiltersResultsModel>(model);
            var properties       = new SearchProperties
            {
                Page     = pageNumber,
                Count    = this.PageSize,
                FilterBy = buildSearchFilterService.BuildPreSearchFilters(resultsModel, fieldDefinitions.ToDictionary(k => k.Key, v => v.Value))
            };
            var results = await searchQueryService.SearchAsync("*", properties);

            resultModel.Count         = results.Count;
            resultModel.PageNumber    = pageNumber;
            resultModel.SearchResults = mapper.Map <IEnumerable <JobProfileSearchResultItemViewModel> >(results.Results);
            foreach (var resultItem in resultModel.SearchResults)
            {
                resultItem.ResultItemUrlName = $"{JobProfileDetailsPage}{resultItem.ResultItemUrlName}";
            }

            SetTotalResultsMessage(resultModel);
            SetupPagination(resultModel);
            return(View("SearchResult", resultModel));
        }
        private async Task <ActionResult> DisplaySearchResultsAsync(string searchTerm, int page)
        {
            var resultModel = new JobProfileSearchResultViewModel
            {
                PlaceholderText = PlaceholderText,
                SearchTerm      = searchTerm,
                AutoCompleteMinimumCharacters       = AutoCompleteMinimumCharacters,
                AutoCompleteMaximumCharacters       = AutoCompleteMaximumCharacters,
                MaximumNumberOfDisplayedSuggestions = MaximumNumberOfDisplayedSuggestions,
                UseFuzzyAutoCompleteMatching        = UseFuzzyAutoCompleteMatching,
                JobProfileCategoryPage = JobProfileCategoryPage,
                SalaryBlankText        = SalaryBlankText,
                ShowSearchedTerm       = ShowComputedSearchTerm
            };

            if (!string.IsNullOrWhiteSpace(searchTerm))
            {
                var pageNumber = page > 0 ? page : 1;
                var searchTask = searchQueryService.SearchAsync(searchTerm, new SearchProperties {
                    Page = pageNumber, Count = this.PageSize, UseRawSearchTerm = UseRawSearchTerm
                });
                var spellCheckTask = spellcheckService.CheckSpellingAsync(searchTerm);

                await Task.WhenAll(searchTask, spellCheckTask);

                var results = searchTask.Result;
                resultModel.Count              = results.Count;
                resultModel.Coverage           = results.Coverage;
                resultModel.ComputedSearchTerm = results.ComputedSearchTerm;
                resultModel.PageNumber         = pageNumber;
                resultModel.SearchResults      = mapper.Map <IEnumerable <JobProfileSearchResultItemViewModel> >(results.Results);
                foreach (var resultItem in resultModel.SearchResults)
                {
                    resultItem.ResultItemUrlName = $"{JobProfileDetailsPage}{resultItem.ResultItemUrlName}";
                }

                SetTotalResultsMessage(resultModel);
                SetupPagination(searchTerm, resultModel);

                var spellCheckResult = spellCheckTask.Result;
                if (spellCheckResult.HasCorrected)
                {
                    resultModel.DidYouMeanUrl  = GetSearchResultsPageUrl(spellCheckResult.CorrectedTerm);
                    resultModel.DidYouMeanTerm = spellCheckResult.CorrectedTerm;
                }
            }

            return(View("SearchResult", resultModel));
        }
Beispiel #6
0
        private async Task <ActionResult> DisplaySearchResultsAsync(PsfModel model, int page, bool notPaging = true)
        {
            var resultModel = GetPsfSearchResultsViewModel(model, notPaging);

            var pageNumber       = page > 0 ? page : 1;
            var fieldDefinitions = GetIndexFieldDefinitions();
            var resultsModel     = mapper.Map <PreSearchFiltersResultsModel>(model);
            var properties       = new SearchProperties
            {
                Page         = pageNumber,
                SearchFields = new List <string>()
                {
                    IndexSearchField
                },
                Count            = this.PageSize,
                UseRawSearchTerm = true,
                FilterBy         = buildSearchFilterService.BuildPreSearchFilters(resultsModel, fieldDefinitions.ToDictionary(k => k.Key, v => v.Value)),
                OrderByFields    = IndexSortField.TrimEnd(',').Split(',').ToList(),
            };

            var searchTerm = buildSearchFilterService.GetSearchTerm(properties, resultsModel, IndexSearchField.Split(','));
            var results    = await searchQueryService.SearchAsync(searchTerm, properties);

            resultModel.Count         = results.Count;
            resultModel.PageNumber    = pageNumber;
            resultModel.SearchResults = mapper.Map <IEnumerable <JobProfileSearchResultItemViewModel> >(results.Results, opts =>
            {
                opts.Items.Add(nameof(CaveatFinderIndexFieldName), CaveatFinderIndexFieldName);
                opts.Items.Add(nameof(CaveatFinderIndexValue), CaveatFinderIndexValue);
            });

            if (ShowMacthingSkillCount)
            {
                SetMatchingSkillsCount(resultModel, resultsModel, results);
            }

            foreach (var resultItem in resultModel.SearchResults)
            {
                resultItem.ResultItemUrlName = $"{JobProfileDetailsPage}{resultItem.ResultItemUrlName}";
            }

            SetTotalResultsMessage(resultModel);
            SetupPagination(resultModel);
            return(View("SearchResult", resultModel));
        }
Beispiel #7
0
        private async Task <JobProfileDetailsViewModel> PopulateSalaryAsync(JobProfileDetailsViewModel model)
        {
            var properties = new SearchProperties
            {
                FilterBy = $"{nameof(JobProfileIndex.UrlName)} eq '{model.UrlName.Replace("'", "''")}'"
            };

            var jobProfileSearchResult = await searchQueryService.SearchAsync(model.Title, properties);

            var jobProfileIndexItem = jobProfileSearchResult.Results.FirstOrDefault()?.ResultItem;

            if (jobProfileIndexItem != null)
            {
                model.SalaryStarter     = jobProfileIndexItem.SalaryStarter;
                model.SalaryExperienced = jobProfileIndexItem.SalaryExperienced;
            }

            return(model);
        }
        private async Task <int> GetNumberOfMatches(PsfModel model)
        {
            var fieldDefinitions = buildSearchFilterService.GetIndexFieldDefinitions(IndexFieldOperators);

            preSearchFilterStateManager.RestoreState(model.OptionsSelected);
            var filterState = preSearchFilterStateManager.GetPreSearchFilterState();

            model.Sections = autoMapper.Map <List <PsfSection> >(filterState.Sections);

            var resultsModel = autoMapper.Map <PreSearchFiltersResultsModel>(model);
            var properties   = new SearchProperties
            {
                Page     = 0,
                Count    = 0,
                FilterBy = buildSearchFilterService.BuildPreSearchFilters(resultsModel, fieldDefinitions.ToDictionary(k => k.Key, v => v.Value))
            };
            var results = await searchQueryService.SearchAsync("*", properties);

            return((int)results.Count);
        }
        public async Task <SearchApiModel> GetResultsList(string requestUrl, string searchTerm, int page, int pageSize)
        {
            var pageNumber       = page > 0 ? page : 1;
            var searchProperties = new SearchProperties {
                Page = pageNumber, Count = pageSize
            };

            var searchResult = await searchQueryService.SearchAsync(searchTerm, searchProperties).ConfigureAwait(false);

            if (searchResult?.Results is null)
            {
                return(null);
            }

            var viewModels = mapper.Map <SearchApiModel>(searchResult);

            viewModels.Results.ToList().ForEach(v => v.ResultItemUrlName = $"{requestUrl}{v.ResultItemUrlName?.TrimStart('/')}");
            viewModels.CurrentPage = page;
            viewModels.PageSize    = pageSize;

            return(viewModels);
        }