public async Task SearchDatasetDefinition_GivenValidModelAndDoesntIncludeGettingFacets_CallsSearchOnce() { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 50 }; SearchResults <DatasetDefinitionIndex> searchResults = new SearchResults <DatasetDefinitionIndex>(); ILogger logger = CreateLogger(); ISearchRepository <DatasetDefinitionIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); DatasetDefinitionSearchService service = CreateDatasetSearchService(logger: logger, searchRepository: searchRepository); //Act IActionResult result = await service.SearchDatasetDefinitions(model); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(1) .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()); }
public async Task SearchDatasetDefinition_GivenPageTopIsZero_LogsAndReturnsBadRequest() { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 0 }; ILogger logger = CreateLogger(); ISearchRepository <DatasetDefinitionIndex> searchRepository = CreateSearchRepository(); DatasetDefinitionSearchService service = CreateDatasetSearchService(logger: logger, searchRepository: searchRepository); //Act IActionResult result = await service.SearchDatasetDefinitions(model); //Assert logger .Received(1) .Error("A null or invalid search model was provided for searching datasets"); result .Should() .BeOfType <BadRequestObjectResult>(); }
public async Task PerformSearch_GivenFindDatasetDefinitionsServiceReturnsNotFound_ThenNullReturned() { // Arrange IDatasetsApiClient apiClient = CreateApiClient(); ILogger logger = CreateLogger(); IMapper mapper = CreateMapper(); DatasetDefinitionSearchService searchService = CreateSearchService(apiClient, mapper, logger); PagedResult <DatasetDefinitionSearchResultItem> expectedServiceResult = null; apiClient .FindDatasetDefinitions(Arg.Any <SearchFilterRequest>()) .Returns(expectedServiceResult); SearchRequestViewModel request = new SearchRequestViewModel(); // Act DatasetDefinitionSearchResultViewModel result = await searchService.PerformSearch(request); // Assert result .Should() .BeNull(); }
public async Task SearchDatasetDefinition_GivenPageNumberIsZero_LogsAndReturnsBadRequest() { //Arrange SearchModel model = new SearchModel(); string json = JsonConvert.SerializeObject(model); byte[] byteArray = Encoding.UTF8.GetBytes(json); MemoryStream stream = new MemoryStream(byteArray); HttpRequest request = Substitute.For <HttpRequest>(); request .Body .Returns(stream); ILogger logger = CreateLogger(); ISearchRepository <DatasetDefinitionIndex> searchRepository = CreateSearchRepository(); DatasetDefinitionSearchService service = CreateDatasetSearchService(logger: logger, searchRepository: searchRepository); //Act IActionResult result = await service.SearchDatasetDefinitions(request); //Assert logger .Received(1) .Error("A null or invalid search model was provided for searching datasets"); result .Should() .BeOfType <BadRequestObjectResult>(); }
public async Task SearchDatasetDefinition_SearchRequestFails_ThenBadRequestReturned() { //Arrange SearchModel model = new SearchModel() { SearchTerm = "SearchTermTest", PageNumber = 1, IncludeFacets = false, Top = 50, }; ILogger logger = CreateLogger(); ISearchRepository <DatasetDefinitionIndex> searchRepository = CreateSearchRepository(); searchRepository .When(s => s.Search(Arg.Any <string>(), Arg.Any <SearchParameters>())) .Do(x => { throw new FailedToQuerySearchException("Test Message", null); }); DatasetDefinitionSearchService service = CreateDatasetSearchService(logger: logger, searchRepository: searchRepository); //Act IActionResult result = await service.SearchDatasetDefinitions(model); //Assert logger .Received(1) .Error(Arg.Any <FailedToQuerySearchException>(), "Failed to query search with term: SearchTermTest"); result .Should() .BeOfType <StatusCodeResult>() .Which.StatusCode.Should().Be(500); }
public async Task SearchDatasetDefinition_GivenValidModel_CallsSearchWithCorrectSkipValue() { //Arrange SearchModel model = new SearchModel { PageNumber = 10, Top = 50, IncludeFacets = true }; string json = JsonConvert.SerializeObject(model); byte[] byteArray = Encoding.UTF8.GetBytes(json); MemoryStream stream = new MemoryStream(byteArray); HttpRequest request = Substitute.For <HttpRequest>(); request .Body .Returns(stream); SearchResults <DatasetDefinitionIndex> searchResults = new SearchResults <DatasetDefinitionIndex> { Facets = new List <Facet> { new Facet { Name = "specificationNames" } } }; ILogger logger = CreateLogger(); ISearchRepository <DatasetDefinitionIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); DatasetDefinitionSearchService service = CreateDatasetSearchService(logger: logger, searchRepository: searchRepository); //Act IActionResult result = await service.SearchDatasetDefinitions(request); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(2) .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()); }
public async Task SearchDatasetDefinition_GivenValidModelWithNullFilterWithMultipleOfSameFilter_ThenSearchIsPerformed() { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 50, IncludeFacets = true, Filters = new Dictionary <string, string[]>() { { "providerIdentifier", new string [] { "test", "" } } }, SearchTerm = "testTerm", }; string json = JsonConvert.SerializeObject(model); byte[] byteArray = Encoding.UTF8.GetBytes(json); MemoryStream stream = new MemoryStream(byteArray); HttpRequest request = Substitute.For <HttpRequest>(); request .Body .Returns(stream); SearchResults <DatasetDefinitionIndex> searchResults = new SearchResults <DatasetDefinitionIndex>(); ILogger logger = CreateLogger(); ISearchRepository <DatasetDefinitionIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); DatasetDefinitionSearchService service = CreateDatasetSearchService(logger: logger, searchRepository: searchRepository); //Act IActionResult result = await service.SearchDatasetDefinitions(request); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(1) .Search(model.SearchTerm, Arg.Is <SearchParameters>(c => model.Filters.Keys.All(f => c.Filter.Contains(f)) && !string.IsNullOrWhiteSpace(c.Filter) )); }
public async Task SearchDatasetDefinition_GivenValidModelAndPageNumber2_CallsSearchWithCorrectSkipValue() { //Arrange const int skipValue = 50; SearchModel model = new SearchModel { PageNumber = 2, Top = 50 }; string json = JsonConvert.SerializeObject(model); byte[] byteArray = Encoding.UTF8.GetBytes(json); MemoryStream stream = new MemoryStream(byteArray); HttpRequest request = Substitute.For <HttpRequest>(); request .Body .Returns(stream); SearchResults <DatasetDefinitionIndex> searchResults = new SearchResults <DatasetDefinitionIndex>(); ILogger logger = CreateLogger(); ISearchRepository <DatasetDefinitionIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); DatasetDefinitionSearchService service = CreateDatasetSearchService(logger: logger, searchRepository: searchRepository); //Act IActionResult result = await service.SearchDatasetDefinitions(request); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(1) .Search(Arg.Any <string>(), Arg.Is <SearchParameters>(m => m.Skip == skipValue)); }
public async Task SearchDatasetDefinition_SearchRequestFails_ThenBadRequestReturned() { //Arrange SearchModel model = new SearchModel() { SearchTerm = "SearchTermTest", PageNumber = 1, IncludeFacets = false, Top = 50, }; string json = JsonConvert.SerializeObject(model); byte[] byteArray = Encoding.UTF8.GetBytes(json); MemoryStream stream = new MemoryStream(byteArray); HttpRequest request = Substitute.For <HttpRequest>(); request .Body .Returns(stream); ILogger logger = CreateLogger(); ISearchRepository <DatasetDefinitionIndex> searchRepository = CreateSearchRepository(); searchRepository .When(s => s.Search(Arg.Any <string>(), Arg.Any <SearchParameters>())) .Do(x => { throw new FailedToQuerySearchException("Test Message", null); }); DatasetDefinitionSearchService service = CreateDatasetSearchService(logger: logger, searchRepository: searchRepository); //Act IActionResult result = await service.SearchDatasetDefinitions(request); //Assert logger .Received(1) .Error(Arg.Any <FailedToQuerySearchException>(), "Failed to query search with term: SearchTermTest"); result .Should() .BeOfType <StatusCodeResult>() .Which.StatusCode.Should().Be(500); }
public async Task PerformSearch_GivenIsSearchModeAllEnabledFeatureToggleIdTurnedOff_SearchModeIsAny() { // Arrange IDatasetsApiClient apiClient = CreateApiClient(); DatasetDefinitionSearchService searchService = CreateSearchService(apiClient); SearchRequestViewModel request = new SearchRequestViewModel(); // Act DatasetDefinitionSearchResultViewModel result = await searchService.PerformSearch(request); // Assert await apiClient .Received(1) .FindDatasetDefinitions(Arg.Is <SearchFilterRequest>(m => m.SearchMode == SearchMode.Any)); }
public async Task SearchDatasetDefinition_GivenValidModel_CallsSearchWithCorrectSkipValue() { //Arrange SearchModel model = new SearchModel { PageNumber = 10, Top = 50, IncludeFacets = true }; SearchResults <DatasetDefinitionIndex> searchResults = new SearchResults <DatasetDefinitionIndex> { Facets = new List <Facet> { new Facet { Name = "specificationNames" } } }; ILogger logger = CreateLogger(); ISearchRepository <DatasetDefinitionIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); DatasetDefinitionSearchService service = CreateDatasetSearchService(logger: logger, searchRepository: searchRepository); //Act IActionResult result = await service.SearchDatasetDefinitions(model); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(4) .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()); }
public async Task SearchDatasetDefinition_GivenValidModelWithNullFilterWithMultipleOfSameFilter_ThenSearchIsPerformed() { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 50, IncludeFacets = true, Filters = new Dictionary <string, string[]>() { { "providerIdentifier", new string [] { "test", "" } } }, SearchTerm = "testTerm", }; SearchResults <DatasetDefinitionIndex> searchResults = new SearchResults <DatasetDefinitionIndex>(); ILogger logger = CreateLogger(); ISearchRepository <DatasetDefinitionIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); DatasetDefinitionSearchService service = CreateDatasetSearchService(logger: logger, searchRepository: searchRepository); //Act IActionResult result = await service.SearchDatasetDefinitions(model); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(3) .Search(model.SearchTerm, Arg.Is <SearchParameters>(c => model.Filters.Keys.All(f => c.Filter.Contains(f)) && !string.IsNullOrWhiteSpace(c.Filter) )); }
public async Task SearchDatasetDefinition_GivenNullSearchModel_LogsAndCreatesDefaultSearchModel() { //Arrange ILogger logger = CreateLogger(); ISearchRepository <DatasetDefinitionIndex> searchRepository = CreateSearchRepository(); DatasetDefinitionSearchService service = CreateDatasetSearchService(logger: logger, searchRepository: searchRepository); //Act IActionResult result = await service.SearchDatasetDefinitions(null); //Assert logger .Received(1) .Error("A null or invalid search model was provided for searching datasets"); result .Should() .BeOfType <BadRequestObjectResult>(); }
public async Task PerformSearch_GivenFirstSearchResultReturnedCorrectly_EnsuresResult() { // Arrange IDatasetsApiClient apiClient = CreateApiClient(); ILogger logger = CreateLogger(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); DatasetDefinitionSearchService searchService = CreateSearchService(apiClient, mapper, logger); int numberOfItems = 25; PagedResult <DatasetDefinitionSearchResultItem> itemResult = GeneratePagedResult(numberOfItems); apiClient .FindDatasetDefinitions(Arg.Any <SearchFilterRequest>()) .Returns(itemResult); SearchRequestViewModel request = new SearchRequestViewModel(); // Act DatasetDefinitionSearchResultViewModel results = await searchService.PerformSearch(request); // Assert results .DatasetDefinitions .First() .Should() .BeEquivalentTo(new DatasetDefinitionSearchResultItemViewModel() { Id = "10", Description = "Description 0", LastUpdatedDate = new DateTimeOffset(2018, 1, 2, 3, 4, 0, TimeSpan.Zero), Name = "ds-1", ProviderIdentifier = "Provider 0", }); await apiClient .Received(1) .FindDatasetDefinitions(Arg.Any <SearchFilterRequest>()); }
public void PerformSearch_GivenFindDatasetDefinitionsServiceUnavailable_ThenHttpExceptionThrown() { // Arrange IDatasetsApiClient apiClient = CreateApiClient(); ILogger logger = CreateLogger(); IMapper mapper = CreateMapper(); DatasetDefinitionSearchService searchService = CreateSearchService(apiClient, mapper, logger); apiClient .When(a => a.FindDatasetDefinitions(Arg.Any <SearchFilterRequest>())) .Do(x => { throw new HttpRequestException(); }); SearchRequestViewModel request = new SearchRequestViewModel(); // Act Func <Task> test = () => searchService.PerformSearch(request); // Assert test .Should() .Throw <HttpRequestException>(); }
public async Task SearchDatasetDefinition_GivenValidModelAndPageNumber10_CallsSearchWithCorrectSkipValue() { //Arrange const int skipValue = 450; SearchModel model = new SearchModel { PageNumber = 10, Top = 50 }; SearchResults <DatasetDefinitionIndex> searchResults = new SearchResults <DatasetDefinitionIndex>(); ILogger logger = CreateLogger(); ISearchRepository <DatasetDefinitionIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); DatasetDefinitionSearchService service = CreateDatasetSearchService(logger: logger, searchRepository: searchRepository); //Act IActionResult result = await service.SearchDatasetDefinitions(model); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(1) .Search(Arg.Any <string>(), Arg.Is <SearchParameters>(m => m.Skip == skipValue)); }
public async Task SearchDatasetDefinition_GivenValidModelWithNullFilters_ThenSearchIsStillPerformed() { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 50, IncludeFacets = true, Filters = null, }; SearchResults <DatasetDefinitionIndex> searchResults = new SearchResults <DatasetDefinitionIndex>(); ILogger logger = CreateLogger(); ISearchRepository <DatasetDefinitionIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); DatasetDefinitionSearchService service = CreateDatasetSearchService(logger: logger, searchRepository: searchRepository); //Act IActionResult result = await service.SearchDatasetDefinitions(model); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(4) .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()); }
public async Task PerformSearch_FirstSearchResultWithFacets_EnsuresFacetsLoadedCorrectly() { // Arrange IDatasetsApiClient apiClient = CreateApiClient(); ILogger logger = CreateLogger(); IMapper mapper = MappingHelper.CreateFrontEndMapper(); DatasetDefinitionSearchService searchService = CreateSearchService(apiClient, 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 <DatasetDefinitionSearchResultItem> itemResult = GeneratePagedResult(numberOfItems, facets); apiClient .FindDatasetDefinitions(Arg.Any <SearchFilterRequest>()) .Returns(itemResult); SearchRequestViewModel request = new SearchRequestViewModel(); // Act DatasetDefinitionSearchResultViewModel results = await searchService.PerformSearch(request); // Assert results .DatasetDefinitions .First() .Should() .BeEquivalentTo( new DatasetDefinitionSearchResultItemViewModel() { Id = "10", Description = "Description 0", LastUpdatedDate = new DateTimeOffset(2018, 1, 2, 3, 4, 0, TimeSpan.Zero), Name = "ds-1", ProviderIdentifier = "Provider 0", } ); results .Facets .Should() .BeEquivalentTo(new List <SearchFacetViewModel>() { new SearchFacetViewModel { Name = "facet 1", FacetValues = new[] { new SearchFacetValueViewModel { Name = "f1", Count = 5 } } }, new SearchFacetViewModel { Name = "facet 2", FacetValues = new[] { new SearchFacetValueViewModel { Name = "f2", Count = 11 }, new SearchFacetValueViewModel { Name = "f3", Count = 1 } } } }); await apiClient .Received(1) .FindDatasetDefinitions(Arg.Any <SearchFilterRequest>()); }