public void Start_ScraperUsedToRetrieveAllStockNames_VisitsEachStockIndexPage() { var @lock = new Object(); var stockLetters = new List <string>("a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0-9".Split(',')); this._scraper .Setup(x => x.Scrape(It.IsRegex(@"(?i)^.*?share_map.php\?letter=.*?$"))) .Returns <string>((url) => { lock (@lock) { if (stockLetters.Count > 0) { var stockLetter = Regex.Match(url, @"(?i)^.*?share_map.php\?letter=(.*?)$").Groups[1].Value; CollectionAssert.Contains(stockLetters, stockLetter); stockLetters.Remove(stockLetter); } } return(new ScrapeInfo { FinalUrl = url, Success = true, Content = string.Empty }); }); var receiver = new LiveCharts_co_uk_PriceReceiver(this._scraper.Object, this._stockMarket.Object, 30); receiver.Start((stock) => { }); var stopWatch = new Stopwatch(); stopWatch.Start(); while (stockLetters.Any() && (stopWatch.Elapsed < TimeSpan.FromSeconds(60))) { Thread.Sleep(100); } receiver.Stop(); Assert.IsFalse(stockLetters.Any()); }
public void Start_StopIsCalledAfterManyIterations_RunsPerpetually() { var @lock = new Object(); var stockLetters = new List <string>(); var rerunDetected = false; this._scraper .Setup(x => x.Scrape(It.IsRegex(@"(?i)^.*?share_map.php\?letter=.*?$"))) .Returns <string>((url) => { lock (@lock) { var stockLetter = Regex.Match(url, @"(?i)^.*?share_map.php\?letter=(.*?)$").Groups[1].Value; rerunDetected = rerunDetected || stockLetters.Contains(stockLetter); stockLetters.Add(stockLetter); } return(new ScrapeInfo { FinalUrl = url, Success = true, Content = string.Empty }); }); var receiver = new LiveCharts_co_uk_PriceReceiver(this._scraper.Object, this._stockMarket.Object, 30); receiver.Start((stock) => { }); var stopWatch = new Stopwatch(); stopWatch.Start(); while (!rerunDetected && (stopWatch.Elapsed < TimeSpan.FromSeconds(60))) { Thread.Sleep(100); } receiver.Stop(); Assert.IsTrue(rerunDetected); }
public void Start_WithFilter_CallsFilterForEachStockOnAListPage() { var @lock = new Object(); var completedStockKey = ""; var filterCalls = new Dictionary <string, int>(); var filter = new Mock <IPipelineFilter>(); filter .Setup(x => x.Evaluate(It.IsAny <Stock>())) .Returns <Stock>((stock) => { var key = GetStockKey(stock.Identifier); if (!filterCalls.ContainsKey(key)) { filterCalls.Add(key, 0); } filterCalls[key]++; return(true); }); var receiver = new LiveCharts_co_uk_PriceReceiver(this._scraper.Object, this._stockMarket.Object, filter.Object, 30); var stockPricesGathered = new List <StockPrice>(); // The fact that the receiver has been given a stock price means that all of the stocks // on the associated list page must have been catalogued at this point and therefore the // stock filter must have been applied to all of them. receiver.Start((stockPrice) => { lock (@lock) { if (string.IsNullOrEmpty(completedStockKey)) { receiver.Stop(); completedStockKey = stockPrice.Value.Stock.Identifier.Substring(0, 1).ToLower(); } } }); // Wait for something to happen var stopWatch = new Stopwatch(); stopWatch.Start(); while (string.IsNullOrEmpty(completedStockKey) && (stopWatch.Elapsed < TimeSpan.FromSeconds(120))) { Thread.Sleep(1000); } receiver.Stop(); Assert.IsNotNullOrEmpty(completedStockKey); var listPage = GetStockListPage(completedStockKey); var numberOfStocks = Regex.Matches(listPage, "(?ismx)<span\\sclass\\s?=\\s?[\\\"\\']lookup-one[\\\"\\']").Count; Assert.AreEqual(numberOfStocks, filterCalls[GetStockKey(completedStockKey)]); }