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