public async Task <List <SearchResult> > GetSearchResultsAsync(string query) { if (string.IsNullOrEmpty(query)) { return(null); } bool googleSearchEnabled; bool bingSearchEnabled; try { googleSearchEnabled = bool.Parse(ConfigurationManager.AppSettings["GoogleSearchEnabled"]); bingSearchEnabled = bool.Parse(ConfigurationManager.AppSettings["BingSearchEnabled"]); } catch (Exception) { return(null); } var searchTasks = new List <Task <List <SearchResult> > >(); var registerTask = new Action <bool, ISearcher>( (flag, searcher) => { if (flag && searcher != null) { searchTasks.Add(searcher.GetSearchResultsAsync(query)); } }); ISearcher googleSearcher = _searcherFactory.CreateGoogleSearcher(); ISearcher bingSearcher = _searcherFactory.CreateBingSearcher(); registerTask(googleSearchEnabled, googleSearcher); registerTask(bingSearchEnabled, bingSearcher); Task <List <SearchResult> > firstExecutedTask; try { firstExecutedTask = await Task.WhenAny(searchTasks); } catch (ArgumentException) { return(null); } List <SearchResult> searchResults = await firstExecutedTask; if (searchResults?.Count() != 0) { _searchRepository.AddSearchResults(searchResults, query); } return(searchResults); }
public void GetSearchResultsAsync_QueryIsValid_ReturnsListOfSearchResults() { //Arrange var query = "Skateboard"; var fakeGoogleSearcher = A.Fake <GoogleSearcher>(); var fakeBingSearcher = A.Fake <BingSearcher>(); var listOfResults = new List <SearchResult>(); listOfResults.Add(new SearchResult { Id = 1111, Link = "www.skateboard.com", Title = "Best skateboards in the world" }); A.CallTo(() => fakeGoogleSearcher.GetSearchResultsAsync(query)) .Returns(listOfResults); A.CallTo(() => fakeBingSearcher.GetSearchResultsAsync(query)) .Returns(listOfResults); int notExpectedResultCount = 0; ConfigurationManager.AppSettings["GoogleSearchEnabled"] = "true"; ConfigurationManager.AppSettings["BingSearchEnabled"] = "true"; ConfigurationManager.AppSettings["BingApiUrl"] = "https://api.cognitive.microsoft.com/bing/v7.0/search"; A.CallTo(() => _searcherFactory.CreateGoogleSearcher()) .Returns(fakeGoogleSearcher); A.CallTo(() => _searcherFactory.CreateBingSearcher()) .Returns(fakeBingSearcher); //Act List <SearchResult> result = _searchService.GetSearchResultsAsync(query).Result; //Assert Assert.IsInstanceOf <List <SearchResult> >(result); Assert.AreNotEqual(result.Count, notExpectedResultCount); }