public async Task CanMarkAsRegressedAsync() { var stack = await _repository.AddAsync(StackData.GenerateStack(projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId, dateFixed: SystemClock.UtcNow.SubtractMonths(1)), o => o.ImmediateConsistency()); Assert.NotNull(stack); Assert.False(stack.Status == Core.Models.StackStatus.Regressed); Assert.NotNull(stack.DateFixed); await _repository.MarkAsRegressedAsync(stack.Id); stack = await _repository.GetByIdAsync(stack.Id); Assert.NotNull(stack); Assert.True(stack.Status == Core.Models.StackStatus.Regressed); Assert.NotNull(stack.DateFixed); }
public async Task CanMarkAsRegressedAsync() { await _repository.AddAsync(StackData.GenerateStack(id: TestConstants.StackId, projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId, dateFixed: SystemClock.UtcNow.SubtractMonths(1))); var stack = await _repository.GetByIdAsync(TestConstants.StackId); Assert.NotNull(stack); Assert.False(stack.IsRegressed); Assert.NotNull(stack.DateFixed); await RefreshDataAsync(); await _repository.MarkAsRegressedAsync(TestConstants.StackId); stack = await _repository.GetByIdAsync(TestConstants.StackId); Assert.NotNull(stack); Assert.True(stack.IsRegressed); Assert.NotNull(stack.DateFixed); }
public override async Task ProcessBatchAsync(ICollection <EventContext> contexts) { var stacks = contexts.Where(c => c.Stack?.DateFixed != null && c.Stack.DateFixed.Value < c.Event.Date.UtcDateTime).GroupBy(c => c.Event.StackId); foreach (var stackGroup in stacks) { try { var context = stackGroup.First(); Logger.Trace().Message("Marking stack and events as regression.").Write(); await _stackRepository.MarkAsRegressedAsync(context.Stack.Id).AnyContext(); await _workItemQueue.EnqueueAsync(new StackWorkItem { OrganizationId = context.Event.OrganizationId, StackId = context.Stack.Id, UpdateIsFixed = true, IsFixed = false }).AnyContext(); await _stackRepository.InvalidateCacheAsync(context.Event.ProjectId, context.Event.StackId, context.SignatureHash).AnyContext(); bool isFirstEvent = true; foreach (var ctx in stackGroup) { ctx.Event.IsFixed = false; // Only mark the first event context as regressed. ctx.IsRegression = isFirstEvent; isFirstEvent = false; } } catch (Exception ex) { foreach (var context in stackGroup) { bool cont = false; try { cont = HandleError(ex, context); } catch {} if (!cont) { context.SetError(ex.Message, ex); } } } } }
public override async Task ProcessBatchAsync(ICollection <EventContext> contexts) { var stacks = contexts.Where(c => !c.Stack.IsRegressed && c.Stack.DateFixed.HasValue).OrderBy(c => c.Event.Date).GroupBy(c => c.Event.StackId); foreach (var stackGroup in stacks) { try { var stack = stackGroup.First().Stack; EventContext regressedContext = null; SemanticVersion regressedVersion = null; if (String.IsNullOrEmpty(stack.FixedInVersion)) { regressedContext = stackGroup.FirstOrDefault(c => stack.DateFixed < c.Event.Date.UtcDateTime); } else { var fixedInVersion = await _semanticVersionParser.ParseAsync(stack.FixedInVersion).AnyContext(); var versions = stackGroup.GroupBy(c => c.Event.GetVersion()); foreach (var versionGroup in versions) { var version = await _semanticVersionParser.ParseAsync(versionGroup.Key).AnyContext() ?? _semanticVersionParser.Default; if (version < fixedInVersion) { continue; } regressedVersion = version; regressedContext = versionGroup.First(); break; } } if (regressedContext == null) { return; } _logger.LogTrace("Marking stack and events as regressed in version: {Version}", regressedVersion); stack.IsRegressed = true; await _stackRepository.MarkAsRegressedAsync(stack.Id).AnyContext(); await _workItemQueue.EnqueueAsync(new StackWorkItem { OrganizationId = stack.OrganizationId, ProjectId = stack.ProjectId, StackId = stack.Id, UpdateIsFixed = true, IsFixed = false }).AnyContext(); foreach (var ctx in stackGroup) { ctx.Event.IsFixed = false; ctx.IsRegression = ctx == regressedContext; } } catch (Exception ex) { foreach (var context in stackGroup) { bool cont = false; try { cont = HandleError(ex, context); } catch {} if (!cont) { context.SetError(ex.Message, ex); } } } } }