public async Task PerformSearch_FirstSearchResultReturnedCorrectly() { // Arrange IDatasetsApiClient datasetClient = Substitute.For <IDatasetsApiClient>(); ILogger logger = Substitute.For <ILogger>(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); IDatasetSearchService datasetSearchService = new DatasetSearchService(datasetClient, mapper, logger); int numberOfItems = 25; ApiResponse <SearchResults <DatasetIndex> > itemResult = GenerateSearchResult(numberOfItems); datasetClient .SearchDatasets(Arg.Any <SearchModel>()) .Returns(itemResult); SearchRequestViewModel request = new SearchRequestViewModel(); // Act DatasetSearchResultViewModel results = await datasetSearchService.PerformSearch(request); // Assert DatasetSearchResultItemViewModel first = results.Datasets.First(); first.Should().NotBeNull(); first.Id.Should().Be("10"); first.Status.Should().Be("Unknown"); first.LastUpdated.Should().Be(new DateTime(2018, 2, 6, 15, 31, 0)); first.Name.Should().Be("Dataset 1"); }
public void PerformSearch_WhenFindDatasetsServiceUnavailable_ThenHttpExceptionThrown() { // Arrange IDatasetsApiClient datasetClient = Substitute.For <IDatasetsApiClient>(); ILogger logger = Substitute.For <ILogger>(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); IFeatureToggle featureToggle = CreateFeatureToggle(); IDatasetSearchService datasetSearchService = new DatasetSearchService(datasetClient, mapper, logger, featureToggle); datasetClient .When(a => a.FindDatasets(Arg.Any <SearchFilterRequest>())) .Do(x => { throw new HttpRequestException(); }); SearchRequestViewModel request = new SearchRequestViewModel(); // Act Action pageAction = new Action(() => { DatasetSearchResultViewModel result = datasetSearchService.PerformSearch(request).Result; }); // Assert pageAction.Should().Throw <HttpRequestException>(); }
public async Task PerformSearch_StartAndEndItemsNumbersDisplayedCorrectlyOnSecondPageOfItemsWithMorePagesAvailable() { // Arrange IDatasetsApiClient datasetClient = Substitute.For <IDatasetsApiClient>(); ILogger logger = Substitute.For <ILogger>(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); IDatasetSearchService datasetSearchService = new DatasetSearchService(datasetClient, mapper, logger); int numberOfItems = 50; ApiResponse <SearchResults <DatasetIndex> > itemResult = GenerateSearchResult(numberOfItems); itemResult.Content.TotalCount = 175; datasetClient .SearchDatasets(Arg.Any <SearchModel>()) .Returns(itemResult); SearchRequestViewModel request = new SearchRequestViewModel() { PageNumber = 2, PageSize = 50 }; // Act DatasetSearchResultViewModel results = await datasetSearchService.PerformSearch(request); // Assert results.StartItemNumber.Should().Be(51); results.EndItemNumber.Should().Be(100); }
public async Task OnGetAsync_WhenOperationTypeisSpecifiedButNoOperationId_ThenPreconditionFailedReturned() { //Arrange IDatasetSearchService searchService = CreateSearchService(); DatasetSearchResultViewModel searchResult = new DatasetSearchResultViewModel() { CurrentPage = 2, EndItemNumber = 0, Facets = new List <SearchFacetViewModel>(), PagerState = new PagerState(1, 1), Datasets = new List <DatasetSearchResultItemViewModel>(), StartItemNumber = 1, TotalResults = 0 }; searchService .PerformSearch(Arg.Any <SearchRequestViewModel>()) .Returns(searchResult); ManageDatasetsPageModel DatasetModel = CreateDatasetPageModel(searchService); //Act IActionResult result = await DatasetModel.OnGetAsync(null, null, DatasetPageBannerOperationType.DatasetUpdated, null); //Assert result .Should() .BeOfType <PreconditionFailedResult>() .Which .Value .Should() .Be("Operation ID not provided"); }
public async Task OnGetAsync_WhenOperationTypeIsDatasetUpdatedAndDatasetVersionByDatasetIdIsNotReturned_ThenInternalServerErrorResult() { //Arrange IDatasetSearchService searchService = CreateSearchService(); DatasetSearchResultViewModel searchResult = new DatasetSearchResultViewModel() { CurrentPage = 2, EndItemNumber = 0, Facets = new List <SearchFacetViewModel>(), PagerState = new PagerState(1, 1), Datasets = new List <DatasetSearchResultItemViewModel>(), StartItemNumber = 1, TotalResults = 0 }; searchService .PerformSearch(Arg.Any <SearchRequestViewModel>()) .Returns(searchResult); ManageDatasetsPageModel DatasetModel = CreateDatasetPageModel(searchService); //Act IActionResult result = await DatasetModel.OnGetAsync(null, null, DatasetPageBannerOperationType.DatasetUpdated, "Dataset1"); //Assert result .Should() .BeOfType <InternalServerErrorResult>() .And .Equals("Dataset API response returned null."); }
public async Task PerformSearch_StartAndEndItemsNumbersDisplayedCorrectlyOnZeroItems() { // Arrange IDatasetsApiClient datasetClient = Substitute.For <IDatasetsApiClient>(); ILogger logger = Substitute.For <ILogger>(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); IDatasetSearchService datasetSearchService = new DatasetSearchService(datasetClient, mapper, logger); int numberOfItems = 0; ApiResponse <SearchResults <DatasetIndex> > itemResult = GenerateSearchResult(numberOfItems); datasetClient .SearchDatasets(Arg.Any <SearchModel>()) .Returns(itemResult); SearchRequestViewModel request = new SearchRequestViewModel(); // Act DatasetSearchResultViewModel results = await datasetSearchService.PerformSearch(request); // Assert results.StartItemNumber.Should().Be(0); results.EndItemNumber.Should().Be(0); }
public async Task PerformSearch_StartAndEndItemsNumbersDisplayedCorrectlyOnSecondPageOfItemsWithMorePagesAvailable() { // Arrange IDatasetsApiClient datasetClient = Substitute.For <IDatasetsApiClient>(); ILogger logger = Substitute.For <ILogger>(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); IFeatureToggle featureToggle = CreateFeatureToggle(); IDatasetSearchService datasetSearchService = new DatasetSearchService(datasetClient, mapper, logger, featureToggle); int numberOfItems = 50; PagedResult <DatasetSearchResultItem> itemResult = GeneratePagedResult(numberOfItems); itemResult.PageNumber = 2; itemResult.PageSize = 50; itemResult.TotalItems = 175; datasetClient .FindDatasets(Arg.Any <SearchFilterRequest>()) .Returns(itemResult); SearchRequestViewModel request = new SearchRequestViewModel() { PageNumber = 2, }; // Act DatasetSearchResultViewModel results = await datasetSearchService.PerformSearch(request); // Assert results.StartItemNumber.Should().Be(51); results.EndItemNumber.Should().Be(100); }
public async Task OnGetAsync_WhenOperationTypeIsDatasetCreated_ThenBannerPopulated() { //Arrange IDatasetSearchService searchService = CreateSearchService(); IDatasetsApiClient datasetsApiClient = CreateDatasetApiClient(); DatasetSearchResultViewModel searchResult = new DatasetSearchResultViewModel() { CurrentPage = 2, EndItemNumber = 0, Facets = new List <SearchFacetViewModel>(), PagerState = new PagerState(1, 1), Datasets = new List <DatasetSearchResultItemViewModel>(), StartItemNumber = 1, TotalResults = 0 }; searchService .PerformSearch(Arg.Any <SearchRequestViewModel>()) .Returns(searchResult); ManageDatasetsPageModel DatasetModel = CreateDatasetPageModel(searchService, datasetsApiClient); string datasetId = "Dataset1"; DatasetVersionResponse datasetVersionResponse = CreateDatasetResponseForBannerChecks(datasetId); datasetsApiClient.GetCurrentDatasetVersionByDatasetId(Arg.Any <string>()) .Returns(new ApiResponse <DatasetVersionResponse>(HttpStatusCode.OK, datasetVersionResponse)); //Act IActionResult result = await DatasetModel.OnGetAsync(null, null, DatasetPageBannerOperationType.DatasetCreated, "Dataset1"); //Assert result .Should() .BeOfType <PageResult>(); DatasetModel .PageBanner .Should() .BeEquivalentTo(new PageBannerOperation() { EntityName = "Test Dataset", EntityType = "Data Source", OperationId = "Dataset1", SecondaryActionUrl = "/datasets/updatedataset?datasetId=" + datasetId, CurrentDataSourceRows = datasetVersionResponse.CurrentDataSourceRows, PreviousDataSourceRows = datasetVersionResponse.PreviousDataSourceRows, DisplayOperationActionSummary = true, OperationActionSummaryText = "A new data source with " + datasetVersionResponse.CurrentDataSourceRows + " data rows uploaded", }); }
public async Task <IActionResult> SearchDatasets([FromBody] SearchRequestViewModel request) { Guard.ArgumentNotNull(request, nameof(request)); DatasetSearchResultViewModel result = await _datasetSearchService.PerformSearch(request); if (result != null) { return(Ok(result)); } else { return(new StatusCodeResult(500)); } }
public async Task PerformSearch_GivenIsSearchModeAllEnabledFeatureToggleIdTurnedOn_SearchModeIsAll() { // Arrange IDatasetsApiClient mockDatasetsApiClient = Substitute.For <IDatasetsApiClient>(); ILogger mockLogger = Substitute.For <ILogger>(); IMapper mockMapper = MappingHelper.CreateFrontEndMapper(); IFeatureToggle featureToggle = CreateFeatureToggle(true); IDatasetSearchService datasetSearchService = new DatasetSearchService(mockDatasetsApiClient, mockMapper, mockLogger, featureToggle); // Act DatasetSearchResultViewModel datasetVersionSearchResultViewModel = await datasetSearchService.PerformSearch(new SearchRequestViewModel()); // Assert await mockDatasetsApiClient .Received(1) .FindDatasets(Arg.Is <SearchFilterRequest>(m => m.SearchMode == SearchMode.All)); }
public async Task OnGetAsync_GivenDatasetPageModelSearchTermRequested_ReturnsPageResult() { //Arrange IDatasetSearchService searchService = CreateSearchService(); const string searchTerm = "testTerm"; DatasetSearchResultViewModel searchResult = new DatasetSearchResultViewModel() { CurrentPage = 2, EndItemNumber = 0, Facets = new List <SearchFacetViewModel>(), PagerState = new PagerState(1, 1), Datasets = new List <DatasetSearchResultItemViewModel>(), StartItemNumber = 1, TotalResults = 0 }; searchService .PerformSearch(Arg.Any <SearchRequestViewModel>()) .Returns(searchResult); ManageDatasetsPageModel DatasetModel = CreateDatasetPageModel(searchService); //Act IActionResult result = await DatasetModel.OnGetAsync(2, searchTerm); //Assert result .Should() .BeOfType <PageResult>() .Which .Should() .NotBeNull(); await searchService .Received(1) .PerformSearch(Arg.Is <SearchRequestViewModel>( c => c.PageNumber == 2 && c.SearchTerm == searchTerm)); }
public async Task PerformSearch_FirstSearchResultWithFacets_ReturnedCorrectly() { // Arrange IDatasetsApiClient datasetClient = Substitute.For <IDatasetsApiClient>(); ILogger logger = Substitute.For <ILogger>(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); IFeatureToggle featureToggle = CreateFeatureToggle(); IDatasetSearchService datasetSearchService = new DatasetSearchService(datasetClient, mapper, logger, featureToggle); int numberOfItems = 25; IEnumerable <SearchFacet> facets = new[] { new SearchFacet(), new SearchFacet() }; PagedResult <DatasetSearchResultItem> itemResult = GeneratePagedResult(numberOfItems, facets); datasetClient .FindDatasets(Arg.Any <SearchFilterRequest>()) .Returns(itemResult); SearchRequestViewModel request = new SearchRequestViewModel(); // Act DatasetSearchResultViewModel results = await datasetSearchService.PerformSearch(request); // Assert DatasetSearchResultItemViewModel first = results.Datasets.First(); first.Should().NotBeNull(); first.Id.Should().Be("10"); first.LastUpdated.Should().Be(new DateTime(2018, 2, 6, 15, 31, 0)); first.Status.Should().Be("Unknown"); first.Name.Should().Be("Dataset 1"); results.Facets.Count().Should().Be(2); }
public async Task OnGetAsync_GivenDatasetPerformSearchReturnsNullResults_ThenErrorReturned() { //Arrange IDatasetSearchService searchService = CreateSearchService(); DatasetSearchResultViewModel searchResult = null; searchService .PerformSearch(Arg.Any <SearchRequestViewModel>()) .Returns(searchResult); ManageDatasetsPageModel DatasetModel = CreateDatasetPageModel(searchService); //Act IActionResult result = await DatasetModel.OnGetAsync(null, null); //Assert result .Should() .BeOfType <InternalServerErrorResult>(); InternalServerErrorResult statusCodeResult = result as InternalServerErrorResult; statusCodeResult .StatusCode .Should() .Be(500); statusCodeResult .Value .Should() .Equals("There was an error retrieving data sources from the Search Index."); await searchService .Received(1) .PerformSearch(Arg.Is <SearchRequestViewModel>( c => c.PageNumber == null && c.SearchTerm == null)); }
public async Task PerformSearch_WhenFindDatasetsServiceReturnsNotFound_ThenNullReturned() { // Arrange IDatasetsApiClient datasetClient = Substitute.For <IDatasetsApiClient>(); ILogger logger = Substitute.For <ILogger>(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); IDatasetSearchService datasetSearchService = new DatasetSearchService(datasetClient, mapper, logger); ApiResponse <SearchResults <DatasetIndex> > expectedServiceResult = null; datasetClient .SearchDatasets(Arg.Any <SearchModel>()) .Returns(expectedServiceResult); SearchRequestViewModel request = new SearchRequestViewModel(); // Act DatasetSearchResultViewModel result = await datasetSearchService.PerformSearch(request); // Assert result.Should().BeNull(); }
public async Task PerformSearch_WhenFindDatasetsServiceReturnsNotFound_ThenNullReturned() { // Arrange IDatasetsApiClient datasetClient = Substitute.For <IDatasetsApiClient>(); ILogger logger = Substitute.For <ILogger>(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); IFeatureToggle featureToggle = CreateFeatureToggle(); IDatasetSearchService datasetSearchService = new DatasetSearchService(datasetClient, mapper, logger, featureToggle); PagedResult <DatasetSearchResultItem> expectedServiceResult = null; datasetClient .FindDatasets(Arg.Any <SearchFilterRequest>()) .Returns(expectedServiceResult); SearchRequestViewModel request = new SearchRequestViewModel(); // Act DatasetSearchResultViewModel result = await datasetSearchService.PerformSearch(request); // Assert result.Should().BeNull(); }
public async Task<IActionResult> SearchDatasets([FromBody]DatasetSearchRequestViewModel request) { Guard.ArgumentNotNull(request, nameof(request)); SearchRequestViewModel searchRequest = new SearchRequestViewModel { Filters = new Dictionary<string, string[]>(), ErrorToggle = request.ErrorToggle, FacetCount = request.FacetCount, IncludeFacets = request.IncludeFacets, PageNumber = request.PageNumber, PageSize = request.PageSize, SearchMode = request.SearchMode, SearchTerm = request.SearchTerm }; if (request.FundingStreams?.Length > 0) { searchRequest.Filters.Add("fundingStreamName", request.FundingStreams.ToArray()); } if (request.DataSchemas?.Length > 0) { searchRequest.Filters.Add("definitionName", request.DataSchemas.ToArray()); } DatasetSearchResultViewModel result = await _datasetSearchService.PerformSearch(searchRequest); if (result != null) { return Ok(result); } else { return new StatusCodeResult(500); } }
public async Task <DatasetSearchResultViewModel> 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 <DatasetSearchResultItem> searchRequestResult = await _datasetsClient.FindDatasets(requestOptions); if (searchRequestResult == null) { _logger.Error("Find datasets HTTP request failed"); return(null); } DatasetSearchResultViewModel result = new DatasetSearchResultViewModel { TotalResults = searchRequestResult.TotalItems, CurrentPage = searchRequestResult.PageNumber, }; 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 <DatasetSearchResultItemViewModel> itemResults = new List <DatasetSearchResultItemViewModel>(); foreach (DatasetSearchResultItem searchResult in searchRequestResult.Items) { itemResults.Add(_mapper.Map <DatasetSearchResultItemViewModel>(searchResult)); } result.Datasets = 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); return(result); }
public async Task OnGetAsync_GivenDatasetPageModelPerformSearchReturnsResults_ReturnsPageResult() { //Arrange IDatasetSearchService searchService = CreateSearchService(); DatasetSearchResultViewModel searchResult = new DatasetSearchResultViewModel() { CurrentPage = 1, EndItemNumber = 0, Facets = new List <SearchFacetViewModel>(), PagerState = new PagerState(1, 1), Datasets = new List <DatasetSearchResultItemViewModel>() { new DatasetSearchResultItemViewModel() { Id = "Search1", Name = "Search One", Description = "Description", LastUpdated = new DateTime(2018, 3, 5, 12, 34, 52), Status = "Draft" } }, StartItemNumber = 1, TotalResults = 0 }; searchService .PerformSearch(Arg.Any <SearchRequestViewModel>()) .Returns(searchResult); ManageDatasetsPageModel DatasetModel = CreateDatasetPageModel(searchService); //Act IActionResult result = await DatasetModel.OnGetAsync(null, null); //Assert result .Should() .BeOfType <PageResult>() .Which .Should() .NotBeNull(); DatasetModel .SearchResults .Should() .BeEquivalentTo(new DatasetSearchResultViewModel() { CurrentPage = 1, EndItemNumber = 0, Facets = new List <SearchFacetViewModel>(), PagerState = new PagerState(1, 1), Datasets = new List <DatasetSearchResultItemViewModel>() { new DatasetSearchResultItemViewModel() { Id = "Search1", Name = "Search One", Description = "Description", LastUpdated = new DateTime(2018, 3, 5, 12, 34, 52), Status = "Draft" } }, StartItemNumber = 1, TotalResults = 0 }); await searchService .Received(1) .PerformSearch(Arg.Is <SearchRequestViewModel>( c => c.PageNumber == null && c.SearchTerm == null)); }
public async Task PerformSearch_FirstSearchResultWithFacets_EnsuresFacetsLoadedCorrectly() { // Arrange IDatasetsApiClient datasetClient = Substitute.For <IDatasetsApiClient>(); ILogger logger = Substitute.For <ILogger>(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); IDatasetSearchService datasetSearchService = new DatasetSearchService(datasetClient, 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 } } } }; ApiResponse <SearchResults <DatasetIndex> > itemResult = GenerateSearchResult(numberOfItems, facets); datasetClient .SearchDatasets(Arg.Any <SearchModel>()) .Returns(itemResult); SearchRequestViewModel request = new SearchRequestViewModel(); // Act DatasetSearchResultViewModel results = await datasetSearchService.PerformSearch(request); // Assert DatasetSearchResultItemViewModel first = results.Datasets.First(); first.Should().NotBeNull(); first.Id.Should().Be("10"); first.LastUpdated.Should().Be(new DateTime(2018, 2, 6, 15, 31, 0)); first.Status.Should().Be("Unknown"); first.Name.Should().Be("Dataset 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 <DatasetSearchResultViewModel> PerformSearch(SearchRequestViewModel request) { int pageNumber = Math.Max(1, request.PageNumber.GetValueOrDefault(1)); int pageSize = request.PageSize.GetValueOrDefault(50); SearchModel requestOptions = new SearchModel { PageNumber = pageNumber, Top = pageSize, SearchTerm = request.SearchTerm, IncludeFacets = request.IncludeFacets, Filters = request.Filters, SearchMode = SearchMode.All }; ApiResponse <SearchResults <DatasetIndex> > searchRequestResult = await _datasetsClient.SearchDatasets(requestOptions); if (searchRequestResult == null) { _logger.Error("Find datasets HTTP request failed"); return(null); } SearchResults <DatasetIndex> searchResults = searchRequestResult.Content; DatasetSearchResultViewModel result = new DatasetSearchResultViewModel { TotalResults = searchResults.TotalCount, CurrentPage = pageNumber, }; List <SearchFacetViewModel> searchFacets = new List <SearchFacetViewModel>(); if (searchResults.Facets != null) { foreach (SearchFacet facet in searchResults.Facets) { searchFacets.Add(_mapper.Map <SearchFacetViewModel>(facet)); } } result.Facets = searchFacets.AsEnumerable(); List <DatasetSearchResultItemViewModel> itemResults = new List <DatasetSearchResultItemViewModel>(); foreach (DatasetIndex searchResult in searchResults.Results) { itemResults.Add(_mapper.Map <DatasetSearchResultItemViewModel>(searchResult)); } result.Datasets = 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 > result.TotalResults) { result.EndItemNumber = result.TotalResults; } result.PagerState = new PagerState(pageNumber, (int)Math.Ceiling(result.TotalResults / (double)pageSize)); return(result); }