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(); }
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(); }
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(); }
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); } } } }
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); } }
public async Task EvaluateAlertAsync(AlertEvaluationMessage message) { var alertDefinition = await _alertDefinitionsRepository.GetAlertDefinitionAsync(message.AlertDefinitionId); await alertDefinition.EvaluateAsync(message); }