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.");
        }
Пример #4
0
        public async Task FiveDaysForecast_MadridCityNameProvided_ShouldReturnForecast()
        {
            var provider = new ForecastProvider();
            var forecast = await provider.FindForCityNameAsync("Madrid,ES");

            Assert.IsNotNull(forecast);
        }
Пример #5
0
        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());
        }
Пример #7
0
        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.");
        }
Пример #9
0
        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;
        }