public void PerformSearch_WhenFindSpecificationsServiceUnavailable_ThenHttpExceptionThrown()
        {
            // Arrange
            ISpecsApiClient specsClient   = Substitute.For <ISpecsApiClient>();
            ILogger         logger        = Substitute.For <ILogger>();
            IMapper         mapper        = MappingHelper.CreateFrontEndMapper();
            IFeatureToggle  featureToggle = CreateFeatureToggle();

            ISpecificationSearchService SpecificationSearchService = new SpecificationSearchService(specsClient, mapper, logger, featureToggle);

            specsClient
            .When(a => a.FindSpecifications(Arg.Any <SearchFilterRequest>()))
            .Do(x => { throw new HttpRequestException(); });

            SearchRequestViewModel request = new SearchRequestViewModel();

            // Act
            Action pageAction = new Action(() =>
            {
                SpecificationSearchResultViewModel result = SpecificationSearchService.PerformSearch(request).Result;
            });

            // Assert
            pageAction.Should().Throw <HttpRequestException>();
        }
Пример #2
0
        public async Task OnGetAsync_GivenGetSpecificationsReturnsNullResults_ThenErrorReturned()
        {
            // Arrange
            ISpecificationSearchService searchService = CreateSearchService();

            SpecificationSearchResultViewModel searchResult = null;

            searchService
            .PerformSearch(Arg.Any <SearchRequestViewModel>())
            .Returns(searchResult);

            IndexModel indexModel = CreateIndexModel(searchService);

            // Act
            IActionResult result = await indexModel.OnGetAsync(null, null);

            // Assert
            result
            .Should()
            .BeOfType <InternalServerErrorResult>()
            .Which
            .Value
            .Should()
            .Be("There was an error retrieving Specifications from the Search Index.");

            await searchService
            .Received(1)
            .PerformSearch(Arg.Is <SearchRequestViewModel>(
                               c => c.PageNumber == 1 &&
                               c.SearchTerm == null));
        }
        public async Task PerformSearch_FirstSearchResultReturnedCorrectly()
        {
            // Arrange
            ISpecificationsApiClient specsClient = Substitute.For <ISpecificationsApiClient>();
            ILogger logger = Substitute.For <ILogger>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            ISpecificationSearchService SpecificationSearchService = new SpecificationSearchService(specsClient, mapper, logger);

            int numberOfItems = 25;

            PagedResult <SpecificationSearchResultItem> itemResult = GeneratePagedResult(numberOfItems);

            specsClient
            .FindSpecifications(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

            // Act
            SpecificationSearchResultViewModel results = await SpecificationSearchService.PerformSearch(request);

            // Assert
            SpecificationSearchResultItemViewModel first = results.Specifications.First();

            first.Should().NotBeNull();
            first.Id.Should().Be("10");
            first.Name.Should().Be("Specification 1");
            first.Status.Should().Be("Draft");
            first.FundingPeriodName.Should().Be("Test Period");
            first.IsSelectedForFunding.Should().BeTrue();
        }
        public async Task PerformSearch_StartAndEndItemsNumbersDisplayedCorrectlyOnSecondPageOfItemsWithMorePagesAvailable()
        {
            // Arrange
            ISpecificationsApiClient specsClient = Substitute.For <ISpecificationsApiClient>();
            ILogger logger = Substitute.For <ILogger>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            ISpecificationSearchService SpecificationSearchService = new SpecificationSearchService(specsClient, mapper, logger);

            int numberOfItems = 50;

            PagedResult <SpecificationSearchResultItem> itemResult = GeneratePagedResult(numberOfItems);

            itemResult.PageNumber = 2;
            itemResult.PageSize   = 50;
            itemResult.TotalItems = 175;

            specsClient
            .FindSpecifications(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

            SearchRequestViewModel request = new SearchRequestViewModel()
            {
                PageNumber = 2,
            };

            // Act
            SpecificationSearchResultViewModel results = await SpecificationSearchService.PerformSearch(request);

            // Assert
            results.StartItemNumber.Should().Be(51);
            results.EndItemNumber.Should().Be(100);
        }
        public async Task PerformSearch_StartAndEndItemsNumbersDisplayedCorrectlyOnSinglePageOfItems()
        {
            // Arrange
            ISpecsApiClient specsClient   = Substitute.For <ISpecsApiClient>();
            ILogger         logger        = Substitute.For <ILogger>();
            IMapper         mapper        = MappingHelper.CreateFrontEndMapper();
            IFeatureToggle  featureToggle = CreateFeatureToggle();

            ISpecificationSearchService SpecificationSearchService = new SpecificationSearchService(specsClient, mapper, logger, featureToggle);

            int numberOfItems = 25;

            PagedResult <SpecificationSearchResultItem> itemResult = GeneratePagedResult(numberOfItems);

            specsClient
            .FindSpecifications(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

            // Act
            SpecificationSearchResultViewModel results = await SpecificationSearchService.PerformSearch(request);

            // Assert
            results.StartItemNumber.Should().Be(1);
            results.EndItemNumber.Should().Be(numberOfItems);
        }
        public async Task PerformSearch_FirstSearchResultWithFacets_ReturnedCorrectly()
        {
            // Arrange
            ISpecificationsApiClient specsClient = Substitute.For <ISpecificationsApiClient>();
            ILogger logger = Substitute.For <ILogger>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            ISpecificationSearchService SpecificationSearchService = new SpecificationSearchService(specsClient, mapper, logger);

            int numberOfItems = 25;

            IEnumerable <SearchFacet> facets = new[]
            {
                new SearchFacet(), new SearchFacet()
            };

            PagedResult <SpecificationSearchResultItem> itemResult = GeneratePagedResult(numberOfItems, facets);

            specsClient
            .FindSpecifications(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

            // Act
            SpecificationSearchResultViewModel results = await SpecificationSearchService.PerformSearch(request);

            // Assert
            SpecificationSearchResultItemViewModel first = results.Specifications.First();

            first
            .Should()
            .NotBeNull();

            first
            .Should()
            .BeEquivalentTo(new SpecificationSearchResultItemViewModel()
            {
                Id   = "10",
                Name = "Specification 1",
                FundingPeriodName    = "Test Period",
                FundingPeriodId      = "FundingPeriodID",
                Status               = "Draft",
                Description          = "Description",
                FundingStreamIds     = new[] { "fs1", "fs2" },
                FundingStreamNames   = new[] { "Funding Stream 1", "Funding Stream 2" },
                LastUpdatedDate      = new DateTime(2018, 12, 5, 12, 5, 6),
                IsSelectedForFunding = true
            });

            results
            .Facets
            .Count()
            .Should()
            .Be(2);
        }
        public async Task <IActionResult> SearchCalculations([FromBody] SearchRequestViewModel request)
        {
            Guard.ArgumentNotNull(request, nameof(request));

            SpecificationSearchResultViewModel result = await _specificationSearchService.PerformSearch(request);

            if (result != null)
            {
                return(Ok(result));
            }
            else
            {
                return(new StatusCodeResult(500));
            }
        }
Пример #8
0
        public async Task OnGetAsync_GivenGetSpecificationsSearchTermRequested_ReturnsPageResult()
        {
            // Arrange
            ISpecificationSearchService searchService = CreateSearchService();

            const string searchTerm = "testTerm";

            SpecificationSearchResultViewModel searchResult = new SpecificationSearchResultViewModel()
            {
                CurrentPage     = 2,
                EndItemNumber   = 0,
                Facets          = new List <SearchFacetViewModel>(),
                PagerState      = new PagerState(1, 1),
                Specifications  = new List <SpecificationSearchResultItemViewModel>(),
                StartItemNumber = 1,
                TotalResults    = 0
            };

            searchService
            .PerformSearch(Arg.Any <SearchRequestViewModel>())
            .Returns(searchResult);

            IndexModel indexModel = CreateIndexModel(searchService);

            // Act
            IActionResult result = await indexModel.OnGetAsync(searchTerm, null);

            // Assert
            result
            .Should()
            .BeOfType <PageResult>()
            .Which
            .Should()
            .NotBeNull();

            indexModel
            .InitialSearchResults
            .Should()
            .NotBeNull();

            await searchService
            .Received(1)
            .PerformSearch(Arg.Is <SearchRequestViewModel>(
                               c => c.PageNumber == 1 &&
                               c.SearchTerm == searchTerm));
        }
        public async Task PerformSearch_WhenFindSpecificationsServiceReturnsNotFound_ThenNullReturned()
        {
            // Arrange
            ISpecificationsApiClient specsClient = Substitute.For <ISpecificationsApiClient>();
            ILogger logger = Substitute.For <ILogger>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            ISpecificationSearchService SpecificationSearchService = new SpecificationSearchService(specsClient, mapper, logger);

            PagedResult <SpecificationSearchResultItem> expectedServiceResult = null;

            specsClient
            .FindSpecifications(Arg.Any <SearchFilterRequest>())
            .Returns(expectedServiceResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

            // Act
            SpecificationSearchResultViewModel result = await SpecificationSearchService.PerformSearch(request);

            // Assert
            result.Should().BeNull();
        }
        public async Task PerformSearch_WhenFeatureToggleIsSwitchedOn_EnsureSearchModeIsAll()
        {
            // Arrange
            ISpecsApiClient specsClient   = Substitute.For <ISpecsApiClient>();
            ILogger         logger        = Substitute.For <ILogger>();
            IMapper         mapper        = MappingHelper.CreateFrontEndMapper();
            IFeatureToggle  featureToggle = CreateFeatureToggle(true);

            ISpecificationSearchService SpecificationSearchService = new SpecificationSearchService(specsClient, mapper, logger, featureToggle);

            SearchRequestViewModel request = new SearchRequestViewModel()
            {
                PageNumber = 2,
            };

            // Act
            SpecificationSearchResultViewModel results = await SpecificationSearchService.PerformSearch(request);

            // Assert
            await
            specsClient
            .Received(1)
            .FindSpecifications(Arg.Is <SearchFilterRequest>(m => m.SearchMode == SearchMode.All));
        }
        public async Task <SpecificationSearchResultViewModel> PerformSearch(SearchRequestViewModel request)
        {
            SearchFilterRequest requestOptions = new SearchFilterRequest()
            {
                Page          = request.PageNumber.HasValue ? request.PageNumber.Value : 1,
                PageSize      = request.PageSize.HasValue ? request.PageSize.Value : 50,
                SearchTerm    = request.SearchTerm,
                IncludeFacets = request.IncludeFacets,
                Filters       = request.Filters,
                SearchMode    = _featureToggle.IsSearchModeAllEnabled() ? SearchMode.All : SearchMode.Any
            };

            if (request.PageNumber.HasValue && request.PageNumber.Value > 0)
            {
                requestOptions.Page = request.PageNumber.Value;
            }

            PagedResult <SpecificationSearchResultItem> calculationsResult = await _specsApiClient.FindSpecifications(requestOptions);

            if (calculationsResult == null)
            {
                _logger.Error("Find calculations HTTP request failed");
                return(null);
            }

            SpecificationSearchResultViewModel result = new SpecificationSearchResultViewModel
            {
                TotalResults = calculationsResult.TotalItems,
                CurrentPage  = calculationsResult.PageNumber
            };

            List <SearchFacetViewModel> searchFacets = new List <SearchFacetViewModel>();

            if (calculationsResult.Facets != null)
            {
                foreach (SearchFacet facet in calculationsResult.Facets)
                {
                    searchFacets.Add(_mapper.Map <SearchFacetViewModel>(facet));
                }
            }

            result.Facets = searchFacets.AsEnumerable();

            List <SpecificationSearchResultItemViewModel> itemResults = new List <SpecificationSearchResultItemViewModel>();

            foreach (SpecificationSearchResultItem searchResult in calculationsResult.Items)
            {
                itemResults.Add(_mapper.Map <SpecificationSearchResultItemViewModel>(searchResult));
            }

            result.Specifications = itemResults.AsEnumerable();
            if (result.TotalResults == 0)
            {
                result.StartItemNumber = 0;
                result.EndItemNumber   = 0;
            }
            else
            {
                result.StartItemNumber = ((requestOptions.Page - 1) * requestOptions.PageSize) + 1;
                result.EndItemNumber   = result.StartItemNumber + requestOptions.PageSize - 1;
            }

            if (result.EndItemNumber > calculationsResult.TotalItems)
            {
                result.EndItemNumber = calculationsResult.TotalItems;
            }

            result.PagerState = new PagerState(requestOptions.Page, calculationsResult.TotalPages, 4);

            return(result);
        }
Пример #12
0
        public async Task OnGetAsync_GivenGetSpecificationsReturnsResults_ReturnsPageResult()
        {
            // Arrange
            ISpecificationSearchService searchService = CreateSearchService();

            SpecificationSearchResultViewModel searchResult = new SpecificationSearchResultViewModel()
            {
                CurrentPage    = 1,
                EndItemNumber  = 0,
                Facets         = new List <SearchFacetViewModel>(),
                PagerState     = new PagerState(1, 1),
                Specifications = new List <SpecificationSearchResultItemViewModel>()
                {
                    new SpecificationSearchResultItemViewModel()
                    {
                        Id                 = "search1",
                        Name               = "search one",
                        Description        = "Description",
                        LastUpdatedDate    = new DateTime(2018, 3, 5, 12, 34, 52),
                        FundingPeriodId    = "fundingPeriodId",
                        FundingPeriodName  = "Funding Period Name",
                        FundingStreamIds   = new[] { "fs1", "fs2" },
                        FundingStreamNames = new[] { "Funding Stream One", "Funding Stream Two" },
                        Status             = "Draft",
                    },
                },
                StartItemNumber = 1,
                TotalResults    = 0
            };


            searchService
            .PerformSearch(Arg.Any <SearchRequestViewModel>())
            .Returns(searchResult);

            IndexModel indexModel = CreateIndexModel(searchService);

            // Act
            IActionResult result = await indexModel.OnGetAsync(null, null);

            // Assert
            result
            .Should()
            .BeOfType <PageResult>()
            .Which
            .Should()
            .NotBeNull();

            indexModel
            .InitialSearchResults
            .Should()
            .NotBeNull();

            indexModel
            .SearchResults
            .Should()
            .BeEquivalentTo(new SpecificationSearchResultViewModel()
            {
                CurrentPage    = 1,
                EndItemNumber  = 0,
                Facets         = new List <SearchFacetViewModel>(),
                PagerState     = new PagerState(1, 1),
                Specifications = new List <SpecificationSearchResultItemViewModel>()
                {
                    new SpecificationSearchResultItemViewModel()
                    {
                        Id                 = "search1",
                        Name               = "search one",
                        Description        = "Description",
                        LastUpdatedDate    = new DateTime(2018, 3, 5, 12, 34, 52),
                        FundingPeriodId    = "fundingPeriodId",
                        FundingPeriodName  = "Funding Period Name",
                        FundingStreamIds   = new[] { "fs1", "fs2" },
                        FundingStreamNames = new[] { "Funding Stream One", "Funding Stream Two" },
                        Status             = "Draft",
                    },
                },
                StartItemNumber = 1,
                TotalResults    = 0
            });

            await searchService
            .Received(1)
            .PerformSearch(Arg.Is <SearchRequestViewModel>(
                               c => c.PageNumber == 1 &&
                               c.SearchTerm == null));
        }
        public async Task PerformSearch_FirstSearchResultWithFacets_EnsuresFacetsLoadedCorrectly()
        {
            // Arrange
            ISpecificationsApiClient specsClient = Substitute.For <ISpecificationsApiClient>();
            ILogger logger = Substitute.For <ILogger>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            ISpecificationSearchService SpecificationSearchService = new SpecificationSearchService(specsClient, mapper, logger);

            int numberOfItems = 25;

            IEnumerable <SearchFacet> facets = new[]
            {
                new SearchFacet
                {
                    Name        = "facet 1",
                    FacetValues = new[]
                    {
                        new SearchFacetValue {
                            Name = "f1", Count = 5
                        }
                    }
                },
                new SearchFacet
                {
                    Name        = "facet 2",
                    FacetValues = new[]
                    {
                        new SearchFacetValue {
                            Name = "f2", Count = 11
                        },
                        new SearchFacetValue {
                            Name = "f3", Count = 1
                        }
                    }
                }
            };

            PagedResult <SpecificationSearchResultItem> itemResult = GeneratePagedResult(numberOfItems, facets);

            specsClient
            .FindSpecifications(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

            // Act
            SpecificationSearchResultViewModel results = await SpecificationSearchService.PerformSearch(request);

            // Assert
            SpecificationSearchResultItemViewModel first = results.Specifications.First();

            first.Should().NotBeNull();
            first.Id.Should().Be("10");
            first.Name.Should().Be("Specification 1");
            first.Status.Should().Be("Draft");
            first.FundingPeriodName.Should().Be("Test Period");

            results.Facets.Count().Should().Be(2);
            results.Facets.First().Name.Should().Be("facet 1");
            results.Facets.First().FacetValues.Count().Should().Be(1);
            results.Facets.First().FacetValues.First().Name.Should().Be("f1");
            results.Facets.First().FacetValues.First().Count.Should().Be(5);
            results.Facets.Last().Name.Should().Be("facet 2");
            results.Facets.Last().FacetValues.Count().Should().Be(2);
            results.Facets.Last().FacetValues.First().Name.Should().Be("f2");
            results.Facets.Last().FacetValues.First().Count.Should().Be(11);
            results.Facets.Last().FacetValues.Last().Name.Should().Be("f3");
            results.Facets.Last().FacetValues.Last().Count.Should().Be(1);
        }