public void DeserializeStockPriceResponse() { var serializer = new RestClientSerializer(); var id = Guid.NewGuid(); var json = "{\"id\":\"" + id + "\"," + "\"asxCode\":\"ABC\"," + "\"name\":\"ABC Pty Ltd\"," + "\"closingPrices\":[" + "{\"date\":\"2000-01-02\",\"price\":12.00}," + "{\"date\":\"2000-01-03\",\"price\":13.00}" + "]}"; var command = serializer.Deserialize <StockPriceResponse>(json); var expected = new StockPriceResponse() { Id = id, AsxCode = "ABC", Name = "ABC Pty Ltd" }; expected.AddClosingPrice(new Date(2000, 01, 02), 12.00m); expected.AddClosingPrice(new Date(2000, 01, 03), 13.00m); command.Should().BeEquivalentTo(expected); }
public static StockPriceResponse ToPriceResponse(this Stock stock, DateRange dateRange) { var stockProperties = stock.Properties.ClosestTo(dateRange.ToDate); var result = new StockPriceResponse() { Id = stock.Id, AsxCode = stockProperties.AsxCode, Name = stockProperties.Name }; foreach (var price in stock.GetPrices(dateRange)) { result.AddClosingPrice(price.Date, price.Price); } return(result); }
/// <summary> /// Request the share price for the supplied symbol from the yahoo API /// </summary> /// <param name="symbol">The symbol for which to search</param> /// <returns>An object that contains the market price, update time and currency</returns> private static StockPriceResponse RequestSharePrice(string symbol) { // Construct the URL var url = "https://query1.finance.yahoo.com/v8/finance/chart/" + symbol + "?interval=1d&range=1d"; // Create the WebRequest object to send to the URL var req = WebRequest.Create(url); req.ContentType = "application/json; charset=utf-8"; req.Method = "GET"; // Retrieve the response from the request, if null, return null var responseSteam = req.GetResponse().GetResponseStream(); if (responseSteam == null) { return(null); } // Read the response stream and store a trimmed version var sr = new StreamReader(responseSteam); var response = sr.ReadToEnd().Trim(); // Access the relevant fields from the JSON response (the current market price, currency and updated time) var rootObject = JObject.Parse(response); var metaObject = rootObject["chart"]?["result"]?[0]?["meta"]; var regularMarketPriceStr = metaObject?["regularMarketPrice"]?.ToString(); var regularMarketTimeStr = metaObject?["regularMarketTime"]?.ToString(); var stockCurrency = metaObject?["currency"]?.ToString(); var regularMarketPrice = double.Parse(regularMarketPriceStr ?? string.Empty); var regularMarketTime = DateTimeOffset.FromUnixTimeSeconds(Convert.ToInt64(regularMarketTimeStr)).DateTime; // Construct the response object and return var stockPriceResponse = new StockPriceResponse { StockPrice = regularMarketPrice, StockCurrency = stockCurrency, StockPriceTime = regularMarketTime, }; return(stockPriceResponse); }
public async Task GetPrices() { var mockRepository = new MockRepository(MockBehavior.Strict); var stock = new StockPriceResponse() { Id = Guid.NewGuid(), AsxCode = "ABC" }; var messageHandler = mockRepository.Create <IRestClientMessageHandler>(); messageHandler.Setup(x => x.GetAsync <StockPriceResponse>(It.Is <string>(x => x == "stocks/" + stock.Id + "/closingprices?fromdate=2000-01-02&todate=2010-05-06"))) .Returns(Task <StockPriceResponse> .FromResult(stock)) .Verifiable(); var resource = new StockResource(messageHandler.Object); var result = await resource.GetPrices(stock.Id, new DateRange(new Date(2000, 01, 02), new Date(2010, 05, 06))); result.Should().BeEquivalentTo(stock); mockRepository.Verify(); }