public void GetForecastByZipCode_GetData_Returns_EmptyOpenWeather() { //Arrange var logger = new Mock <ILogger <IForecastProvider> >(); OpenWeatherForecast openWeatherForecast = new OpenWeatherForecast(); var uriProvider = new Mock <IExternalApiUriProvider>(); Uri uri = new Uri("http://someuri"); uriProvider.Setup(m => m.GetForecastByZipCodeUri(It.IsAny <string>(), It.IsAny <string>())).Returns(uri); var weatherApiRetriever = new Mock <IApiDataRetriever <OpenWeatherForecast> >(); weatherApiRetriever.Setup(m => m.GetData(It.IsAny <Uri>(), It.IsAny <string>())) .ReturnsAsync(openWeatherForecast); var weatherResponseConverter = new Mock <IExternalApiResponseConverter <OpenWeatherForecast, ForecastModel> >(); weatherResponseConverter.Setup(m => m.Convert(It.IsAny <OpenWeatherForecast>())).Throws(new Exception("Invalid input parameter.")); var forecastProvider = new ForecastProvider( logger.Object, weatherApiRetriever.Object, uriProvider.Object, weatherResponseConverter.Object); //Act //Assert Assert.ThrowsAsync <HttpResponseWithStatusCodeException>( () => forecastProvider.GetForecastByZipCode("10247", "de"), "Invalid input parameters."); }
public void GetForecastByCityName_GetData_Returns_ApiError() { //Arrange var logger = new Mock <ILogger <IForecastProvider> >(); var uriProvider = new Mock <IExternalApiUriProvider>(); Uri uri = new Uri("http://someuri"); uriProvider.Setup(m => m.GetForecastByCityUri(It.IsAny <string>(), It.IsAny <string>())).Returns(uri); var weatherApiRetriever = new Mock <IApiDataRetriever <OpenWeatherForecast> >(); weatherApiRetriever.Setup(m => m.GetData(It.IsAny <Uri>(), It.IsAny <string>())) .Throws(new HttpResponseWithStatusCodeException(HttpStatusCode.NotFound, "city not found")); var weatherResponseConverter = new Mock <IExternalApiResponseConverter <OpenWeatherForecast, ForecastModel> >(); var forecastProvider = new ForecastProvider( logger.Object, weatherApiRetriever.Object, uriProvider.Object, weatherResponseConverter.Object); //Act //Assert Assert.ThrowsAsync <HttpResponseWithStatusCodeException>( () => forecastProvider.GetForecastByCityName("berlik", "de"), "Invalid input parameters."); }
public void GetForecastByZipcode_InvalidRequestUri() { //Arrange var logger = new Mock <ILogger <IForecastProvider> >(); OpenWeatherForecast openWeatherForecast = new OpenWeatherForecast(); var weatherApiRetriever = new Mock <IApiDataRetriever <OpenWeatherForecast> >(); weatherApiRetriever.Setup(m => m.GetData(It.IsAny <Uri>(), It.IsAny <string>())) .ReturnsAsync(openWeatherForecast); var uriProvider = new Mock <IExternalApiUriProvider>(); Uri invalidUri = new Uri("http://invaliduri"); uriProvider.Setup(m => m.GetForecastByZipCodeUri(It.IsAny <string>(), It.IsAny <string>())).Returns(invalidUri); var weatherResponseConverter = new Mock <IExternalApiResponseConverter <OpenWeatherForecast, ForecastModel> >(); var forecastProvider = new ForecastProvider( logger.Object, weatherApiRetriever.Object, uriProvider.Object, weatherResponseConverter.Object); //Act var result = forecastProvider.GetForecastByZipCode("10247", "de"); //10247 - Berlin Friedrichshain //Assert Assert.ThrowsAsync <HttpResponseWithStatusCodeException>( () => forecastProvider.GetForecastByZipCode("berlin", "de"), "Invalid input parameters."); }
public async Task FiveDaysForecast_MadridCityNameProvided_ShouldReturnForecast() { var provider = new ForecastProvider(); var forecast = await provider.FindForCityNameAsync("Madrid,ES"); Assert.IsNotNull(forecast); }
public async Task FiveDaysForecast_NoCitynameProvided_ShouldReturnNull() { var provider = new ForecastProvider(); var forecast = await provider.FindForCityNameAsync(string.Empty); Assert.IsNull(forecast); }
public async Task <IActionResult> OnGetAsync() { var dataProvider = new ForecastProvider(); this.Data = await dataProvider.GetWeather(); return(Page()); }
static void Main(string[] args) { IForecastProvider forecastProvider = new ForecastProvider(); DisplayForecast(forecastProvider); forecastProvider = new ExternalLibForecastProviderAdapter(); DisplayForecast(forecastProvider); }
public void GetCurrentForecastByCityName_InvalidInput() { //Arrange var logger = new Mock <ILogger <IForecastProvider> >(); var weatherApiRetriever = new Mock <IApiDataRetriever <OpenWeatherForecast> >(); var uriProvider = new Mock <IExternalApiUriProvider>(); var weatherResponseConverter = new Mock <IExternalApiResponseConverter <OpenWeatherForecast, ForecastModel> >(); var weatherProvider = new ForecastProvider( logger.Object, weatherApiRetriever.Object, uriProvider.Object, weatherResponseConverter.Object); //Act //Assert Assert.ThrowsAsync <HttpResponseWithStatusCodeException>( () => weatherProvider.GetForecastByCityName("", ""), "Invalid input parameters."); }
protected virtual void CheckUpdateItems() { Log(LogType.Log, "start pull items data from walletinvestor.com", 0, 0, StrategyOperation.Connect); List <WalletInvestorDataItem> list = new List <WalletInvestorDataItem>(); double percent = Hour24MinPercent; for (int i = 1; i < 1000; i++) { WebClient wc = new WebClient(); byte[] data = wc.DownloadData(string.Format("https://walletinvestor.com/?sort=-percent_change_24h&page={0}&per-page=100", i)); HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.Load(new MemoryStream(data)); HtmlNode node = doc.DocumentNode.Descendants().FirstOrDefault(n => n.GetAttributeValue("class", "") == "currency-desktop-table kv-grid-table table table-hover table-bordered table-striped table-condensed kv-table-wrap"); if (node == null) { return; } HtmlNode body = node.Element("tbody"); List <HtmlNode> rows = body.Descendants().Where(n => n.GetAttributeValue("data-key", "") != "").ToList(); if (rows.Count == 0) { break; } bool finished = false; for (int ni = 0; ni < rows.Count; ni++) { HtmlNode row = rows[ni]; HtmlNode name = row.Descendants().FirstOrDefault(n => n.GetAttributeValue("data-col-seq", "") == "2"); HtmlNode prices = row.Descendants().FirstOrDefault(n => n.GetAttributeValue("data-col-seq", "") == "3"); HtmlNode change24 = row.Descendants().FirstOrDefault(n => n.GetAttributeValue("data-col-seq", "") == "4"); HtmlNode volume24 = row.Descendants().FirstOrDefault(n => n.GetAttributeValue("data-col-seq", "") == "5"); HtmlNode marketCap = row.Descendants().FirstOrDefault(n => n.GetAttributeValue("data-col-seq", "") == "7"); try { WalletInvestorDataItem item = new WalletInvestorDataItem(); item.Name = name.Descendants().FirstOrDefault(n => n.GetAttributeValue("class", "") == "detail").InnerText.Trim(); item.LastPrice = Convert.ToDouble(CorrectString(prices.Element("a").InnerText)); item.Rise = change24.Element("a").GetAttributeValue("class", "") != "red"; string change = CorrectString(change24.InnerText); item.Change24 = Convert.ToDouble(change); if (item.Change24 < percent) { finished = true; break; } item.Volume = volume24.InnerText.Trim(); item.MarketCap = marketCap.Element("a").InnerText.Trim(); item.ListedOnBinance = BinanceExchange.Default.Tickers.FirstOrDefault(t => t.MarketCurrency == item.Name) != null; item.ListedOnBittrex = BittrexExchange.Default.Tickers.FirstOrDefault(t => t.MarketCurrency == item.Name) != null; item.ListedOnBitmex = BitmexExchange.Default.Tickers.FirstOrDefault(t => t.MarketCurrency == item.Name) != null; if (!item.ListedOnBinance && !item.ListedOnBitmex && !item.ListedOnBittrex) { continue; } list.Add(item); } catch (Exception) { continue; } } if (finished) { break; } } Log(LogType.Success, "pull items data from walletinvestor.com", 0, 0, StrategyOperation.Connect); Log(LogType.Warning, string.Format("found {0} items matched min 24h% and exchanges", list.Count), 0, 0, StrategyOperation.Connect); Log(LogType.Log, "initialize forecast data provider", 0, 0, StrategyOperation.Connect); if (!ForecastProvider.Initialize(this)) { Log(Crypto.Core.Common.LogType.Error, "Cannot initialize forecast provider.", 0, 0, StrategyOperation.Connect); return; } Log(LogType.Success, "initialize forecast data provider", 0, 0, StrategyOperation.Connect); Log(LogType.Log, "get forecast data", 0, 0, StrategyOperation.Connect); List <WalletInvestorDataItem> filtered = new List <WalletInvestorDataItem>(); for (int i = 0; i < list.Count; i++) { var item = list[i]; ForecastProvider.UpdateForecast(this, item); if (item.Forecast7Day >= Day7MinPercent && item.Forecast14Day >= Day14MinPercent && item.Forecast3Month >= Month3MinPercent) { filtered.Add(item); } } for (int fi = 0; fi < filtered.Count; fi++) { var item = filtered[fi]; if (Items.FirstOrDefault(i => i.Name == item.Name) != null) { continue; } Items.Add(item); Log(item); } if (Items.Count == 0) { Log(LogType.Warning, "no items found matched criteria", 0, 0, StrategyOperation.Connect); } Log(LogType.Success, "get forecast data", 0, 0, StrategyOperation.Connect); ForecastProvider.Clear(); LastCheckTime = DateTime.Now; }