public async Task SearchTestScenarioResults_GivenTopIsZero_LogsAndReturnsBadRequest() { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 0 }; ILogger logger = CreateLogger(); ISearchRepository <ProviderCalculationResultsIndex> searchRepository = CreateSearchRepository(); ProviderCalculationResultsSearchService service = CreateTestResultsSearchService(logger, searchRepository); //Act IActionResult result = await service.SearchCalculationProviderResults(model); //Assert logger .Received(1) .Error("A null or invalid search model was provided for searching calculation provider results"); result .Should() .BeOfType <BadRequestObjectResult>(); }
public async Task SearchTestScenarioResults_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 <ProviderCalculationResultsIndex> searchRepository = CreateSearchRepository(); ProviderCalculationResultsSearchService service = CreateTestResultsSearchService(logger, searchRepository); //Act IActionResult result = await service.SearchCalculationProviderResults(request); //Assert logger .Received(1) .Error("A null or invalid search model was provided for searching calculation provider results"); result .Should() .BeOfType <BadRequestObjectResult>(); }
public async Task SearchTestScenarioResults_GivenValidModelWithOneFilter_ThenSearchIsPerformed( bool useCalculationId, string idFilterName, params string[] searchFields) { string[] expectedFacetSearchFields = searchFields.IsNullOrEmpty() ? new[] { "providerName" } : searchFields; //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 50, IncludeFacets = true, SearchFields = searchFields ?? new string[0], Filters = new Dictionary <string, string[]>() { { idFilterName, new[] { "test" } } }, SearchTerm = "testTerm", }; ILogger logger = CreateLogger(); SearchResults <ProviderCalculationResultsIndex> searchResults = new SearchResults <ProviderCalculationResultsIndex>(); ISearchRepository <ProviderCalculationResultsIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>(), Arg.Any <bool>()) .Returns(searchResults); ProviderCalculationResultsSearchService service = CreateTestResultsSearchService(logger, searchRepository); //Act IActionResult result = await service.SearchCalculationProviderResults(model, useCalculationId); //Assert result .Should() .BeOfType <OkObjectResult>(); int expectedFacetsSearchCount = expectedFacetSearchFields.SequenceEqual(searchFields ?? ArraySegment <string> .Empty) ? ProviderCalculationResultsFacetCount : ProviderCalculationResultsFacetCount - 1; //facet search await searchRepository .Received(expectedFacetsSearchCount) .Search(model.SearchTerm, Arg.Is <SearchParameters>(c => SearchFiltersMatch(c, model) && SearchFieldsMatch(c.SearchFields, expectedFacetSearchFields) )); }
public async Task SearchTestScenarioResults_GivenValidModelWithOneFilterAndOverrridesFacets_ThenSearchIsPerformedWithTwoFilters() { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 50, IncludeFacets = true, Filters = new Dictionary <string, string[]>() { { "calculationId", new string [] { "test" } } }, SearchTerm = "testTerm", OverrideFacetFields = new[] { "providerId", "calculationId" } }; 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(); SearchResults <ProviderCalculationResultsIndex> searchResults = new SearchResults <ProviderCalculationResultsIndex>(); ISearchRepository <ProviderCalculationResultsIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>(), Arg.Any <bool>()) .Returns(searchResults); ProviderCalculationResultsSearchService service = CreateTestResultsSearchService(logger, searchRepository); //Act IActionResult result = await service.SearchCalculationProviderResults(request); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(2) .Search(model.SearchTerm, Arg.Is <SearchParameters>(c => model.Filters.Keys.All(f => c.Filter.Contains(f)) && !string.IsNullOrWhiteSpace(c.Filter) )); }
public async Task SearchTestScenarioResults_GivenValidModelAndIncludesGettingFacetsAndFiltersIsNull_PerformsSearch() { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 50, IncludeFacets = true, Filters = null, }; 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(); SearchResults <ProviderCalculationResultsIndex> searchResults = new SearchResults <ProviderCalculationResultsIndex>(); ISearchRepository <ProviderCalculationResultsIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>(), Arg.Any <bool>()) .Returns(searchResults); ProviderCalculationResultsSearchService service = CreateTestResultsSearchService(logger, searchRepository); //Act IActionResult result = await service.SearchCalculationProviderResults(request); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(model.FacetCount) .Search(Arg.Any <string>(), Arg.Is <SearchParameters>(c => c.SearchFields.Any(f => f == "providerName"))); }
public async Task SearchCalculationProviderResults_GivenSearchRequestFails_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 <ProviderCalculationResultsIndex> searchRepository = CreateSearchRepository(); searchRepository .When(s => s.Search(Arg.Any <string>(), Arg.Any <SearchParameters>())) .Do(x => { throw new FailedToQuerySearchException("Test Message", null); }); ProviderCalculationResultsSearchService service = CreateTestResultsSearchService(logger, searchRepository); //Act IActionResult result = await service.SearchCalculationProviderResults(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 SearchTestScenarioResults_GivenValidModelWithOneFilterAndOverrridesFacets_ThenSearchIsPerformedWithTwoFilters( bool useCalculationId, string filterName) { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 50, IncludeFacets = true, Filters = new Dictionary <string, string[]>() { { filterName, new string [] { "test" } } }, SearchTerm = "testTerm", OverrideFacetFields = new[] { "providerId", filterName } }; ILogger logger = CreateLogger(); SearchResults <ProviderCalculationResultsIndex> searchResults = new SearchResults <ProviderCalculationResultsIndex>(); ISearchRepository <ProviderCalculationResultsIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>(), Arg.Any <bool>()) .Returns(searchResults); ProviderCalculationResultsSearchService service = CreateTestResultsSearchService(logger, searchRepository); //Act IActionResult result = await service.SearchCalculationProviderResults(model, useCalculationId); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(2) .Search(model.SearchTerm, Arg.Is <SearchParameters>(c => model.Filters.Keys.All(f => c.Filter.Contains(f)) && !string.IsNullOrWhiteSpace(c.Filter) )); }
public async Task SearchTestScenarioResults_GivenValidModelAndIncludesGettingFacets_CallsSearchCorrectNumberOfTimes( bool useCalculationId, string idFilterName) { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 50, IncludeFacets = true, Filters = new Dictionary <string, string[]>() { { idFilterName, new string [] { "test" } } } }; ILogger logger = CreateLogger(); SearchResults <ProviderCalculationResultsIndex> searchResults = new SearchResults <ProviderCalculationResultsIndex>(); ISearchRepository <ProviderCalculationResultsIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>(), Arg.Any <bool>()) .Returns(searchResults); ProviderCalculationResultsSearchService service = CreateTestResultsSearchService(logger, searchRepository); //Act IActionResult result = await service.SearchCalculationProviderResults(model, useCalculationId); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(ProviderCalculationResultsFacetCount + 1) .Search(Arg.Any <string>(), Arg.Is <SearchParameters>(c => c.SearchFields.Any(f => f == "providerName"))); await searchRepository .Received(1) .Search(Arg.Any <string>(), Arg.Is <SearchParameters>(c => c.SearchFields.Any(f => f == "providerName") && c.SearchFields.Any(f => f == "ukPrn") && c.SearchFields.Any(f => f == "urn") && c.SearchFields.Any(f => f == "establishmentNumber"))); }
public async Task SearchCalculationProviderResults_GivenNullModel_ReturnsBadRequest() { //Arrange ILogger logger = CreateLogger(); ProviderCalculationResultsSearchService service = CreateTestResultsSearchService(logger: logger); //Act IActionResult result = await service.SearchCalculationProviderResults(null); //Assert result .Should() .BeOfType <BadRequestObjectResult>(); logger .Received(1) .Error(Arg.Is("A null or invalid search model was provided for searching calculation provider results")); }
public async Task SearchCalculationProviderResults_GivenSearchRequestFails_ThenBadRequestReturned( bool useCalculationId, string idFilterName) { //Arrange SearchModel model = new SearchModel() { SearchTerm = "SearchTermTest", PageNumber = 1, IncludeFacets = false, Top = 50, Filters = new Dictionary <string, string[]>() { { idFilterName, new string [] { "test" } } } }; ILogger logger = CreateLogger(); ISearchRepository <ProviderCalculationResultsIndex> searchRepository = CreateSearchRepository(); searchRepository .When(s => s.Search(Arg.Any <string>(), Arg.Any <SearchParameters>())) .Do(x => { throw new FailedToQuerySearchException("Test Message", null); }); ProviderCalculationResultsSearchService service = CreateTestResultsSearchService(logger, searchRepository); //Act IActionResult result = await service.SearchCalculationProviderResults(model, useCalculationId); //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 SearchTestScenarioResults_GivenValidModelAndIncludesGettingFacetsAndFiltersIsNull_PerformsSearch() { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 50, IncludeFacets = true, Filters = null, }; ILogger logger = CreateLogger(); SearchResults <ProviderCalculationResultsIndex> searchResults = new SearchResults <ProviderCalculationResultsIndex>(); ISearchRepository <ProviderCalculationResultsIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>(), Arg.Any <bool>()) .Returns(searchResults); ProviderCalculationResultsSearchService service = CreateTestResultsSearchService(logger, searchRepository); //Act IActionResult result = await service.SearchCalculationProviderResults(model); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(ProviderCalculationResultsFacetCount) .Search(Arg.Any <string>(), Arg.Is <SearchParameters>(c => c.SearchFields.Any(f => f == "providerName"))); }