public async Task SearchCalculation_GivenValidModelAndDoesntIncludeGettingFacets_CallsSearchOnce() { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 50 }; SearchResults <CalculationIndex> searchResults = new SearchResults <CalculationIndex>(); ILogger logger = CreateLogger(); ISearchRepository <CalculationIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); //Act IActionResult result = await service.SearchCalculations(model); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(1) .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()); }
public async Task SearchCalculation_GivenPageTopIsZero_LogsAndReturnsBadRequest() { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 0 }; ILogger logger = CreateLogger(); ISearchRepository <CalculationIndex> searchRepository = CreateSearchRepository(); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); //Act IActionResult result = await service.SearchCalculations(model); //Assert logger .Received(1) .Error("A null or invalid search model was provided for searching calculations"); result .Should() .BeOfType <BadRequestObjectResult>(); }
public async Task SearchCalculation_SearchRequestFails_ThenBadRequestReturned() { //Arrange SearchModel model = new SearchModel() { SearchTerm = "SearchTermTest", PageNumber = 1, IncludeFacets = false, Top = 50, }; ILogger logger = CreateLogger(); ISearchRepository <CalculationIndex> searchRepository = CreateSearchRepository(); searchRepository .When(s => s.Search(Arg.Any <string>(), Arg.Any <SearchParameters>())) .Do(x => throw new FailedToQuerySearchException("Test Message", null)); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); //Act IActionResult result = await service.SearchCalculations(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 SearchCalculation_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 <CalculationIndex> searchRepository = CreateSearchRepository(); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); //Act IActionResult result = await service.SearchCalculations(request); //Assert logger .Received(1) .Error("A null or invalid search model was provided for searching calculations"); result .Should() .BeOfType <BadRequestObjectResult>(); }
public async Task SearchCalculation_GivenValidModelWithSpecifiedFacetCount_CallsSearchWithUpdatedFacetCount() { //Arrange SearchModel model = new SearchModel { PageNumber = 10, Top = 50, IncludeFacets = true, FacetCount = 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 <CalculationIndex> searchResults = new SearchResults <CalculationIndex> { Facets = new List <Facet> { new Facet { Name = "allocationLineName" } } }; ILogger logger = CreateLogger(); ISearchRepository <CalculationIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); //Act IActionResult result = await service.SearchCalculations(request); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(1) .Search(Arg.Any <string>(), Arg.Is <SearchParameters>(m => m.Facets[0] == $"allocationLineName,count:50")); }
public async Task SearchCalculation_GivenValidModelWithNullFilterWithMultipleOfSameFilter_ThenSearchIsPerformed() { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 50, IncludeFacets = true, Filters = new Dictionary <string, string[]>() { { "status", 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 <CalculationIndex> searchResults = new SearchResults <CalculationIndex>(); ILogger logger = CreateLogger(); ISearchRepository <CalculationIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); //Act IActionResult result = await service.SearchCalculations(request); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(6) .Search(model.SearchTerm, Arg.Is <SearchParameters>(c => model.Filters.Keys.All(f => c.Filter.Contains(f)) && !string.IsNullOrWhiteSpace(c.Filter) )); }
public async Task SearchCalculationsWithStatusSuppliedDelegatesToOverloadWithSearchModelParameter() { string searchTerm = NewRandomString(); string specificationId = NewRandomString(); int page = NewRandomNumberBetween(1, 100); CalculationType calculationType = NewRandomEnum <CalculationType>(); PublishStatus status = NewRandomEnum <PublishStatus>(); SearchResults <CalculationIndex> searchResults = new SearchResults <CalculationIndex>(); ILogger logger = CreateLogger(); ISearchRepository <CalculationIndex> searchRepository = CreateSearchRepository(); string expectedSearchFilter = $"(status eq '{status}') and (specificationId eq '{specificationId}') and (calculationType eq '{calculationType}')"; searchRepository .Search(searchTerm, Arg.Is <SearchParameters>(_ => _.SearchMode == SearchMode.All && _.SearchFields != null && _.SearchFields.SequenceEqual(new [] { "name" }) && _.Filter == expectedSearchFilter && _.IncludeTotalResultCount && _.QueryType == QueryType.Full && _.Top == 50 && _.Skip == (page - 1) * 50)) .Returns(searchResults); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); OkObjectResult result = await service.SearchCalculations(specificationId, calculationType, status, searchTerm, page) as OkObjectResult; result? .Value .Should() .BeOfType <CalculationSearchResults>(); await searchRepository .Received(1) .Search(searchTerm, Arg.Is <SearchParameters>(_ => _.SearchMode == SearchMode.All && _.Filter == expectedSearchFilter && _.SearchFields != null && _.SearchFields.SequenceEqual(new [] { "name" }) && _.IncludeTotalResultCount && _.QueryType == QueryType.Full && _.Top == 50 && _.Skip == (page - 1) * 50)); }
public async Task SearchCalculation_GivenValidModelAndPageNumber10_CallsSearchWithCorrectSkipValue() { //Arrange const int skipValue = 450; SearchModel model = new SearchModel { PageNumber = 10, 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 <CalculationIndex> searchResults = new SearchResults <CalculationIndex>(); ILogger logger = CreateLogger(); ISearchRepository <CalculationIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); //Act IActionResult result = await service.SearchCalculations(request); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(1) .Search(Arg.Any <string>(), Arg.Is <SearchParameters>(m => m.Skip == skipValue)); }
public async Task SearchCalculation_GivenValidModelWithNullFilters_ThenSearchIsStillPerformed() { //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); SearchResults <CalculationIndex> searchResults = new SearchResults <CalculationIndex>(); ILogger logger = CreateLogger(); ISearchRepository <CalculationIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); //Act IActionResult result = await service.SearchCalculations(request); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(7) .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()); }
public async Task SearchCalculation_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 <CalculationIndex> searchRepository = CreateSearchRepository(); searchRepository .When(s => s.Search(Arg.Any <string>(), Arg.Any <SearchParameters>())) .Do(x => { throw new FailedToQuerySearchException("Test Message", null); }); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); //Act IActionResult result = await service.SearchCalculations(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 SearchCalculation_GivenValidModel_CallsSearchWithCorrectSkipValue() { //Arrange SearchModel model = new SearchModel { PageNumber = 10, Top = 50, IncludeFacets = true }; SearchResults <CalculationIndex> searchResults = new SearchResults <CalculationIndex> { Facets = new List <Facet> { new Facet { Name = "allocationLineName" } } }; ILogger logger = CreateLogger(); ISearchRepository <CalculationIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); //Act IActionResult result = await service.SearchCalculations(model); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(4) .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()); }
public async Task SearchCalculation_GivenNullSearchModel_LogsAndCreatesDefaultSearcModel() { //Arrange ILogger logger = CreateLogger(); ISearchRepository <CalculationIndex> searchRepository = CreateSearchRepository(); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); //Act IActionResult result = await service.SearchCalculations(null); //Assert logger .Received(1) .Error("A null or invalid search model was provided for searching calculations"); result .Should() .BeOfType <BadRequestObjectResult>(); }
public async Task SearchCalculation_GivenValidModelAndPageNumber10_CallsSearchWithCorrectSkipValue() { //Arrange const int skipValue = 450; SearchModel model = new SearchModel { PageNumber = 10, Top = 50 }; SearchResults <CalculationIndex> searchResults = new SearchResults <CalculationIndex>(); ILogger logger = CreateLogger(); ISearchRepository <CalculationIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); //Act IActionResult result = await service.SearchCalculations(model); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(1) .Search(Arg.Any <string>(), Arg.Is <SearchParameters>(m => m.Skip == skipValue)); }
public async Task SearchCalculation_GivenValidModelWithNullFilters_ThenSearchIsStillPerformed() { //Arrange SearchModel model = new SearchModel { PageNumber = 1, Top = 50, IncludeFacets = true, Filters = null, }; SearchResults <CalculationIndex> searchResults = new SearchResults <CalculationIndex>(); ILogger logger = CreateLogger(); ISearchRepository <CalculationIndex> searchRepository = CreateSearchRepository(); searchRepository .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()) .Returns(searchResults); CalculationSearchService service = CreateCalculationSearchService(logger: logger, serachRepository: searchRepository); //Act IActionResult result = await service.SearchCalculations(model); //Assert result .Should() .BeOfType <OkObjectResult>(); await searchRepository .Received(4) .Search(Arg.Any <string>(), Arg.Any <SearchParameters>()); }
public async Task SearchCalculation_GivenValidModelWithSpecifiedFacetCountOf1001_ReturnsBadRequest() { //Arrange SearchModel model = new SearchModel { PageNumber = 10, Top = 50, IncludeFacets = true, FacetCount = 1001 }; 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); CalculationSearchService service = CreateCalculationSearchService(); //Act IActionResult result = await service.SearchCalculations(request); //Assert result .Should() .BeOfType <BadRequestObjectResult>() .Which .Value .Should() .Be("An invalid facet count was specified"); }