diff --git a/src/Exceptionless.Core/Pipeline/030_CheckForRegressionAction.cs b/src/Exceptionless.Core/Pipeline/030_CheckForRegressionAction.cs index d5b052ec72..f7a8c79a62 100644 --- a/src/Exceptionless.Core/Pipeline/030_CheckForRegressionAction.cs +++ b/src/Exceptionless.Core/Pipeline/030_CheckForRegressionAction.cs @@ -70,7 +70,7 @@ public override async Task ProcessBatchAsync(ICollection contexts) } if (regressedContext is null) - return; + continue; _logger.LogDebug("Marking stack and events as regressed in version: {Version}", regressedVersion); stack.Status = StackStatus.Regressed; diff --git a/tests/Exceptionless.Tests/Pipeline/EventPipelineTests.cs b/tests/Exceptionless.Tests/Pipeline/EventPipelineTests.cs index d7c94b962e..27f0ab42a6 100644 --- a/tests/Exceptionless.Tests/Pipeline/EventPipelineTests.cs +++ b/tests/Exceptionless.Tests/Pipeline/EventPipelineTests.cs @@ -808,6 +808,46 @@ public async Task EnsureSingleRegressionAsync() Assert.Equal(2, contexts.Count(c => !c.IsRegression)); } + [Fact] + public async Task ProcessBatchAsync_ContinuesAfterStackWithoutRegression() + { + // Arrange + var fixedAtUtc = DateTime.UtcNow; + var organization = _organizationData.GenerateSampleOrganization(_billingManager, _plans); + var project = _projectData.GenerateSampleProject(); + var firstContext = await _pipeline.RunAsync( + _eventData.GenerateEvent(projectId: project.Id, organizationId: organization.Id, source: "first-stack", occurrenceDate: fixedAtUtc.AddMinutes(-2)), + organization, + project); + var secondContext = await _pipeline.RunAsync( + _eventData.GenerateEvent(projectId: project.Id, organizationId: organization.Id, source: "second-stack", occurrenceDate: fixedAtUtc.AddMinutes(-2)), + organization, + project); + + Assert.NotNull(firstContext.Stack); + Assert.NotNull(secondContext.Stack); + firstContext.Stack.MarkFixed(null, TimeProvider); + secondContext.Stack.MarkFixed(null, TimeProvider); + await _stackRepository.SaveAsync(firstContext.Stack, o => o.ImmediateConsistency().Cache()); + await _stackRepository.SaveAsync(secondContext.Stack, o => o.ImmediateConsistency().Cache()); + await RefreshDataAsync(); + + var contexts = new List + { + new(_eventData.GenerateEvent(stackId: firstContext.Stack.Id, projectId: project.Id, organizationId: organization.Id, occurrenceDate: fixedAtUtc.AddMinutes(-1)), organization, project), + new(_eventData.GenerateEvent(stackId: secondContext.Stack.Id, projectId: project.Id, organizationId: organization.Id, occurrenceDate: fixedAtUtc.AddMinutes(1)), organization, project) + }; + + // Act + await _pipeline.RunAsync(contexts); + + // Assert + Assert.False(contexts[0].IsRegression); + Assert.Equal(StackStatus.Fixed, contexts[0].Stack?.Status); + Assert.True(contexts[1].IsRegression); + Assert.Equal(StackStatus.Regressed, contexts[1].Stack?.Status); + } + [Fact] public async Task EnsureVersionedRegressionAsync() {