public async Task Always_ShouldSendRates() { //arrange var history = new CandlesHistoryResponseModel { History = new[] { new Candle { Open = 10, Close = 20 }, new Candle { Open = 30, Close = 40 } } }; var now = DateTime.UtcNow; _testSuit .Setup <ISystem>(s => s.UtcNow == now) .Setup <ICandleshistoryservice>(s => s.GetCandlesHistoryOrErrorWithHttpMessagesAsync("LKKUSD", CandlePriceType.Mid, CandleTimeInterval.Min5, now.AddHours(-12), now, null, default) == history.ToResponse <object>()) .Setup <IMarketMakerService>(s => s.ProcessNewAvgSpotRate("LKKUSD", 25, 25) == Task.CompletedTask); //act await _testSuit.Sut.Execute(); //assert _testSuit.GetMock <IMarketMakerService>().Verify(s => s.ProcessNewAvgSpotRate("LKKUSD", 25, 25), Times.Once); }
public static CandleSticksResponseModel ToResponseModel(this CandlesHistoryResponseModel model, int baseAssetAccuracy, int quotingAssetAccuracy) { var resp = new CandleSticksResponseModel(); resp.History = model.History.Select(x => new CandleStickHistoryItem { DateTime = x.DateTime, Open = x.Open, Close = x.Close, High = x.High, Low = x.Low, Volume = Math.Round(x.TradingVolume, baseAssetAccuracy), OppositeVolume = Math.Round(x.TradingOppositeVolume, quotingAssetAccuracy) }).ToList(); return(resp); }
public async Task <IActionResult> GetCandlesHistoryBatch([FromBody] GetCandlesHistoryBatchRequest request, CancellationToken cancellationToken) { if (!ModelState.IsValid) { return(Ok(new Dictionary <string, CandlesHistoryResponseModel>())); } if (cancellationToken.IsCancellationRequested || request.AssetPairs == null || !request.AssetPairs.Any()) { return(Ok(new Dictionary <string, CandlesHistoryResponseModel>())); } request.FromMoment = request.FromMoment.ToUniversalTime(); request.ToMoment = request.ToMoment.ToUniversalTime(); if (request.PriceType == CandlePriceType.Unspecified) { return(BadRequest(ErrorResponse.Create(nameof(request.PriceType), $"Price type should not be {CandlePriceType.Unspecified}"))); } if (request.TimeInterval == CandleTimeInterval.Unspecified) { return(BadRequest(ErrorResponse.Create(nameof(request.TimeInterval), $"Time interval should not be {CandleTimeInterval.Unspecified}"))); } if (request.FromMoment > request.ToMoment) { return(BadRequest(ErrorResponse.Create("From date should be early or equal than To date"))); } var notConfiguerdAssetPairs = request.AssetPairs .Where(p => !_candleHistoryAssetConnections.ContainsKey(p)) .ToArray(); if (notConfiguerdAssetPairs.Any()) { return(BadRequest( ErrorResponse.Create(nameof(request.AssetPairs), $"Asset pairs [{string.Join(", ", notConfiguerdAssetPairs)}] are not configured"))); } var assetPairsTask = request.AssetPairs.Select(p => _assetPairsManager.TryGetAssetPairAsync(p)).ToArray(); await Task.WhenAll(assetPairsTask); if (assetPairsTask.Any(t => t.Result == null)) { var notFound = request.AssetPairs.Except(assetPairsTask.Select(p => p.Result?.Id).Where(p => p != null)); return(BadRequest( ErrorResponse.Create(nameof(request.AssetPairs), $"Asset pairs [{string.Join(", ", notFound)}] are not found"))); } var allHistory = new Dictionary <string, CandlesHistoryResponseModel>(); var tasks = new List <Task <IEnumerable <ICandle> > >(); var activeSlot = await _candlesManager.GetActiveSlotAsync(); foreach (var assetPair in request.AssetPairs) { allHistory[assetPair] = new CandlesHistoryResponseModel { History = Array.Empty <CandlesHistoryResponseModel.Candle>() }; tasks.Add(_candlesManager.GetCandlesAsync(assetPair, request.PriceType, request.TimeInterval, request.FromMoment, request.ToMoment, activeSlot)); } await Task.WhenAll(tasks); foreach (var task in tasks) { var candles = task.Result.Select(c => new { pair = c.AssetPairId, model = new CandlesHistoryResponseModel.Candle { DateTime = c.Timestamp, Open = c.Open, Close = c.Close, High = c.High, Low = c.Low, TradingVolume = c.TradingVolume, TradingOppositeVolume = c.TradingOppositeVolume, LastTradePrice = c.LastTradePrice } }).ToArray(); if (candles.Any()) { var p = candles[0].pair; allHistory[p] = new CandlesHistoryResponseModel { History = candles.Select(c => c.model) }; } } return(Ok(allHistory)); }