public StockDataServiceTests() { _stockDataRepository = new Mock <IStockDataRepository>(); var options = new Mock <IOptionsMonitor <CacheOptions> >(); options.Setup(o => o.Get(SingleQuoteCache.CacheName)).Returns(new CacheOptions { CacheExpiryTimeMinutes = 10, CacheItemSize = 1, CacheSize = 100 }); _cache = new SingleQuoteCache(options.Object); _service = new StockDataService(_stockDataRepository.Object, _cache, new QuerySubscriptions(), new Mock <ILogger <StockDataService> >().Object); _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 ); }
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); }
public UpsertSingleQuoteData(int symbolId, SingleQuoteData data) { SymbolId = symbolId; High = data.High; Low = data.Low; Open = data.Open; Price = data.Price; Volume = data.Volume; PreviousClose = data.PreviousClose; Change = data.Change; ChangePercent = data.ChangePercent; LastUpdated = data.LastUpdated; LastTradingDay = data.LastTradingDay; }
public async Task Should_OnlyShowedTheTopMembers() { TestUser testUser1 = await CreateTestUserWithPortfolio(); TestUser testUser2 = await CreateTestUserWithPortfolio(); TestUser testUser3 = await CreateTestUserWithPortfolio(); SymbolSearchResultDTO jpmStock = await FetchSymbol("JPM", ExchangeType.NYSE); // Add singlequote stocks var jpmData = new SingleQuoteData(jpmStock.SymbolId, jpmStock.Ticker, 200, 200, 200, 200, 200, 200, 0, 0, DateTime.UtcNow, DateTime.UtcNow); await SetSingleQuoteData(new UpsertSingleQuoteData(jpmStock.SymbolId, jpmData)); // Add symbols User 1 await AddSymbolToPortfolioWithAvgPrice(testUser1, jpmStock.SymbolId, 100); // Add symbols User 2 await AddSymbolToPortfolioWithAvgPrice(testUser2, jpmStock.SymbolId, 200); // Add symbols User 3 await AddSymbolToPortfolioWithAvgPrice(testUser3, jpmStock.SymbolId, 300); var leaderBoardResponse = await _client.GetAsync(ApiPath.LeaderBoard(2)); LeaderBoardViewModel leaderBoardViewModel = await leaderBoardResponse.Content.ReadAsAsync <LeaderBoardViewModel>(); // Verify calculations BoardValue bestPerformerRank1 = leaderBoardViewModel.BestPerformers.Values.ElementAt(0); BoardValue bestPerformerRank2 = leaderBoardViewModel.BestPerformers.Values.ElementAt(1); BoardValue worstPerformerRank1 = leaderBoardViewModel.WorstPerformers.Values.ElementAt(0); BoardValue worstPerformerRank2 = leaderBoardViewModel.WorstPerformers.Values.ElementAt(1); Assert.Equal(2, leaderBoardViewModel.BestPerformers.Values.Count()); Assert.Equal(2, leaderBoardViewModel.WorstPerformers.Values.Count()); Assert.Equal(testUser1.UserId, Guid.Parse(bestPerformerRank1.Id)); Assert.Equal(testUser2.UserId, Guid.Parse(bestPerformerRank2.Id)); Assert.Equal(testUser3.UserId, Guid.Parse(worstPerformerRank1.Id)); Assert.Equal(testUser2.UserId, Guid.Parse(worstPerformerRank2.Id)); }
public async Task Should_IgnorePortfolioSymbolsWithNoAveragePrice() { TestUser testUser1 = await CreateTestUserWithPortfolio(); TestUser testUser2 = await CreateTestUserWithPortfolio(); SymbolSearchResultDTO jpmStock = await FetchSymbol("JPM", ExchangeType.NYSE); SymbolSearchResultDTO fbStock = await FetchSymbol("FB", ExchangeType.NASDAQ); // Add singlequote stocks var jpmData = new SingleQuoteData(jpmStock.SymbolId, jpmStock.Ticker, 200, 200, 200, 200, 200, 200, 0, 0, DateTime.UtcNow, DateTime.UtcNow); var fbData = new SingleQuoteData(fbStock.SymbolId, fbStock.Ticker, 333.33m, 333.33m, 333.33m, 333.33m, 333.33m, 300, 0, 0, DateTime.UtcNow, DateTime.UtcNow); await SetSingleQuoteData(new UpsertSingleQuoteData(jpmStock.SymbolId, jpmData)); await SetSingleQuoteData(new UpsertSingleQuoteData(fbData.SymbolId, fbData)); // Add symbols User 1 await AddSymbolToPortfolioWithAvgPrice(testUser1, jpmStock.SymbolId, 100); await AddSymbolToPortfolio(testUser1, fbStock.SymbolId); // Add symbols User 2 await AddSymbolToPortfolio(testUser2, jpmStock.SymbolId); await AddSymbolToPortfolio(testUser2, fbStock.SymbolId); var leaderBoardResponse = await _client.GetAsync(ApiPath.LeaderBoard(2)); LeaderBoardViewModel leaderBoardViewModel = await leaderBoardResponse.Content.ReadAsAsync <LeaderBoardViewModel>(); // Verify calculations BoardValue bestPerformerRank1 = leaderBoardViewModel.BestPerformers.Values.ElementAt(0); BoardValue worstPerformerRank1 = leaderBoardViewModel.WorstPerformers.Values.ElementAt(0); Assert.Single(leaderBoardViewModel.BestPerformers.Values); Assert.Single(leaderBoardViewModel.WorstPerformers.Values); Assert.Equal(testUser1.UserId, Guid.Parse(bestPerformerRank1.Id)); Assert.Equal("100.00", bestPerformerRank1.Value); Assert.Equal(testUser1.UserId, Guid.Parse(worstPerformerRank1.Id)); Assert.Equal("100.00", worstPerformerRank1.Value); }
public async Task GetPrioritizedQueries_ShouldOnlyIncludeSubscriptionsWithStaleData_Null() { var querySubscriptions = new QuerySubscriptions(); var query1 = new TestQuery(1, QueryFunctionType.SingleQuote); var query2 = new TestQuery(2, QueryFunctionType.SingleQuote); querySubscriptions.AddSubscriber(query1); querySubscriptions.AddSubscriber(query2); query1.SetMockQueryContext(_mockContext); query2.SetMockQueryContext(_mockContext); var stockData = 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 ); _mockContext.Setup(c => c.GetCachedQueryResult(2)).Returns(Task.FromResult <StockQueryResult>(new SingleQuoteQueryResult("MSFT", stockData))); var priorityRule = new QuerySubscriptionCountRule(_mockContextFactory.Object, querySubscriptions, (new Mock <ILogger <QuerySubscriptionCountRule> >()).Object); var prioritizedQueries = (await priorityRule.GetPrioritizedQueries()).ToList(); Assert.Single(prioritizedQueries); Assert.Equal(prioritizedQueries[0], query1); }
public async Task Should_ReturnBestAndWorstPerformers() { TestUser testUser1 = await CreateTestUserWithPortfolio(); TestUser testUser2 = await CreateTestUserWithPortfolio(); TestUser testUser3 = await CreateTestUserWithPortfolio(); SymbolSearchResultDTO jpmStock = await FetchSymbol("JPM", ExchangeType.NYSE); SymbolSearchResultDTO fbStock = await FetchSymbol("FB", ExchangeType.NASDAQ); SymbolSearchResultDTO tslaStock = await FetchSymbol("TSLA", ExchangeType.NASDAQ); SymbolSearchResultDTO msftStock = await FetchSymbol("MSFT", ExchangeType.NASDAQ); // Add singlequote stocks var jpmData = new SingleQuoteData(jpmStock.SymbolId, jpmStock.Ticker, 200, 200, 200, 200, 200, 200, 0, 0, DateTime.UtcNow, DateTime.UtcNow); var fbData = new SingleQuoteData(fbStock.SymbolId, fbStock.Ticker, 333.33m, 333.33m, 333.33m, 333.33m, 333.33m, 300, 0, 0, DateTime.UtcNow, DateTime.UtcNow); var tslaData = new SingleQuoteData(tslaStock.SymbolId, tslaStock.Ticker, 888.88m, 888.88m, 888.88m, 888.88m, 888.88m, 800, 0, 0, DateTime.UtcNow, DateTime.UtcNow); var msftData = new SingleQuoteData(msftStock.SymbolId, msftStock.Ticker, 225, 225, 225, 225, 225, 200, 0, 0, DateTime.UtcNow, DateTime.UtcNow); await SetSingleQuoteData(new UpsertSingleQuoteData(jpmStock.SymbolId, jpmData)); await SetSingleQuoteData(new UpsertSingleQuoteData(fbData.SymbolId, fbData)); await SetSingleQuoteData(new UpsertSingleQuoteData(tslaData.SymbolId, tslaData)); await SetSingleQuoteData(new UpsertSingleQuoteData(msftData.SymbolId, msftData)); // Add symbols User 1 await AddSymbolToPortfolioWithAvgPrice(testUser1, jpmStock.SymbolId, 100.25m); await AddSymbolToPortfolioWithAvgPrice(testUser1, fbStock.SymbolId, 260.35m); await AddSymbolToPortfolioWithAvgPrice(testUser1, msftStock.SymbolId, 175.50m); // Add symbols User 2 await AddSymbolToPortfolioWithAvgPrice(testUser2, jpmStock.SymbolId, 5.00m); await AddSymbolToPortfolioWithAvgPrice(testUser2, fbStock.SymbolId, 10.00m); // Add Symbols Users 3 await AddSymbolToPortfolioWithAvgPrice(testUser3, jpmStock.SymbolId, 180.88m); await AddSymbolToPortfolioWithAvgPrice(testUser3, fbStock.SymbolId, 400.00m); await AddSymbolToPortfolioWithAvgPrice(testUser3, tslaStock.SymbolId, 1000m); await AddSymbolToPortfolioWithAvgPrice(testUser3, msftStock.SymbolId, 300.90m); var leaderBoardResponse = await _client.GetAsync(ApiPath.LeaderBoard(3)); LeaderBoardViewModel leaderBoardViewModel = await leaderBoardResponse.Content.ReadAsAsync <LeaderBoardViewModel>(); // Verify calculations BoardValue bestPerformerRank1 = leaderBoardViewModel.BestPerformers.Values.ElementAt(0); BoardValue bestPerformerRank2 = leaderBoardViewModel.BestPerformers.Values.ElementAt(1); BoardValue bestPerformerRank3 = leaderBoardViewModel.BestPerformers.Values.ElementAt(2); Assert.Equal(3, leaderBoardViewModel.BestPerformers.Values.Count()); Assert.Equal(testUser2.UserId, Guid.Parse(bestPerformerRank1.Id)); Assert.Equal(testUser1.UserId, Guid.Parse(bestPerformerRank2.Id)); Assert.Equal(testUser3.UserId, Guid.Parse(bestPerformerRank3.Id)); Assert.Equal(testUser2.UserId, Guid.Parse(bestPerformerRank1.Name)); Assert.Equal(testUser1.UserId, Guid.Parse(bestPerformerRank2.Name)); Assert.Equal(testUser3.UserId, Guid.Parse(bestPerformerRank3.Name)); Assert.Equal("3,566.65", bestPerformerRank1.Value); Assert.Equal("51.91", bestPerformerRank2.Value); Assert.Equal("-10.61", bestPerformerRank3.Value); BoardValue worstPerformerRank1 = leaderBoardViewModel.WorstPerformers.Values.ElementAt(0); BoardValue worstPerformerRank2 = leaderBoardViewModel.WorstPerformers.Values.ElementAt(1); BoardValue worstPerformerRank3 = leaderBoardViewModel.WorstPerformers.Values.ElementAt(2); Assert.Equal(3, leaderBoardViewModel.WorstPerformers.Values.Count()); Assert.Equal(testUser3.UserId, Guid.Parse(worstPerformerRank1.Id)); Assert.Equal(testUser1.UserId, Guid.Parse(worstPerformerRank2.Id)); Assert.Equal(testUser2.UserId, Guid.Parse(worstPerformerRank3.Id)); Assert.Equal("-10.61", worstPerformerRank1.Value); Assert.Equal("51.91", worstPerformerRank2.Value); Assert.Equal("3,566.65", worstPerformerRank3.Value); }
public StockSingleQuoteDataDTO(int symbolId, SingleQuoteData data, DateTime?lastUpdated) { SymbolId = symbolId; Data = data; LastUpdated = lastUpdated; }
/// <summary> /// Instantiate instance of <see cref="StockSingleQuoteDataDTO"/> with data. /// </summary> /// <param name="symbolId">SymbolId of Stock</param> /// <param name="singleQuoteData">The <see cref="SingleQuoteData"/></param> public StockSingleQuoteDataDTO(int symbolId, SingleQuoteData singleQuoteData) { SymbolId = symbolId > 0 ? symbolId : throw new ArgumentException(nameof(symbolId), "must be greater than 0"); Data = singleQuoteData ?? throw new NullReferenceException(nameof(singleQuoteData)); LastUpdated = singleQuoteData.LastUpdated; }
public SingleQuoteQueryResult(string ticker, SingleQuoteData data) : base(ticker, data, data.LastUpdated) { Data = data; }