public async Task PerformSearch_GivenFirstSearchResultReturnedCorrectly_EnsuresResults() { // Arrange IResultsApiClient resultClient = Substitute.For <IResultsApiClient>(); ILogger logger = CreateLogger(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); CalculationProviderResultsSearchService resultsSearchService = CreateSearchService(resultClient, mapper, logger); int numberOfItems = 25; PagedResult <CalculationProviderResultSearchResultItem> itemResult = GeneratePagedResult(numberOfItems); resultClient .FindCalculationProviderResults(Arg.Any <SearchFilterRequest>()) .Returns(itemResult); SearchRequestViewModel request = new SearchRequestViewModel(); // Act CalculationProviderResultSearchResultViewModel results = await resultsSearchService.PerformSearch(request); // Assert results.TotalResults.Should().Be(numberOfItems + 1); results.TotalErrorResults.Should().Be(1); }
public async Task PerformSearch_GivenFindCalculationProviderResultsServiceReturnsNotFound_ThenNullReturned() { // Arrange IResultsApiClient resultClient = Substitute.For <IResultsApiClient>(); ILogger logger = CreateLogger(); IMapper mapper = CreateMapper(); CalculationProviderResultsSearchService resultsSearchService = CreateSearchService(resultClient, mapper, logger); PagedResult <CalculationProviderResultSearchResultItem> expectedServiceResult = null; resultClient .FindCalculationProviderResults(Arg.Any <SearchFilterRequest>()) .Returns(expectedServiceResult); SearchRequestViewModel request = new SearchRequestViewModel(); // Act CalculationProviderResultSearchResultViewModel result = await resultsSearchService.PerformSearch(request); // Assert result .Should() .BeNull(); }
public async Task <IActionResult> SearchCalculationProviderResults([FromBody] SearchRequestViewModel request, [FromQuery] string calculationValueType = null) { Guard.ArgumentNotNull(request, nameof(request)); CalculationProviderResultSearchResultViewModel searchResults = await _calculationProviderResultsSearchService.PerformSearch(request); if (calculationValueType != null) { CalculationValueTypeViewModel valueType = calculationValueType.AsEnum <CalculationValueTypeViewModel>(); foreach (CalculationProviderResultSearchResultItemViewModel providerResult in searchResults.CalculationProviderResults) { providerResult.SetCalculationResultDisplay(valueType); } } CalculationProviderResultSearchResultViewModel result = searchResults; if (result != null) { return(Ok(result)); } return(new InternalServerErrorResult($"Find provider results HTTP request failed")); }
public async Task PerformSearch_GivenFirstSearchResultReturnedCorrectly_EnsuresResult() { // Arrange int numberOfItems = 25; CalculationProviderResultSearchResults itemResult = GenerateSearchResults(numberOfItems); _resultsClient .SearchCalculationProviderResults(Arg.Any <SearchModel>()) .Returns(new ApiResponse <CalculationProviderResultSearchResults>(HttpStatusCode.OK, itemResult)); SearchRequestViewModel request = new SearchRequestViewModel(); AndCalculationExistsForCalcId("calcId"); // Act CalculationProviderResultSearchResultViewModel results = await _resultsSearchService.PerformSearch(request); // Assert CalculationProviderResultSearchResultItemViewModel first = results.CalculationProviderResults.First(); first .Should() .NotBeNull(); first .Id .Should() .Be("10"); first .ProviderName .Should() .Be("prov-1"); first .CalculationResult .Should() .Be(1); CalculationProviderResultSearchResultItemViewModel last = results.CalculationProviderResults.Last(); last .CalculationExceptionType .Should() .Be("Exception"); last .CalculationExceptionMessage .Should() .Be("An exception has occurred"); }
public async Task <IActionResult> SearchCalculationProviderResults([FromBody] SearchRequestViewModel request) { Guard.ArgumentNotNull(request, nameof(request)); CalculationProviderResultSearchResultViewModel result = await _calculationProviderResultsSearchService.PerformSearch(request); if (result != null) { return(Ok(result)); } else { return(new StatusCodeResult(500)); } }
public async Task PerformSearch_GivenFindCalculationProviderResultsServiceReturnsNotFound_ThenNullReturned() { // Arrange _resultsClient .SearchCalculationProviderResults(Arg.Any <SearchModel>()) .Returns((ApiResponse <CalculationProviderResultSearchResults>)null); SearchRequestViewModel request = new SearchRequestViewModel(); // Act CalculationProviderResultSearchResultViewModel result = await _resultsSearchService.PerformSearch(request); // Assert result .Should() .BeNull(); }
public async Task PerformSearch_GivenFirstSearchResultReturnedCorrectly_EnsuresResults() { // Arrange int numberOfItems = 25; CalculationProviderResultSearchResults itemResult = GenerateSearchResults(numberOfItems); _resultsClient .SearchCalculationProviderResults(Arg.Any <SearchModel>()) .Returns(new ApiResponse <CalculationProviderResultSearchResults>(HttpStatusCode.OK, itemResult)); SearchRequestViewModel request = new SearchRequestViewModel(); AndCalculationExistsForCalcId("calcId"); // Act CalculationProviderResultSearchResultViewModel results = await _resultsSearchService.PerformSearch(request); // Assert results.TotalResults.Should().Be(numberOfItems + 1); results.TotalErrorResults.Should().Be(1); }
public async Task SearchCalculationProviderResults_GivenResultsReturnedFromSearch_ReturnsOK() { // Arrange SearchRequestViewModel requestModel = new SearchRequestViewModel(); CalculationProviderResultSearchResultViewModel results = new CalculationProviderResultSearchResultViewModel(); ICalculationProviderResultsSearchService searchService = CreateCalculationProviderResultsSearchService(); searchService .PerformSearch(Arg.Any <SearchRequestViewModel>()) .Returns(results); ProviderSearchController controller = CreateController(calculationProviderResultsSearchService: searchService); // Act IActionResult actionResult = await controller.SearchCalculationProviderResults(requestModel); // Asserts actionResult .Should() .BeOfType <OkObjectResult>(); }
public async Task PerformSearch_FirstSearchResultWithFacets_EnsuresFacetsLoadedCorrectly() { // Arrange int numberOfItems = 25; IEnumerable <Facet> facets = new[] { new Facet { Name = "facet 1", FacetValues = new[] { new FacetValue { Name = "f1", Count = 5 } } }, new Facet { Name = "facet 2", FacetValues = new[] { new FacetValue { Name = "f2", Count = 11 }, new FacetValue { Name = "f3", Count = 1 } } } }; CalculationProviderResultSearchResults itemResult = GenerateSearchResults(numberOfItems, facets); _resultsClient .SearchCalculationProviderResults(Arg.Any <SearchModel>()) .Returns(new ApiResponse <CalculationProviderResultSearchResults>(HttpStatusCode.OK, itemResult)); SearchRequestViewModel request = new SearchRequestViewModel(); AndCalculationExistsForCalcId("calcId"); // Act CalculationProviderResultSearchResultViewModel results = await _resultsSearchService.PerformSearch(request); // Assert CalculationProviderResultSearchResultItemViewModel first = results.CalculationProviderResults.First(); first .Should() .NotBeNull(); first .Id .Should() .Be("10"); first .ProviderName .Should() .Be("prov-1"); first .CalculationResult .Should() .Be(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 <CalculationProviderResultSearchResultViewModel> PerformSearch(SearchRequestViewModel request) { int pageNumber = request.PageNumber.GetValueOrDefault(1); int pageSize = request.PageSize.GetValueOrDefault(50); ApiResponse <CalculationProviderResultSearchResults> searchRequestResult = await _resultsClient.SearchCalculationProviderResults(new SearchModel { PageNumber = pageNumber, Top = pageSize, SearchTerm = request.SearchTerm, IncludeFacets = request.IncludeFacets, ErrorToggle = string.IsNullOrWhiteSpace(request.ErrorToggle) ? (bool?)null : (request.ErrorToggle == "Errors"), Filters = request.Filters, SearchFields = request.SearchFields }); if (searchRequestResult?.Content == null) { _logger.Error("Find providers HTTP request failed"); return(null); } CalculationProviderResultSearchResults calculationProviderResultSearchResults = searchRequestResult.Content; CalculationProviderResultSearchResultViewModel result = new CalculationProviderResultSearchResultViewModel { TotalResults = calculationProviderResultSearchResults.TotalCount, CurrentPage = pageNumber, TotalErrorResults = calculationProviderResultSearchResults.TotalErrorCount }; List <SearchFacetViewModel> searchFacets = new List <SearchFacetViewModel>(); if (calculationProviderResultSearchResults.Facets != null) { foreach (Facet facet in calculationProviderResultSearchResults.Facets) { searchFacets.Add(_mapper.Map <SearchFacetViewModel>(facet)); } } result.Facets = searchFacets.AsEnumerable(); List <CalculationProviderResultSearchResultItemViewModel> itemResults = new List <CalculationProviderResultSearchResultItemViewModel>(); Dictionary <string, CalculationValueTypeViewModel> calcTypes = new Dictionary <string, CalculationValueTypeViewModel>(); foreach (CalculationProviderResultSearchResult searchresult in calculationProviderResultSearchResults.Results) { CalculationProviderResultSearchResultItemViewModel vmResult = _mapper.Map <CalculationProviderResultSearchResultItemViewModel>(searchresult); if (!calcTypes.ContainsKey(searchresult.CalculationId)) { ApiResponse <Common.ApiClient.Calcs.Models.Calculation> calcResult = await _calculationsApiClient.GetCalculationById(searchresult.CalculationId); if (calcResult == null || calcResult.Content == null || calcResult.StatusCode != System.Net.HttpStatusCode.OK) { throw new InvalidOperationException($"Unable to get calculation details for calculation ID '{searchresult.CalculationId}'"); } CalculationValueTypeViewModel calculationValueTypeViewModel = _mapper.Map <CalculationValueTypeViewModel>(calcResult.Content.ValueType); calcTypes.Add(searchresult.CalculationId, calculationValueTypeViewModel); } vmResult.SetCalculationResultDisplay(calcTypes[searchresult.CalculationId]); itemResults.Add(vmResult); } result.CalculationProviderResults = itemResults.AsEnumerable(); if (result.TotalResults == 0) { result.StartItemNumber = 0; result.EndItemNumber = 0; } else { result.StartItemNumber = ((pageNumber - 1) * pageSize) + 1; result.EndItemNumber = result.StartItemNumber + pageSize - 1; } if (result.EndItemNumber > calculationProviderResultSearchResults.TotalCount) { result.EndItemNumber = calculationProviderResultSearchResults.TotalCount; } result.PagerState = new PagerState(pageNumber, (int)Math.Ceiling(calculationProviderResultSearchResults.TotalCount / (double)pageSize), 4); return(result); }
public async Task PerformSearch_GivenFirstSearchResultReturnedCorrectly_EnsuresResult() { // Arrange IResultsApiClient resultClient = Substitute.For <IResultsApiClient>(); ILogger logger = CreateLogger(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); CalculationProviderResultsSearchService resultsSearchService = CreateSearchService(resultClient, mapper, logger); int numberOfItems = 25; PagedResult <CalculationProviderResultSearchResultItem> itemResult = GeneratePagedResult(numberOfItems); resultClient .FindCalculationProviderResults(Arg.Any <SearchFilterRequest>()) .Returns(itemResult); SearchRequestViewModel request = new SearchRequestViewModel(); // Act CalculationProviderResultSearchResultViewModel results = await resultsSearchService.PerformSearch(request); // Assert CalculationProviderResultSearchResultItemViewModel first = results.CalculationProviderResults.First(); first .Should() .NotBeNull(); first .Id .Should() .Be("10"); first .CalculationType .Should() .Be(CalculationSpecificationType.Number); first .Name .Should() .Be("prov-1"); first .CalculationResult .Should() .Be(1); CalculationProviderResultSearchResultItemViewModel last = results.CalculationProviderResults.Last(); last .CalculationExceptionType .Should() .Be("Exception"); last .CalculationExceptionMessage .Should() .Be("An exception has occurred"); }
public async Task PerformSearch_FirstSearchResultWithFacets_EnsuresFacetsLoadedCorrectly() { // Arrange IResultsApiClient resultClient = Substitute.For <IResultsApiClient>(); ILogger logger = CreateLogger(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); CalculationProviderResultsSearchService resultsSearchService = CreateSearchService(resultClient, 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 <CalculationProviderResultSearchResultItem> itemResult = GeneratePagedResult(numberOfItems, facets); resultClient .FindCalculationProviderResults(Arg.Any <SearchFilterRequest>()) .Returns(itemResult); SearchRequestViewModel request = new SearchRequestViewModel(); // Act CalculationProviderResultSearchResultViewModel results = await resultsSearchService.PerformSearch(request); // Assert CalculationProviderResultSearchResultItemViewModel first = results.CalculationProviderResults.First(); first .Should() .NotBeNull(); first .Id .Should() .Be("10"); first .CalculationType .Should() .Be(CalculationSpecificationType.Number); first .Name .Should() .Be("prov-1"); first .CalculationResult .Should() .Be(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 OnGetAsync_GivenCalculationFoundWithEmptySearchResults_ReturnsPage() { //Arrange const string calculationId = "calc-id"; const string specificationId = "spec-id"; Calculation calculation = new Calculation { Id = calculationId, SpecificationId = specificationId }; CalculationViewModel calculationViewModel = new CalculationViewModel { Id = calculationId, SpecificationId = specificationId }; IEnumerable <DatasetSchemasAssigned> datasetSchemasAssignedList = new[] { new DatasetSchemasAssigned { IsSetAsProviderData = true } }; ApiResponse <IEnumerable <DatasetSchemasAssigned> > datasetSchemaResponse = new ApiResponse <IEnumerable <DatasetSchemasAssigned> >(HttpStatusCode.OK, datasetSchemasAssignedList); IDatasetsApiClient datasetsApiClient = CreateDatasetsApiClient(); datasetsApiClient .GetAssignedDatasetSchemasForSpecification(Arg.Is(specificationId)) .Returns(datasetSchemaResponse); CalculationProviderResultSearchResultViewModel calculationProviderResultSearchResultViewModel = new CalculationProviderResultSearchResultViewModel { CalculationProviderResults = Enumerable.Empty <CalculationProviderResultSearchResultItemViewModel>() }; ApiResponse <Calculation> CalculationResponse = new ApiResponse <Calculation>(HttpStatusCode.OK, calculation); ICalculationsApiClient calculationsApiClient = CreateCalculationsApiClient(); calculationsApiClient .GetCalculationById(Arg.Is(calculationId)) .Returns(CalculationResponse); IMapper mapper = CreateMapper(); mapper .Map <CalculationViewModel>(Arg.Is(calculation)) .Returns(calculationViewModel); ICalculationProviderResultsSearchService calculationProviderResultsSearchService = CreateResultsSearchService(); calculationProviderResultsSearchService .PerformSearch(Arg.Any <SearchRequestViewModel>()) .Returns(calculationProviderResultSearchResultViewModel); ISpecsApiClient specsApiClient = CreateSpecsApiClient(); specsApiClient.GetSpecificationSummaries(Arg.Any <IEnumerable <string> >()) .Returns(new ApiResponse <IEnumerable <Clients.SpecsClient.Models.SpecificationSummary> >(HttpStatusCode.OK, Enumerable.Empty <Clients.SpecsClient.Models.SpecificationSummary>())); Clients.SpecsClient.Models.SpecificationSummary specificationSummary = new Clients.SpecsClient.Models.SpecificationSummary() { Id = specificationId, }; specsApiClient .GetSpecificationSummary(Arg.Is(specificationId)) .Returns(new ApiResponse <Clients.SpecsClient.Models.SpecificationSummary>(HttpStatusCode.OK, specificationSummary)); CalculationProviderResultsPageModel pageModel = CreatePageModel( calculationProviderResultsSearchService, calculationsApiClient, mapper: mapper, datasetsApiClient: datasetsApiClient, specsApiClient: specsApiClient); //Act IActionResult result = await pageModel.OnGetAsync(calculationId, null, ""); //Assert result .Should() .BeOfType <PageResult>(); pageModel .CalculationProviderResults .CalculationProviderResults .Any() .Should() .BeFalse(); }
public async Task <IActionResult> SearchProviderResultsForCalculation([FromBody] CalculationProviderSearchRequestViewModel viewModel) { Guard.ArgumentNotNull(viewModel, nameof(viewModel)); SearchRequestViewModel request = new SearchRequestViewModel { Filters = new Dictionary <string, string[]>(), FacetCount = viewModel.FacetCount, IncludeFacets = viewModel.IncludeFacets, PageNumber = viewModel.PageNumber, PageSize = viewModel.PageSize, SearchMode = viewModel.SearchMode, SearchFields = viewModel.SearchFields }; if (!string.IsNullOrEmpty(viewModel.SearchTerm)) { request.SearchTerm = viewModel.SearchTerm; } if (!string.IsNullOrEmpty(viewModel.ErrorToggle)) { request.ErrorToggle = "Errors"; } if (viewModel.ProviderType != null && viewModel.ProviderType.Any()) { request.Filters.Add("providerType", viewModel.ProviderType); } if (viewModel.ProviderSubType != null && viewModel.ProviderSubType.Any()) { request.Filters.Add("providerSubType", viewModel.ProviderSubType); } if (viewModel.ResultsStatus != null && viewModel.ResultsStatus.Any()) { request.Filters.Add("resultsStatus", viewModel.ResultsStatus); } if (viewModel.ResultsStatus != null && viewModel.LocalAuthority.Any()) { request.Filters.Add("localAuthority", viewModel.LocalAuthority); } if (!string.IsNullOrEmpty(viewModel.CalculationId)) { request.Filters.Add("calculationId", new[] { viewModel.CalculationId }); } CalculationProviderResultSearchResultViewModel searchResults = await _calculationProviderResultsSearchService.PerformSearch(request); CalculationProviderResultSearchResultViewModel result = searchResults; if (result != null) { return(Ok(result)); } return(new InternalServerErrorResult($"Find provider results HTTP request failed")); }
public async Task <CalculationProviderResultSearchResultViewModel> 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, ErrorToggle = string.IsNullOrWhiteSpace(request.ErrorToggle) ? (bool?)null : (request.ErrorToggle == "Errors" ? true : false), Filters = request.Filters }; if (request.PageNumber.HasValue && request.PageNumber.Value > 0) { requestOptions.Page = request.PageNumber.Value; } PagedResult <CalculationProviderResultSearchResultItem> searchRequestResult = await _resultsClient.FindCalculationProviderResults(requestOptions); if (searchRequestResult == null) { _logger.Error("Find providers HTTP request failed"); return(null); } CalculationProviderResultSearchResultViewModel result = new CalculationProviderResultSearchResultViewModel { TotalResults = searchRequestResult.TotalItems, CurrentPage = searchRequestResult.PageNumber, TotalErrorResults = searchRequestResult.TotalErrorItems }; List <SearchFacetViewModel> searchFacets = new List <SearchFacetViewModel>(); if (searchRequestResult.Facets != null) { foreach (SearchFacet facet in searchRequestResult.Facets) { searchFacets.Add(_mapper.Map <SearchFacetViewModel>(facet)); } } result.Facets = searchFacets.AsEnumerable(); List <CalculationProviderResultSearchResultItemViewModel> itemResults = new List <CalculationProviderResultSearchResultItemViewModel>(); foreach (CalculationProviderResultSearchResultItem searchresult in searchRequestResult.Items) { itemResults.Add(_mapper.Map <CalculationProviderResultSearchResultItemViewModel>(searchresult)); } result.CalculationProviderResults = 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 > searchRequestResult.TotalItems) { result.EndItemNumber = searchRequestResult.TotalItems; } result.PagerState = new PagerState(requestOptions.Page, searchRequestResult.TotalPages, 4); return(result); }