public async Task OnGetAsync_GivenageNumber_CallsSearchWithCorrentPageNumber()
        {
            //Arrange
            CalculationSearchResultViewModel viewModel = CreateCalculationSearchResultViewModel();

            ICalculationSearchService searchService = CreateCalculationService();

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

            ViewCalculationResultsModel pageModel = CreatePageModel(searchService);

            //Act
            IActionResult result = await pageModel.OnGetAsync(2, "");

            //Assert
            await
            searchService
            .Received(1)
            .PerformSearch(Arg.Is <SearchRequestViewModel>(
                               m => m.PageNumber == 2 &&
                               m.IncludeFacets == false &&
                               m.SearchTerm == ""
                               ));

            result
            .Should()
            .BeOfType <PageResult>();
        }
Beispiel #2
0
        public async Task PerformSearch_FirstSearchResultReturnedCorrectly()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ILogger        logger        = Substitute.For <ILogger>();
            IMapper        mapper        = MappingHelper.CreateFrontEndMapper();
            IFeatureToggle featureToggle = CreateFeatureToggle();

            ICalculationSearchService calculationSearchService = new CalculationSearchService(calcsClient, mapper, logger, featureToggle);

            int numberOfItems = 25;

            PagedResult <CalculationSearchResultItem> itemResult = GeneratePagedResult(numberOfItems);

            calcsClient
            .FindCalculations(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

            // Act
            CalculationSearchResultViewModel results = await calculationSearchService.PerformSearch(request);

            // Assert
            CalculationSearchResultItemViewModel first = results.Calculations.First();

            first.Should().NotBeNull();
            first.Id.Should().Be("10");
            first.SpecificationName.Should().Be("Spec Name");
            first.Status.Should().Be("Unknown");
            first.FundingPeriodName.Should().Be("Test Period");
            first.Name.Should().Be("Calculation 1");
        }
Beispiel #3
0
        public void PerformSearch_WhenFindCalculationsServiceUnavailable_ThenHttpExceptionThrown()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ILogger        logger        = Substitute.For <ILogger>();
            IMapper        mapper        = MappingHelper.CreateFrontEndMapper();
            IFeatureToggle featureToggle = CreateFeatureToggle();

            ICalculationSearchService calculationSearchService = new CalculationSearchService(calcsClient, mapper, logger, featureToggle);

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

            SearchRequestViewModel request = new SearchRequestViewModel();

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

            // Assert
            pageAction.Should().Throw <HttpRequestException>();
        }
Beispiel #4
0
        public async Task PerformSearch_StartAndEndItemsNumbersDisplayedCorrectlyOnSecondPageOfItemsWithLessThanPageSize()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ILogger        logger        = Substitute.For <ILogger>();
            IMapper        mapper        = MappingHelper.CreateFrontEndMapper();
            IFeatureToggle featureToggle = CreateFeatureToggle();

            ICalculationSearchService calculationSearchService = new CalculationSearchService(calcsClient, mapper, logger, featureToggle);

            int numberOfItems = 25;

            PagedResult <CalculationSearchResultItem> itemResult = GeneratePagedResult(numberOfItems);

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

            calcsClient
            .FindCalculations(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

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

            // Act
            CalculationSearchResultViewModel results = await calculationSearchService.PerformSearch(request);

            // Assert
            results.StartItemNumber.Should().Be(51);
            results.EndItemNumber.Should().Be(75);
        }
        private CalculationSearchResultViewModel GenerateSearchResult(int numberOfItems)
        {
            CalculationSearchResultViewModel result = new CalculationSearchResultViewModel()
            {
                CurrentPage     = 1,
                EndItemNumber   = numberOfItems,
                Facets          = null,
                PagerState      = new ViewModels.Common.PagerState(1, 1),
                StartItemNumber = 1,
                TotalResults    = numberOfItems,
            };

            List <CalculationSearchResultItemViewModel> items = new List <CalculationSearchResultItemViewModel>();

            for (int i = 0; i < numberOfItems; i++)
            {
                items.Add(new CalculationSearchResultItemViewModel()
                {
                    Id   = $"{i}",
                    Name = $"Calculation {i}",
                    FundingPeriodName = "Test Period",
                    SpecificationName = "Spec Name",
                    Status            = "Unknown",
                });
            }

            result.Calculations = items.AsEnumerable();

            return(result);
        }
Beispiel #6
0
        public async Task PerformSearch_SearchResultsReturnedCorrectly()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ILogger logger = Substitute.For <ILogger>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            ICalculationSearchService calculationSearchService = new CalculationSearchService(calcsClient, mapper, logger);

            int numberOfItems = 25;

            ApiResponse <SearchResults <CalculationSearchResult> > itemResult = GeneratePagedResult(numberOfItems);

            calcsClient
            .FindCalculations(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

            // Act
            CalculationSearchResultViewModel results = await calculationSearchService.PerformSearch(request);

            // Assert
            CalculationSearchResultItemViewModel[] calcs = results.Calculations.ToArray();

            for (int i = 0; i < calcs.Length; i++)
            {
                calcs[i].Id.Should().Be((i + 10).ToString());
                calcs[i].Name.Should().Be($"Calculation {i + 1}");
            }
        }
        public async Task OnGet_WhenNoCalculationsExist()
        {
            // Arrange
            CalculationSearchResultViewModel searchResult = GenerateSearchResult(0);

            ICalculationsApiClient calcsClient                 = Substitute.For <ICalculationsApiClient>();
            ILogger                   logger                   = Substitute.For <ILogger>();
            IMapper                   mapper                   = MappingHelper.CreateFrontEndMapper();
            IFeatureToggle            featureToggle            = Substitute.For <IFeatureToggle>();
            ICalculationSearchService calculationSearchService = Substitute.For <ICalculationSearchService>();

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

            IndexPageModel pageModel = new IndexPageModel(calcsClient, calculationSearchService, featureToggle);

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

            // Assert
            result.Should().NotBeNull();
            pageModel.SearchResults.CurrentPage.Should().Be(1);
            pageModel.SearchResults.Calculations.Should().BeEmpty();
            pageModel.SearchResults.PagerState.CurrentPage.Should().Be(1);
        }
        public async Task OnGetAsync_GivenNullResultsReturned_ReturnsInternalServerError()
        {
            //Arrange
            CalculationSearchResultViewModel viewModel = null;

            ICalculationSearchService searchService = CreateCalculationService();

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

            ViewCalculationResultsModel pageModel = CreatePageModel(searchService);

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

            //Assert
            await
            searchService
            .Received(1)
            .PerformSearch(Arg.Is <SearchRequestViewModel>(
                               m => m.PageNumber == null &&
                               m.IncludeFacets == false &&
                               m.SearchTerm == ""
                               ));

            result
            .Should()
            .BeOfType <InternalServerErrorResult>();

            pageModel
            .SearchTerm
            .Should()
            .BeNullOrWhiteSpace();
        }
Beispiel #9
0
        public async Task PerformSearch_StartAndEndItemsNumbersDisplayedCorrectlyOnSecondPageOfItemsWithMorePagesAvailable()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ILogger logger = Substitute.For <ILogger>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            ICalculationSearchService calculationSearchService = new CalculationSearchService(calcsClient, mapper, logger);

            int numberOfItems = 50;

            var itemResult = GeneratePagedResult(numberOfItems);

            itemResult.Content.TotalCount = 175;

            calcsClient
            .FindCalculations(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

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

            // Act
            CalculationSearchResultViewModel results = await calculationSearchService.PerformSearch(request);

            // Assert
            results.StartItemNumber.Should().Be(51);
            results.EndItemNumber.Should().Be(100);
        }
        public async Task <IActionResult> GetAdditionalCalculationsForSpecification(CalculationSearchRequestViewModel viewModel)
        {
            Guard.ArgumentNotNull(viewModel.SpecificationId, nameof(viewModel.SpecificationId));
            Guard.ArgumentNotNull(viewModel.CalculationType, nameof(viewModel.CalculationType));

            SearchRequestViewModel request = new SearchRequestViewModel
            {
                FacetCount = 50,
                Filters    = new Dictionary <string, string[]>
                {
                    { "specificationId", new[] { viewModel.SpecificationId } },
                    { "status", new[] { viewModel.Status } },
                    { "calculationType", new[] { viewModel.CalculationType } }
                },
                PageNumber = viewModel.PageNumber,
                PageSize   = 50,
            };

            if (!string.IsNullOrEmpty(viewModel.SearchTerm))
            {
                request.SearchTerm = viewModel.SearchTerm;
            }


            CalculationSearchResultViewModel result = await _calculationSearchService.PerformSearch(request);

            if (result != null)
            {
                return(Ok(result));
            }
            else
            {
                return(new StatusCodeResult(500));
            }
        }
        public async Task OnPostAsync_WhenSecondPageRequestedWithSearchTerm_ThenSuccessfullyShown()
        {
            // Arrange
            ICalculationsApiClient    calcsClient = Substitute.For <ICalculationsApiClient>();
            ICalculationSearchService calculationSearchService = Substitute.For <ICalculationSearchService>();
            IFeatureToggle            featureToggle            = Substitute.For <IFeatureToggle>();

            int    generatedNumberOfItems = 50;
            int    requestedPage          = 2;
            string searchTerm             = "test search";

            SearchRequestViewModel searchRequest = new SearchRequestViewModel()
            {
                SearchTerm    = searchTerm,
                PageNumber    = requestedPage,
                IncludeFacets = false,
                Filters       = null,
            };

            CalculationSearchResultViewModel expectedCalculationResult = GenerateSearchResult(generatedNumberOfItems);

            expectedCalculationResult.StartItemNumber = 51;
            expectedCalculationResult.EndItemNumber   = 100;
            expectedCalculationResult.PagerState      = new ViewModels.Common.PagerState(2, 2);

            calculationSearchService.PerformSearch(Arg.Is <SearchRequestViewModel>(
                                                       m => m.PageNumber == searchRequest.PageNumber &&
                                                       m.SearchTerm == searchRequest.SearchTerm &&
                                                       m.IncludeFacets == searchRequest.IncludeFacets &&
                                                       m.Filters == searchRequest.Filters))
            .Returns(expectedCalculationResult);

            IndexPageModel pageModel = new IndexPageModel(calcsClient, calculationSearchService, featureToggle);

            pageModel.SearchTerm = searchTerm;

            // Act
            IActionResult result = await pageModel.OnPostAsync(requestedPage);

            // Assert
            result.Should().BeOfType <PageResult>();
            pageModel.SearchResults.Should().NotBeNull();
            pageModel.SearchResults.Calculations.Should().HaveCount(generatedNumberOfItems, "The number of items returned in the calculations list should equal the expected results");
            pageModel.SearchResults.PagerState.Should().NotBeNull("Pager State should not be null");
            pageModel.SearchTerm.Should().Be(searchTerm);
            pageModel.SearchResults.PagerState.CurrentPage.Should().Be(2);
            pageModel.SearchResults.PagerState.DisplayNumberOfPages.Should().Be(4);
            pageModel.SearchResults.PagerState.NextPage.Should().BeNull("Next Page should be null");
            pageModel.SearchResults.PagerState.PreviousPage.Should().BeNull("Preview Page should be null");
        }
        public async Task <IActionResult> SearchCalculations([FromBody] SearchRequestViewModel request)
        {
            Guard.ArgumentNotNull(request, nameof(request));

            request.FacetCount = 50;

            CalculationSearchResultViewModel result = await _calculationSearchService.PerformSearch(request);

            if (result != null)
            {
                return(Ok(result));
            }
            else
            {
                return(new StatusCodeResult(500));
            }
        }
        private CalculationSearchResultViewModel BuildResults(ApiResponse <SearchResults <CalculationSearchResult> > calculationsResult, int page, int pageSize)
        {
            if (calculationsResult == null)
            {
                _logger.Error("Find calculations HTTP request failed");
                return(null);
            }

            CalculationSearchResultViewModel result = new CalculationSearchResultViewModel
            {
                TotalResults = calculationsResult.Content?.TotalCount ?? 0,
                CurrentPage  = page,
                Calculations = calculationsResult.Content?.Results?.Select(m => _mapper.Map <CalculationSearchResultItemViewModel>(m))
            };

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

            if (calculationsResult.Content != null && calculationsResult.Content.Facets != null)
            {
                searchFacets.AddRange(calculationsResult.Content.Facets.Select(facet => _mapper.Map <SearchFacetViewModel>(facet)));
            }

            result.Facets = searchFacets.AsEnumerable();

            if (result.TotalResults == 0)
            {
                result.StartItemNumber = 0;
                result.EndItemNumber   = 0;
            }
            else
            {
                result.StartItemNumber = ((page - 1) * pageSize) + 1;
                result.EndItemNumber   = result.StartItemNumber + pageSize - 1;
            }

            if (result.EndItemNumber > result.TotalResults)
            {
                result.EndItemNumber = result.TotalResults;
            }

            result.PagerState = new PagerState(page, (int)Math.Ceiling(result.TotalResults / (double)pageSize), 2);

            return(result);
        }
Beispiel #14
0
        public async Task PerformSearch_GivenIsSearchModeAllEnabledFeatureToggleIsSwitchedOn_SearchModeIsAll()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ILogger        logger        = Substitute.For <ILogger>();
            IMapper        mapper        = MappingHelper.CreateFrontEndMapper();
            IFeatureToggle featureToggle = CreateFeatureToggle(true);

            ICalculationSearchService calculationSearchService = new CalculationSearchService(calcsClient, mapper, logger, featureToggle);

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

            // Act
            CalculationSearchResultViewModel results = await calculationSearchService.PerformSearch(request);

            // Assert
            await
            calcsClient
            .FindCalculations(Arg.Is <SearchFilterRequest>(m => m.SearchMode == SearchMode.All));
        }
Beispiel #15
0
        public async Task PerformSearch_WhenFindCalculationsServiceReturnsNotFound_ThenNullReturned()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ILogger logger = Substitute.For <ILogger>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            ICalculationSearchService calculationSearchService = new CalculationSearchService(calcsClient, mapper, logger);

            ApiResponse <SearchResults <CalculationSearchResult> > expectedServiceResult = null;

            calcsClient
            .FindCalculations(Arg.Any <SearchFilterRequest>())
            .Returns(expectedServiceResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

            // Act
            CalculationSearchResultViewModel result = await calculationSearchService.PerformSearch(request);

            // Assert
            result.Should().BeNull();
        }
Beispiel #16
0
        public async Task <CalculationSearchResultViewModel> 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,
                FacetCount    = request.FacetCount,
                SearchMode    = _featureToggle.IsSearchModeAllEnabled() ? SearchMode.All : SearchMode.Any
            };

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

            PagedResult <CalculationSearchResultItem> calculationsResult = await _calculationsApiClient.FindCalculations(requestOptions);

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

            CalculationSearchResultViewModel result = new CalculationSearchResultViewModel();

            result.TotalResults = calculationsResult.TotalItems;
            result.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 <CalculationSearchResultItemViewModel> itemResults = new List <CalculationSearchResultItemViewModel>();

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

            result.Calculations = 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);
        }
Beispiel #17
0
        public async Task PerformSearch_FirstSearchResultWithFacets_EnsuresFacetsLoadedCorrectly()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ILogger        logger        = Substitute.For <ILogger>();
            IMapper        mapper        = MappingHelper.CreateFrontEndMapper();
            IFeatureToggle featureToggle = CreateFeatureToggle();

            ICalculationSearchService calculationSearchService = new CalculationSearchService(calcsClient, mapper, logger, featureToggle);

            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 <CalculationSearchResultItem> itemResult = GeneratePagedResult(numberOfItems, facets);

            calcsClient
            .FindCalculations(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

            // Act
            CalculationSearchResultViewModel results = await calculationSearchService.PerformSearch(request);

            // Assert
            CalculationSearchResultItemViewModel first = results.Calculations.First();

            first.Should().NotBeNull();
            first.Id.Should().Be("10");
            first.SpecificationName.Should().Be("Spec Name");
            first.Status.Should().Be("Unknown");
            first.FundingPeriodName.Should().Be("Test Period");
            first.Name.Should().Be("Calculation 1");

            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);
        }
Beispiel #18
0
        public async Task PerformSearch_FirstSearchResultWithFacets_EnsuresFacetsLoadedCorrectly()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ILogger logger = Substitute.For <ILogger>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            ICalculationSearchService calculationSearchService = new CalculationSearchService(calcsClient, 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
                        }
                    }
                }
            };

            var itemResult = GeneratePagedResult(numberOfItems, facets);

            calcsClient
            .FindCalculations(Arg.Any <SearchFilterRequest>())
            .Returns(itemResult);

            SearchRequestViewModel request = new SearchRequestViewModel();

            // Act
            CalculationSearchResultViewModel results = await calculationSearchService.PerformSearch(request);

            // Assert
            CalculationSearchResultItemViewModel[] calcs = results.Calculations.ToArray();

            for (int i = 0; i < calcs.Length; i++)
            {
                calcs[i].Id.Should().Be((i + 10).ToString());
                calcs[i].Name.Should().Be($"Calculation {i + 1}");
            }

            results.Facets.Count().Should().Be(facets.Count());

            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);
        }