private async Task ProcessCandlesUpdatedEventAsync(CandlesUpdatedEvent candlesUpdate)
        {
            try
            {
                if (_cacheInitalizationService.InitializationState != CacheInitializationState.Idle)
                {
                    await Task.Delay(5000);

                    throw new InvalidOperationException("Initialization in progress");
                }

                var validationErrors = ValidateQuote(candlesUpdate);

                if (validationErrors.Any())
                {
                    var message = string.Join("\r\n", validationErrors);
                    _log.Warning(nameof(ProcessCandlesUpdatedEventAsync), message, context: candlesUpdate.ToJson());

                    return;
                }

                var candles = candlesUpdate.Candles
                              .Where(candleUpdate =>
                                     _candlesChecker.CanHandleAssetPair(candleUpdate.AssetPairId))
                              .Select(candleUpdate => Candle.Create(
                                          priceType: candleUpdate.PriceType,
                                          assetPair: candleUpdate.AssetPairId,
                                          timeInterval: candleUpdate.TimeInterval,
                                          timestamp: candleUpdate.CandleTimestamp,
                                          open: candleUpdate.Open,
                                          close: candleUpdate.Close,
                                          low: candleUpdate.Low,
                                          high: candleUpdate.High,
                                          tradingVolume: candleUpdate.TradingVolume,
                                          tradingOppositeVolume: candleUpdate.TradingOppositeVolume,
                                          lastTradePrice: candleUpdate.LastTradePrice,
                                          lastUpdateTimestamp: candleUpdate.ChangeTimestamp))
                              .ToArray();

                await _candlesManager.ProcessCandlesAsync(candles);
            }
            catch (Exception)
            {
                _log.Warning(nameof(ProcessCandlesUpdatedEventAsync), "Failed to process candle", context: candlesUpdate.ToJson());
                throw;
            }
        }
        private async Task ProcessCandlesUpdatedEventAsync(CandlesUpdatedEvent candlesUpdate)
        {
            try
            {
                var validationErrors = ValidateQuote(candlesUpdate);
                if (validationErrors.Any())
                {
                    var message = string.Join("\r\n", validationErrors);
                    await _log.WriteWarningAsync(nameof(CandlesSubscriber), nameof(CandlesUpdatedEvent), candlesUpdate.ToJson(), message);

                    return;
                }

                var candles = candlesUpdate.Candles
                              .Where(candleUpdate =>
                                     Constants.StoredIntervals.Contains(candleUpdate.TimeInterval) &&
                                     _candlesChecker.CanHandleAssetPair(candleUpdate.AssetPairId))
                              .Select(candleUpdate => Candle.Create(
                                          priceType: candleUpdate.PriceType,
                                          assetPair: candleUpdate.AssetPairId,
                                          timeInterval: candleUpdate.TimeInterval,
                                          timestamp: candleUpdate.CandleTimestamp,
                                          open: candleUpdate.Open,
                                          close: candleUpdate.Close,
                                          low: candleUpdate.Low,
                                          high: candleUpdate.High,
                                          tradingVolume: candleUpdate.TradingVolume,
                                          tradingOppositeVolume: candleUpdate.TradingOppositeVolume,
                                          lastTradePrice: candleUpdate.LastTradePrice,
                                          lastUpdateTimestamp: candleUpdate.ChangeTimestamp))
                              .ToArray();

                await _candlesManager.ProcessCandlesAsync(candles);
            }
            catch (Exception)
            {
                await _log.WriteWarningAsync(nameof(CandlesSubscriber), nameof(ProcessCandlesUpdatedEventAsync), candlesUpdate.ToJson(), "Failed to process candle");

                throw;
            }
        }
Ejemplo n.º 3
0
        public async Task Only_candle_for_asset_pairs_with_connection_string_are_processed()
        {
            // Arrange
            var quote1 = new TestCandle {
                AssetPairId = "EURUSD", TimeInterval = StoredIntervals.First()
            };
            var quote3 = new TestCandle {
                AssetPairId = "EURRUB", TimeInterval = StoredIntervals.First()
            };

            // Act
            await _manager.ProcessCandlesAsync(new [] { quote1, quote3 });

            // Assert
            _cacheServiceMock.Verify(s => s.CacheAsync(It.Is <IReadOnlyList <ICandle> >(candles =>
                                                                                        candles.Count(c => c.AssetPairId == "EURUSD") == 1 &&
                                                                                        candles.Count(c => c.AssetPairId == "EURRUB") == 1)), Times.Once);
            _persistenceQueueMock.Verify(s => s.EnqueueCandle(It.Is <ICandle>(c => c.AssetPairId == "EURUSD")), Times.Once);
            _persistenceQueueMock.Verify(s => s.EnqueueCandle(It.Is <ICandle>(c => c.AssetPairId == "EURRUB")), Times.Once);

            _cacheServiceMock.Verify(s => s.CacheAsync(It.IsAny <IReadOnlyList <ICandle> >()), Times.Once);
            _persistenceQueueMock.Verify(s => s.EnqueueCandle(It.IsAny <ICandle>()), Times.Exactly(2));
        }