コード例 #1
0
        public async Task GetSingleQuoteData_ShouldReturnQueryResultWithError_WhenErrorSendingRequestWithHttpClient()
        {
            var client = new AlphaVantageClient(_mockHttpFactory.Object, _mockAlphaVantageOptionsAccessor.Object, _mockParserFactory.Object, _mockLogger.Object);

            _mockHttpFactory = new Mock <IHttpClientFactory>();

            var handlerMock = new Mock <HttpMessageHandler>(MockBehavior.Strict);

            handlerMock
            .Protected()
            .Setup <Task <HttpResponseMessage> >(
                "SendAsync",
                ItExpr.IsAny <HttpRequestMessage>(),
                ItExpr.IsAny <CancellationToken>()
                )
            .Throws <Exception>();

            var httpClient = new HttpClient(handlerMock.Object);

            _mockHttpFactory.Setup(x => x.CreateClient(It.IsAny <string>())).Returns(httpClient);

            var query       = new SingleQuoteQuery(-1);
            var queryResult = await client.GetSingleQuoteData(query, "MSFT", "NASDAQ");

            Assert.True(queryResult.HasError);
            Assert.NotNull(queryResult.ErrorMessage);
        }
コード例 #2
0
 public EquitiesPriceCache()
 {
     EquityPrices = new Dictionary <string, EquityPrices>();
     using (var client = new AlphaVantageClient(ApiKey))
     {
         foreach (var supportedEquity in SupportedEquities)
         {
             try
             {
                 var setting = new Dictionary <string, string> {
                     { "symbol", supportedEquity }
                 };
                 var priceFetchTask = client.RequestPureJsonAsync(ApiFunction.TIME_SERIES_DAILY, setting);
                 Task.WaitAll(priceFetchTask);
                 var pricesResult = priceFetchTask.Result;
                 var prices       = JsonConvert.DeserializeObject <EquityPrices>(pricesResult);
                 EquityPrices.Add(supportedEquity, prices);
             }
             catch (Exception ex)
             {
                 Log.Error(ex, "EquitiesPriceCache");
             }
         }
     }
 }
コード例 #3
0
        public async Task GetSingleQuoteData_ShouldReturnSingleQuoteQueryResultWithoutError_WhenSuccessful()
        {
            var singleQuoteData = new SingleQuoteData(
                symbolId: 1,
                ticker: "MSFT",
                high: 1,
                low: 2,
                open: 3,
                previousClose: 4,
                volume: 5,
                change: 6,
                price: 7,
                changePercent: 0.9m,
                lastUpdated: DateTime.UtcNow,
                lastTradingDay: DateTime.UtcNow
                );

            var client = new AlphaVantageClient(_mockHttpFactory.Object, _mockAlphaVantageOptionsAccessor.Object, _mockParserFactory.Object, _mockLogger.Object);

            SetupMockHttpClient("mockData", HttpStatusCode.OK);
            _singleQuoteDataCsvParser.Setup(x => x.ParseJson(-1, It.IsAny <string>())).Returns(singleQuoteData);

            var query       = new SingleQuoteQuery(-1);
            var queryResult = await client.GetSingleQuoteData(query, "MSFT", "NASDAQ");

            Assert.False(queryResult.HasError);
            Assert.Equal("MSFT", queryResult.Data.Ticker);
            Assert.Equal(singleQuoteData.LastUpdated, queryResult.Data.LastUpdated);
        }
コード例 #4
0
        public async Task ReturnSearchResults()
        {
            using var client       = new AlphaVantageClient(_apiKey);
            using var stocksClient = client.Stocks();

            var searchMatches = await stocksClient.SearchSymbolAsync("BA");

            searchMatches.Should().NotBeNull()
            .And.HaveCountGreaterThan(1);

            foreach (var searchMatch in searchMatches)
            {
                searchMatch.Should().NotBeNull()
                .And.Match <SymbolSearchMatch>(sm =>
                                               string.IsNullOrWhiteSpace(sm.Symbol) == false &&
                                               string.IsNullOrWhiteSpace(sm.Name) == false &&
                                               string.IsNullOrWhiteSpace(sm.Type) == false &&
                                               string.IsNullOrWhiteSpace(sm.Region) == false &&
                                               string.IsNullOrWhiteSpace(sm.Timezone) == false &&
                                               string.IsNullOrWhiteSpace(sm.Currency) == false &&
                                               sm.MarketOpen != default &&
                                               sm.MarketClose != default &&
                                               sm.MatchScore <= 1 && sm.MatchScore > 0
                                               );
            }
        }
コード例 #5
0
        public async Task ReturnEmptyCollection_OnMeaninglessKeyword()
        {
            using var client       = new AlphaVantageClient(_apiKey);
            using var stocksClient = client.Stocks();

            var searchMatches = await stocksClient.SearchSymbolAsync("wrong_symbol_name");

            searchMatches.Should().NotBeNull().And.BeEmpty();
        }
コード例 #6
0
        public async Task ThrowException_OnNonExistingSymbol()
        {
            using var client       = new AlphaVantageClient(_apiKey);
            using var stocksClient = client.Stocks();

            await Assert.ThrowsAsync <AlphaVantageParsingException>(async() =>
            {
                await stocksClient.GetGlobalQuoteAsync("wrong_symbol_name");
            });
        }
コード例 #7
0
        public async Task GetSingleQuoteData_ShouldReturnQueryResultWithError_WhenHttpRequestNotOK()
        {
            var client = new AlphaVantageClient(_mockHttpFactory.Object, _mockAlphaVantageOptionsAccessor.Object, _mockParserFactory.Object, _mockLogger.Object);

            SetupMockHttpClient("", HttpStatusCode.Unauthorized);

            var query       = new SingleQuoteQuery(-1);
            var queryResult = await client.GetSingleQuoteData(query, "MSFT", "NASDAQ");

            Assert.True(queryResult.HasError);
        }
コード例 #8
0
        public async Task ReturnValidResult_IfRequestVwapForIntradayInterval(Interval interval)
        {
            using var client = new AlphaVantageClient(_apiKey);

            var symbol        = "IBM";
            var indicatorType = TechIndicatorType.VWAP;

            var result = await client.GetTechIndicatorTimeSeriesAsync(symbol, indicatorType, interval);

            AssertTechIndicatorResultValid(result, interval, indicatorType, 1);
        }
コード例 #9
0
        public async Task ThrowException_IfRequestVwapNotForIntradayInterval(Interval interval)
        {
            using var client = new AlphaVantageClient(_apiKey);

            var symbol        = "IBM";
            var indicatorType = TechIndicatorType.VWAP;

            await Assert.ThrowsAsync <AlphaVantageException>(async() =>
            {
                await client.GetTechIndicatorTimeSeriesAsync(symbol, indicatorType, interval);
            });
        }
コード例 #10
0
        public async Task ThrowExceptionOnIncorrectRequest()
        {
            const ApiFunction function = ApiFunction.TIME_SERIES_INTRADAY;
            var query = GetQuery("wrong_symbol", "15min");

            using var client = new AlphaVantageClient(_apiKey);

            await Assert.ThrowsAsync <AlphaVantageException>(async() =>
            {
                await client.RequestParsedJsonAsync(function, query);
            });
        }
コード例 #11
0
        public async Task ReturnJsonString_OnCorrectRequest_WithoutClean()
        {
            const ApiFunction function = ApiFunction.TIME_SERIES_INTRADAY;
            var query = GetQuery("AAPL", "15min");

            using var client = new AlphaVantageClient(_apiKey);
            var response = await client.RequestPureJsonAsync(function, query);

            response
            .Should().NotBeNull()
            .And
            .Contain("Time Series (15min)");
        }
コード例 #12
0
        public async Task ThrowException_ForIntradayIntervals(Interval interval)
        {
            using var client       = new AlphaVantageClient(_apiKey);
            using var cryptoClient = client.Crypto();

            var fromCurrency = DigitalCurrency.BTC;
            var toCurrency   = PhysicalCurrency.ILS;

            await Assert.ThrowsAsync <AlphaVantageException>(async() =>
            {
                await cryptoClient.GetTimeSeriesAsync(fromCurrency, toCurrency, interval);
            });
        }
コード例 #13
0
        public async Task TestDefaultClient()
        {
            //setup
            var ticker    = "IBM";
            var retriever = new AlphaVantageClient("demo");

            //execute
            var result = await retriever.GetStockOverview(ticker);

            //validate
            Assert.NotNull(result);
            Assert.Equal(ticker, result.Symbol);
        }
コード例 #14
0
        public async Task GetSingleQuoteData_ShouldReturnQueryResultWithError_WhenParsingError()
        {
            var query  = new SingleQuoteQuery(-1);
            var client = new AlphaVantageClient(_mockHttpFactory.Object, _mockAlphaVantageOptionsAccessor.Object, _mockParserFactory.Object, _mockLogger.Object);

            SetupMockHttpClient("", HttpStatusCode.OK);
            _singleQuoteDataCsvParser.Setup(x => x.ParseJson(It.IsAny <int>(), It.IsAny <string>())).Throws(new Exception());

            var queryResult = await client.GetSingleQuoteData(query, "MSFT", "NASDAQ");

            Assert.True(queryResult.HasError);
            Assert.NotNull(queryResult.ErrorMessage);
        }
コード例 #15
0
        public async Task ReturnValidResult_WithMultipleParameters(Interval interval)
        {
            using var client = new AlphaVantageClient(_apiKey);

            var symbol        = "IBM";
            var indicatorType = TechIndicatorType.BBANDS;
            var query         = new Dictionary <string, string>()
            {
                { "time_period", "20" },
                { "series_type", "close" }
            };

            var result = await client.GetTechIndicatorTimeSeriesAsync(symbol, indicatorType, interval, query);

            AssertTechIndicatorResultValid(result, interval, indicatorType, 3);
        }
コード例 #16
0
        public async Task ReturnJsonDocument_OnCorrectRequest_WithoutClean()
        {
            const ApiFunction function = ApiFunction.TIME_SERIES_INTRADAY;
            var query = GetQuery("AAPL", "15min");

            using var client = new AlphaVantageClient(_apiKey);
            var response = await client.RequestParsedJsonAsync(function, query);

            response
            .Should().NotBeNull()
            .And
            .Match <JsonDocument>(
                resp => resp.RootElement.EnumerateObject()
                .LastOrDefault().NameEquals("Time Series (15min)")
                );
        }
コード例 #17
0
        public static async Task CryptoDemo()
        {
            // use your AlphaVantage API key
            string apiKey = "1";

            // there are 5 more constructors available
            using var client       = new AlphaVantageClient(apiKey);
            using var cryptoClient = client.Crypto();

            CryptoTimeSeries cryptoTimeSeries =
                await cryptoClient.GetTimeSeriesAsync(DigitalCurrency.BTC, PhysicalCurrency.ILS, Interval.Weekly);

            CryptoRating cryptoRating = await cryptoClient.GetCryptoRatingAsync(DigitalCurrency.BTC);

            CryptoExchangeRate exchangeRate =
                await cryptoClient.GetExchangeRateAsync(DigitalCurrency.BTC, PhysicalCurrency.ILS);
        }
コード例 #18
0
        public static async Task ForexDemo()
        {
            // use your AlphaVantage API key
            string apiKey = "1";

            // there are 5 more constructors available
            using var client      = new AlphaVantageClient(apiKey);
            using var forexClient = client.Forex();

            ForexTimeSeries forexTimeSeries = await forexClient.GetTimeSeriesAsync(
                PhysicalCurrency.USD,
                PhysicalCurrency.ILS,
                Interval.Daily,
                OutputSize.Compact);

            ForexExchangeRate forexExchangeRate = await forexClient.GetExchangeRateAsync(PhysicalCurrency.USD, PhysicalCurrency.ILS);
        }
コード例 #19
0
        public async Task ReturnResultWithSameTypeAsParser()
        {
            var function = ApiFunction.TIME_SERIES_INTRADAY;
            var symbol   = "AAPL";
            var interval = "15min";
            var query    = new Dictionary <string, string>()
            {
                { nameof(symbol), symbol },
                { nameof(interval), interval }
            };

            using var client      = new AlphaVantageClient(_apiKey);
            using var typedClient = new TestTypedAlphaVantageClient(client);

            var typedResponse = await typedClient.RequestApiAsync(new TestParser(), function, query);

            typedResponse.Should().BeOfType <string>().And.Be("Meta Data");
        }
コード例 #20
0
        public static async void Run([TimerTrigger("0 */1 * * * *")] TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

            log.LogInformation("BEGIN GetTimeSeriesDailyAdjusted");

            string apiKey = System.Environment.GetEnvironmentVariable("AlphaVantageAPIKey", EnvironmentVariableTarget.Process);

            AlphaVantageClient client = new AlphaVantageClient(apiKey, "compact");
            var data = await client.GetTimeSeriesDailyAdjusted("MSFT");

            string connectionString = System.Environment.GetEnvironmentVariable("AzureStorageConnectionString", EnvironmentVariableTarget.Process);
            string containerName    = System.Environment.GetEnvironmentVariable("AzureStorageContainer", EnvironmentVariableTarget.Process);

            AlphaVantageStorage alphaVantageStorage = new AlphaVantageStorage(connectionString, containerName);
            await alphaVantageStorage.TimeSeriesDailyAdjustedLoad(data);

            log.LogInformation("END GetTimeSeriesDailyAdjusted");
        }