public void IsSatisfiedBy_NoChildren_False()
        {
            // Arrange
            var spec    = new AndSpecification <AlertEvaluationMessage>();
            var message = new AlertEvaluationMessage();

            // Act
            var result = spec.IsSatisfiedBy(message);

            // Assert
            result.Should().BeFalse();
        }
Exemplo n.º 2
0
        public void IsSatisfiedBy_NoOperator_False()
        {
            // Arrange
            var alertCriteria = new AlertCriteria();
            var spec          = new PriceSpecification(alertCriteria);
            var message       = new AlertEvaluationMessage();

            // Act
            var result = spec.IsSatisfiedBy(message);

            // Assert
            result.Should().BeFalse();
        }
        public void IsSatisfiedBy_OneTrueChild_True()
        {
            // Arrange
            var spec = new AndSpecification <AlertEvaluationMessage>();

            spec.AddChildSpecification(new TrueSpecification <AlertEvaluationMessage>());
            var message = new AlertEvaluationMessage();

            // Act
            var result = spec.IsSatisfiedBy(message);

            // Assert
            result.Should().BeTrue();
        }
Exemplo n.º 4
0
        public void IsSatisfiedBy_LessThanOrEqual_LastPriceEqualLevel_PrevLastPriceGreaterThanLevel_True()
        {
            // Arrange
            var alertCriteria = new AlertCriteria {
                Operator = CriteriaOperator.LessThanOrEqualTo, Level = 50
            };
            var spec    = new PriceSpecification(alertCriteria);
            var message = new AlertEvaluationMessage {
                LastPrice = 50, PreviousLastPrice = 50.1M
            };

            // Act
            var result = spec.IsSatisfiedBy(message);

            // Assert
            result.Should().BeTrue();
        }
Exemplo n.º 5
0
        public void IsSatisfiedBy_EqualTo_LastPriceLessThanLevel_PrevLastPriceEqualLevel_False()
        {
            // Arrange
            var alertCriteria = new AlertCriteria {
                Operator = CriteriaOperator.Equals, Level = 50
            };
            var spec    = new PriceSpecification(alertCriteria);
            var message = new AlertEvaluationMessage {
                LastPrice = 49, PreviousLastPrice = 50
            };

            // Act
            var result = spec.IsSatisfiedBy(message);

            // Assert
            result.Should().BeFalse();
        }
        public void IsSatisfiedBy_LessThanOrEqual_LastPercentGreaterThanLevel_PrevLastPercentEqualLevel_False()
        {
            // Arrange
            var alertCriteria = new AlertCriteria {
                Operator = CriteriaOperator.LessThanOrEqualTo, Level = 0.02M
            };
            var spec    = new DailyPercentageGainLossSpecification(alertCriteria);
            var message = new AlertEvaluationMessage {
                OpenPrice = 1, LastPrice = 1.03M, PreviousLastPrice = 1.02M
            };

            // Act
            var result = spec.IsSatisfiedBy(message);

            // Assert
            result.Should().BeFalse();
        }
        public async Task EvaluateAsync(AlertEvaluationMessage message)
        {
            if (Status == AlertDefinitionStatuses.Enabled)
            {
                if (!LastSent.HasValue || DateTimeOffset.UtcNow.Date > LastSent.Value.Date) // Alert not already sent today
                {
                    var specification = _alertCriteriaSpecificationFactory.CreateSpecification(this);
                    if (specification.IsSatisfiedBy(message))
                    {
                        var subject             = $"Stock Alert Triggered: {Stock.Symbol}";
                        var notificationMessage = $"Stock Alert Triggered {Environment.NewLine}" +
                                                  $"Notification Name: {Name}{Environment.NewLine}" +
                                                  $"Stock: {Stock.Symbol} ({message.LastPrice:C}){Environment.NewLine}" +
                                                  $"Criteria: {RootCriteria}{Environment.NewLine}";

                        await TriggerAlertAsync(subject, notificationMessage);
                    }
                }
            }
        }
Exemplo n.º 8
0
        private async Task EnqueueAlertEvaluationMessages(Stock stock)
        {
            var alertDefinitions = await _alertDefinitionsRepository.GetAlertDefinitionsByStockIdAsync(stock.StockId);

            foreach (var alertDefinition in alertDefinitions)
            {
                // Create and enqueue SB message
                var alertProcessingMessage = new AlertEvaluationMessage
                {
                    AlertDefinitionId = alertDefinition.AlertDefinitionId,
                    LastPrice         = stock.LastPrice,
                    PreviousLastPrice = stock.PreviousLastPrice
                };
                var messageBodyJson = JsonConvert.SerializeObject(alertProcessingMessage);

                var message = new Message(Encoding.UTF8.GetBytes(messageBodyJson));

                await _alertProcessingQueueClient.SendAsync(message);
            }
        }
Exemplo n.º 9
0
        public async Task EvaluateAlertAsync(AlertEvaluationMessage message)
        {
            var alertDefinition = await _alertDefinitionsRepository.GetAlertDefinitionAsync(message.AlertDefinitionId);

            await alertDefinition.EvaluateAsync(message);
        }