예제 #1
0
        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);
        }