public async Task GetSingleQuoteData_ShouldReturnEmptyDataSet_WhenNotInDBOrCache()
        {
            _stockDataRepository.Setup(s => s.GetSingleQuoteData(It.IsAny <int>())).Returns(Task.FromResult <SingleQuoteData>(null));

            StockSingleQuoteDataDTO data = await _service.GetSingleQuoteData(1);

            Assert.Null(data.Data);
            Assert.Null(data.LastUpdated);
        }
        public async Task GetSingleQuoteData_ShouldGetValueFromCache()
        {
            var query       = new SingleQuoteQuery(1);
            var queryResult = new SingleQuoteQueryResult("MSFT", _singleQuoteData);

            _cache.Upsert(query.SymbolId, queryResult);

            StockSingleQuoteDataDTO data = await _service.GetSingleQuoteData(query.SymbolId);

            Assert.Equal(queryResult.Data, data.Data);
            _stockDataRepository.Verify(s => s.GetSingleQuoteData(It.IsAny <int>()), Times.Never);
        }
Example #3
0
 private void AssertSingleQuote(StockSingleQuoteDataDTO dataDto, int expectedSymbolId)
 {
     Assert.Equal(expectedSymbolId, dataDto.SymbolId);
     Assert.NotNull(dataDto.Data);
     Assert.True(dataDto.Data.Low >= 0);
     Assert.True(dataDto.Data.High >= 0);
     Assert.True(dataDto.Data.Open >= 0);
     Assert.True(dataDto.Data.Volume >= 0);
     Assert.True(dataDto.Data.Price >= 0);
     Assert.True(dataDto.Data.PreviousClose >= 0);
     Assert.True(dataDto.Data.LastUpdated > new DateTime());
     Assert.True(dataDto.Data.LastTradingDay > new DateTime());
 }
        public async Task GetSingleQuoteData_ShouldGetValueFromDBAndSaveToCache_WhenNotInCache()
        {
            var query       = new SingleQuoteQuery(1);
            var queryResult = new SingleQuoteQueryResult("MSFT", _singleQuoteData);

            _stockDataRepository.Setup(s => s.GetSingleQuoteData(It.IsAny <int>())).Returns(Task.FromResult(_singleQuoteData));

            StockSingleQuoteDataDTO data = await _service.GetSingleQuoteData(query.SymbolId);

            Assert.Equal(queryResult.Data, data.Data);
            _stockDataRepository.Verify(s => s.GetSingleQuoteData(It.IsAny <int>()), Times.Once);
            _cache.TryGet(query.SymbolId, out SingleQuoteQueryResult cachedResult);

            Assert.Equal(queryResult.Data, cachedResult.Data);
        }
        public async Task <ActionResult <IEnumerable <StockSingleQuoteDataDTO> > > GetSingleQuoteData([FromQuery] int[] sids)
        {
            List <StockSingleQuoteDataDTO> dataset = new List <StockSingleQuoteDataDTO>();

            foreach (int id in sids)
            {
                // Fetching one stock at a time since values are cached.
                StockSingleQuoteDataDTO quote = await _stockDataService.GetSingleQuoteData(id);

                dataset.Add(quote);

                _stockDataService.AddSubscriberToSingleQuote(id);
            }

            return(Ok(dataset));
        }
Example #6
0
        /// <summary>
        /// Gets the single quote stock data for a ticker.
        /// Retrieves from the cache <see cref="SingleQuoteCache"/> if it exists,
        /// otherwise it will fetch from the database.
        ///
        /// If does not exist in the database it will return no data.
        /// Returns empty
        /// </summary>
        /// <param name="ticker"></param>
        /// <returns>The <see cref="StockSingleQuoteDataDTO"/></returns>
        public async Task <StockSingleQuoteDataDTO> GetSingleQuoteData(int symbolId)
        {
            SingleQuoteQueryResult queryResult;
            SingleQuoteData        data;

            if (_singleQuoteCache.TryGet(symbolId, out queryResult))
            {
                return(new StockSingleQuoteDataDTO(symbolId, queryResult.Data));
            }

            data = await _stockDataRepository.GetSingleQuoteData(symbolId);


            if (data != null)
            {
                _singleQuoteCache.Add(symbolId, new SingleQuoteQueryResult(data.Ticker, data));
                return(new StockSingleQuoteDataDTO(symbolId, data));
            }

            return(StockSingleQuoteDataDTO.CreateNoDataExists(symbolId));
        }