public async Task CanCreateUpdateRemoveAsync()
        {
            await ResetAsync();

            await _repository.RemoveAllAsync();

            await _client.RefreshAsync();

            Assert.Equal(0, await _repository.CountAsync());

            var stack = StackData.GenerateStack(projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId);

            Assert.Null(stack.Id);

            await _repository.AddAsync(stack);

            Assert.NotNull(stack.Id);
            await _client.RefreshAsync();

            stack = await _repository.GetByIdAsync(stack.Id);

            Assert.NotNull(stack);

            stack.Description = "New Description";
            await _repository.SaveAsync(stack);

            await _repository.RemoveAsync(stack.Id);
        }
Example #2
0
        private WebHookDataContext GetWebHookDataContext(Version version)
        {
            var json = File.ReadAllText(Path.GetFullPath(@"..\..\ErrorData\1477.expected.json"));

            var settings = new JsonSerializerSettings {
                MissingMemberHandling = MissingMemberHandling.Ignore,
                ContractResolver      = new ExtensionContractResolver()
            };

            var ev = JsonConvert.DeserializeObject <PersistentEvent>(json, settings);

            ev.OrganizationId = TestConstants.OrganizationId;
            ev.ProjectId      = TestConstants.ProjectId;
            ev.StackId        = TestConstants.StackId;

            var context = new WebHookDataContext(version, ev, OrganizationData.GenerateSampleOrganization(), ProjectData.GenerateSampleProject());

            context.Stack      = StackData.GenerateStack(id: TestConstants.StackId, organizationId: TestConstants.OrganizationId, projectId: TestConstants.ProjectId, title: _formattingPluginManager.GetStackTitle(ev), signatureHash: "722e7afd4dca4a3c91f4d94fec89dfdc");
            context.Stack.Tags = new TagSet {
                "Test"
            };
            context.Stack.FirstOccurrence = context.Stack.LastOccurrence = ev.Date.DateTime;

            return(context);
        }
        public async Task CanGetByFixedAsync()
        {
            var stack = await _repository.AddAsync(StackData.GenerateStack(id: TestConstants.StackId, projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId));

            await RefreshDataAsync();

            var results = await _repository.GetByFilterAsync(null, "fixed:true", null, null, DateTime.MinValue, DateTime.MaxValue);

            Assert.NotNull(results);
            Assert.Equal(0, results.Total);

            results = await _repository.GetByFilterAsync(null, "fixed:false", null, null, DateTime.MinValue, DateTime.MaxValue);

            Assert.NotNull(results);
            Assert.Equal(1, results.Total);
            Assert.False(results.Documents.Single().IsRegressed);
            Assert.Null(results.Documents.Single().DateFixed);

            stack.MarkFixed();
            await _repository.SaveAsync(stack);

            await RefreshDataAsync();

            results = await _repository.GetByFilterAsync(null, "fixed:true", null, null, DateTime.MinValue, DateTime.MaxValue);

            Assert.NotNull(results);
            Assert.Equal(1, results.Total);
            Assert.False(results.Documents.Single().IsRegressed);
            Assert.NotNull(results.Documents.Single().DateFixed);

            results = await _repository.GetByFilterAsync(null, "fixed:false", null, null, DateTime.MinValue, DateTime.MaxValue);

            Assert.NotNull(results);
            Assert.Equal(0, results.Total);
        }
    public async Task GetStacksForCleanupAsync()
    {
        var openStack10DaysOldWithReference = StackData.GenerateStack(id: TestConstants.StackId3, utcLastOccurrence: SystemClock.UtcNow.SubtractDays(10), status: StackStatus.Open);

        openStack10DaysOldWithReference.References.Add("test");

        await _repository.AddAsync(new List <Stack> {
            StackData.GenerateStack(id: TestConstants.StackId, utcLastOccurrence: SystemClock.UtcNow.SubtractDays(5), status: StackStatus.Open),
            StackData.GenerateStack(id: TestConstants.StackId2, utcLastOccurrence: SystemClock.UtcNow.SubtractDays(10), status: StackStatus.Open),
            openStack10DaysOldWithReference,
            StackData.GenerateStack(id: TestConstants.StackId4, utcLastOccurrence: SystemClock.UtcNow.SubtractDays(10), status: StackStatus.Fixed)
        }, o => o.ImmediateConsistency());

        var stacks = await _repository.GetStacksForCleanupAsync(TestConstants.OrganizationId, SystemClock.UtcNow.SubtractDays(8));

        Assert.NotNull(stacks);
        Assert.Equal(1, stacks.Total);
        Assert.Equal(1, stacks.Documents.Count);
        Assert.Equal(TestConstants.StackId2, stacks.Documents.Single().Id);

        stacks = await _repository.GetStacksForCleanupAsync(TestConstants.OrganizationId, SystemClock.UtcNow.SubtractDays(1));

        Assert.NotNull(stacks);
        Assert.Equal(2, stacks.Total);
        Assert.Equal(2, stacks.Documents.Count);
        Assert.NotNull(stacks.Documents.SingleOrDefault(s => String.Equals(s.Id, TestConstants.StackId)));
        Assert.NotNull(stacks.Documents.SingleOrDefault(s => String.Equals(s.Id, TestConstants.StackId2)));
    }
    public async Task CanGetByFixedAsync()
    {
        var stack = await _repository.AddAsync(StackData.GenerateStack(projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId), o => o.ImmediateConsistency());

        var results = await _repository.FindAsync(q => q.FilterExpression("fixed:true"));

        Assert.NotNull(results);
        Assert.Equal(0, results.Total);

        results = await _repository.FindAsync(q => q.FilterExpression("fixed:false"));

        Assert.NotNull(results);
        Assert.Equal(1, results.Total);
        Assert.False(results.Documents.Single().Status == Core.Models.StackStatus.Regressed);
        Assert.Null(results.Documents.Single().DateFixed);

        stack.MarkFixed();
        await _repository.SaveAsync(stack, o => o.ImmediateConsistency());

        results = await _repository.FindAsync(q => q.FilterExpression("fixed:true"));

        Assert.NotNull(results);
        Assert.Equal(1, results.Total);
        Assert.False(results.Documents.Single().Status == Core.Models.StackStatus.Regressed);
        Assert.NotNull(results.Documents.Single().DateFixed);

        results = await _repository.FindAsync(q => q.FilterExpression("fixed:false"));

        Assert.NotNull(results);
        Assert.Equal(0, results.Total);
    }
Example #6
0
        private WebHookDataContext GetWebHookDataContext(Version version)
        {
            string json = File.ReadAllText(Path.GetFullPath(Path.Combine("..", "..", "..", "ErrorData", "1477.expected.json")));

            var settings = GetService <JsonSerializerSettings>();

            settings.Formatting = Formatting.Indented;

            var ev = JsonConvert.DeserializeObject <PersistentEvent>(json, settings);

            ev.OrganizationId = TestConstants.OrganizationId;
            ev.ProjectId      = TestConstants.ProjectId;
            ev.StackId        = TestConstants.StackId;
            ev.Id             = TestConstants.EventId;

            var context = new WebHookDataContext(version, ev, OrganizationData.GenerateSampleOrganization(GetService <BillingManager>(), GetService <BillingPlans>()), ProjectData.GenerateSampleProject())
            {
                Stack = StackData.GenerateStack(id: TestConstants.StackId, organizationId: TestConstants.OrganizationId, projectId: TestConstants.ProjectId, title: _formatter.GetStackTitle(ev), signatureHash: "722e7afd4dca4a3c91f4d94fec89dfdc")
            };

            context.Stack.Tags = new TagSet {
                "Test"
            };
            context.Stack.FirstOccurrence = context.Stack.LastOccurrence = ev.Date.UtcDateTime;

            return(context);
        }
Example #7
0
        public async Task WillSetStackDuplicateSignature()
        {
            var stack = StackData.GenerateStack();

            stack.DuplicateSignature = null;
            stack = await _repository.AddAsync(stack, o => o.ImmediateConsistency());

            Assert.NotEmpty(stack.ProjectId);
            Assert.NotEmpty(stack.SignatureHash);
            Assert.Null(stack.DuplicateSignature);

            var migration = GetService <SetStackDuplicateSignature>();
            var context   = new MigrationContext(GetService <ILock>(), _logger, CancellationToken.None);
            await migration.RunAsync(context);

            string expectedDuplicateSignature = $"{stack.ProjectId}:{stack.SignatureHash}";
            var    actualStack = await _repository.GetByIdAsync(stack.Id);

            Assert.NotEmpty(actualStack.ProjectId);
            Assert.NotEmpty(actualStack.SignatureHash);
            Assert.Equal($"{actualStack.ProjectId}:{actualStack.SignatureHash}", actualStack.DuplicateSignature);

            var results = await _repository.FindAsync(q => q.ElasticFilter(Query <Stack> .Term(s => s.DuplicateSignature, expectedDuplicateSignature)));

            Assert.Single(results.Documents);
        }
    public async Task WillMergeToStackWithMostEvents()
    {
        var utcNow        = SystemClock.UtcNow;
        var originalStack = StackData.GenerateStack();

        originalStack.Id = ObjectId.GenerateNewId().ToString();
        originalStack.TotalOccurrences = 10;
        var biggerStack = originalStack.DeepClone();

        biggerStack.Id               = ObjectId.GenerateNewId().ToString();
        biggerStack.Status           = StackStatus.Fixed;
        biggerStack.TotalOccurrences = 100;
        biggerStack.LastOccurrence   = originalStack.LastOccurrence.AddMinutes(1);
        biggerStack.SnoozeUntilUtc   = originalStack.SnoozeUntilUtc = null;
        biggerStack.DateFixed        = biggerStack.LastOccurrence.AddMinutes(1);
        biggerStack.Tags.Add("stack2");
        biggerStack.References.Add("stack2");
        biggerStack.OccurrencesAreCritical = true;

        originalStack = await _stackRepository.AddAsync(originalStack, o => o.ImmediateConsistency());

        biggerStack = await _stackRepository.AddAsync(biggerStack, o => o.ImmediateConsistency());

        await _eventRepository.AddAsync(EventData.GenerateEvents(count: 10, stackId: originalStack.Id), o => o.ImmediateConsistency());

        await _eventRepository.AddAsync(EventData.GenerateEvents(count: 100, stackId: biggerStack.Id), o => o.ImmediateConsistency());

        var results = await _stackRepository.FindAsync(q => q.ElasticFilter(Query <Stack> .Term(s => s.DuplicateSignature, originalStack.DuplicateSignature)));

        Assert.Equal(2, results.Total);

        var migration = GetService <FixDuplicateStacks>();
        var context   = new MigrationContext(GetService <ILock>(), _logger, CancellationToken.None);
        await migration.RunAsync(context);

        await RefreshDataAsync();

        results = await _stackRepository.FindAsync(q => q.ElasticFilter(Query <Stack> .Term(s => s.DuplicateSignature, originalStack.DuplicateSignature)));

        Assert.Single(results.Documents);

        var updatedOriginalStack = await _stackRepository.GetByIdAsync(originalStack.Id, o => o.IncludeSoftDeletes());

        Assert.True(updatedOriginalStack.IsDeleted);
        var updatedBiggerStack = await _stackRepository.GetByIdAsync(biggerStack.Id, o => o.IncludeSoftDeletes());

        Assert.False(updatedBiggerStack.IsDeleted);

        Assert.Equal(originalStack.CreatedUtc, updatedBiggerStack.CreatedUtc);
        Assert.Equal(110, updatedBiggerStack.TotalOccurrences);
        Assert.Equal(StackStatus.Fixed, updatedBiggerStack.Status);
        Assert.Equal(biggerStack.LastOccurrence, updatedBiggerStack.LastOccurrence);
        Assert.Null(updatedBiggerStack.SnoozeUntilUtc);
        Assert.Equal(biggerStack.DateFixed, updatedBiggerStack.DateFixed);
        Assert.Equal(originalStack.Tags.Count + 1, updatedBiggerStack.Tags.Count);
        Assert.Contains("stack2", updatedBiggerStack.Tags);
        Assert.Equal(originalStack.References.Count + 1, updatedBiggerStack.References.Count);
        Assert.Contains("stack2", updatedBiggerStack.References);
        Assert.True(updatedBiggerStack.OccurrencesAreCritical);
    }
        protected void CreateData()
        {
            var baseDate            = DateTime.Now;
            var occurrenceDateStart = baseDate.AddMinutes(-30);
            var occurrenceDateMid   = baseDate;
            var occurrenceDateEnd   = baseDate.AddMinutes(30);

            _stackRepository.Add(StackData.GenerateStack(id: TestConstants.StackId, organizationId: TestConstants.OrganizationId, projectId: TestConstants.ProjectId));

            var occurrenceDates = new List <DateTime> {
                occurrenceDateStart,
                occurrenceDateEnd,
                baseDate.AddMinutes(-10),
                baseDate.AddMinutes(-20),
                occurrenceDateMid,
                occurrenceDateMid,
                occurrenceDateMid,
                baseDate.AddMinutes(20),
                baseDate.AddMinutes(10),
                baseDate.AddSeconds(1),
                occurrenceDateEnd,
                occurrenceDateStart
            };

            foreach (var date in occurrenceDates)
            {
                var ev = _repository.Add(EventData.GenerateEvent(projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId, stackId: TestConstants.StackId, occurrenceDate: date));
                _ids.Add(Tuple.Create(ev.Id, date));
            }
        }
Example #10
0
        private async Task CreateDataAsync()
        {
            var baseDate            = SystemClock.UtcNow.SubtractHours(1);
            var occurrenceDateStart = baseDate.AddMinutes(-30);
            var occurrenceDateMid   = baseDate;
            var occurrenceDateEnd   = baseDate.AddMinutes(30);

            await _stackRepository.AddAsync(StackData.GenerateStack(id: TestConstants.StackId, organizationId: TestConstants.OrganizationId, projectId: TestConstants.ProjectId));

            var occurrenceDates = new List <DateTime> {
                occurrenceDateStart,
                occurrenceDateEnd,
                baseDate.AddMinutes(-10),
                baseDate.AddMinutes(-20),
                occurrenceDateMid,
                occurrenceDateMid,
                occurrenceDateMid,
                baseDate.AddMinutes(20),
                baseDate.AddMinutes(10),
                baseDate.AddSeconds(1),
                occurrenceDateEnd,
                occurrenceDateStart
            };

            foreach (var date in occurrenceDates)
            {
                var ev = await _repository.AddAsync(EventData.GenerateEvent(projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId, stackId: TestConstants.StackId, occurrenceDate: date));

                _ids.Add(Tuple.Create(ev.Id, date));
            }

            await RefreshDataAsync();
        }
Example #11
0
        public async Task IncrementUsageConcurrently()
        {
            var stack = await _stackRepository.AddAsync(StackData.GenerateStack(id: TestConstants.StackId, projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId));

            var stack2 = await _stackRepository.AddAsync(StackData.GenerateStack(id: TestConstants.StackId2, projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId));

            DateTime?minOccurrenceDate = null, maxOccurrenceDate = null;
            var      tasks = new List <Task>();

            for (int i = 0; i < 10; i++)
            {
                tasks.Add(IncrementUsageBatch());
            }
            await Task.WhenAll(tasks);

            // Assert stack state has no change after increment usage
            stack = await _stackRepository.GetByIdAsync(TestConstants.StackId);

            Assert.Equal(0, stack.TotalOccurrences);
            Assert.True(stack.FirstOccurrence <= SystemClock.UtcNow);
            Assert.True(stack.LastOccurrence <= SystemClock.UtcNow);

            // Assert state in cache has been changed after increment usage
            Assert.Equal(minOccurrenceDate, await _cache.GetUnixTimeMillisecondsAsync(_stackService.GetStackOccurrenceMinDateCacheKey(stack.Id)));
            Assert.Equal(maxOccurrenceDate, await _cache.GetUnixTimeMillisecondsAsync(_stackService.GetStackOccurrenceMaxDateCacheKey(stack.Id)));
            Assert.Equal(100, await _cache.GetAsync <long>(_stackService.GetStackOccurrenceCountCacheKey(stack.Id), 0));

            stack2 = await _stackRepository.GetByIdAsync(TestConstants.StackId2);

            Assert.Equal(0, stack2.TotalOccurrences);
            Assert.True(stack2.FirstOccurrence <= SystemClock.UtcNow);
            Assert.True(stack2.LastOccurrence <= SystemClock.UtcNow);

            // Assert state in cache has been changed after increment usage
            Assert.Equal(minOccurrenceDate, await _cache.GetUnixTimeMillisecondsAsync(_stackService.GetStackOccurrenceMinDateCacheKey(stack2.Id)));
            Assert.Equal(maxOccurrenceDate, await _cache.GetUnixTimeMillisecondsAsync(_stackService.GetStackOccurrenceMaxDateCacheKey(stack2.Id)));
            Assert.Equal(200, await _cache.GetAsync <long>(_stackService.GetStackOccurrenceCountCacheKey(stack2.Id), 0));

            var occurrenceSet = await _cache.GetListAsync <(string OrganizationId, string ProjectId, string StackId)>(_stackService.GetStackOccurrenceSetCacheKey());

            Assert.Equal(2, occurrenceSet.Value.Count);

            async Task IncrementUsageBatch()
            {
                for (int i = 0; i < 10; i++)
                {
                    var utcNow = SystemClock.UtcNow.Floor(TimeSpan.FromMilliseconds(1));
                    if (!minOccurrenceDate.HasValue)
                    {
                        minOccurrenceDate = utcNow;
                    }
                    maxOccurrenceDate = utcNow;
                    await _stackService.IncrementStackUsageAsync(TestConstants.OrganizationId, TestConstants.ProjectId, stack.Id, utcNow, utcNow, 1);

                    await _stackService.IncrementStackUsageAsync(TestConstants.OrganizationId, TestConstants.ProjectId, stack2.Id, utcNow, utcNow, 2);
                }
            }
        }
    public async Task WillNotMergeDuplicatedDeletedStacks()
    {
        var originalStack  = StackData.GenerateStack();
        var duplicateStack = originalStack.DeepClone();

        duplicateStack.Id             = ObjectId.GenerateNewId().ToString();
        duplicateStack.CreatedUtc     = originalStack.CreatedUtc.AddMinutes(1);
        duplicateStack.Status         = StackStatus.Fixed;
        duplicateStack.LastOccurrence = originalStack.LastOccurrence.AddMinutes(1);
        duplicateStack.SnoozeUntilUtc = originalStack.SnoozeUntilUtc = null;
        duplicateStack.DateFixed      = duplicateStack.LastOccurrence.AddMinutes(1);
        duplicateStack.UpdatedUtc     = originalStack.UpdatedUtc.SubtractMinutes(1);
        duplicateStack.Tags.Add("stack2");
        duplicateStack.References.Add("stack2");
        duplicateStack.OccurrencesAreCritical = true;
        duplicateStack.IsDeleted = true;

        await _stackRepository.AddAsync(new[] { originalStack, duplicateStack }, o => o.ImmediateConsistency());

        var results = await _stackRepository.FindAsync(q => q.ElasticFilter(Query <Stack> .Term(s => s.DuplicateSignature, originalStack.DuplicateSignature)));

        Assert.Single(results.Documents);

        var migration = GetService <FixDuplicateStacks>();
        var context   = new MigrationContext(GetService <ILock>(), _logger, CancellationToken.None);
        await migration.RunAsync(context);

        await RefreshDataAsync();

        results = await _stackRepository.FindAsync(q => q.ElasticFilter(Query <Stack> .Term(s => s.DuplicateSignature, originalStack.DuplicateSignature)));

        Assert.Single(results.Documents);

        var updatedOriginalStack = await _stackRepository.GetByIdAsync(originalStack.Id, o => o.IncludeSoftDeletes());

        Assert.False(updatedOriginalStack.IsDeleted);
        var updatedDuplicateStack = await _stackRepository.GetByIdAsync(duplicateStack.Id, o => o.IncludeSoftDeletes());

        Assert.True(updatedDuplicateStack.IsDeleted);

        Assert.Equal(originalStack.CreatedUtc, updatedOriginalStack.CreatedUtc);
        Assert.Equal(originalStack.Status, updatedOriginalStack.Status);
        Assert.Equal(originalStack.LastOccurrence, updatedOriginalStack.LastOccurrence);
        Assert.Equal(originalStack.SnoozeUntilUtc, updatedOriginalStack.SnoozeUntilUtc);
        Assert.Equal(originalStack.DateFixed, updatedOriginalStack.DateFixed);
        Assert.Equal(originalStack.UpdatedUtc, updatedOriginalStack.UpdatedUtc);
        Assert.Equal(originalStack.Tags.Count, updatedOriginalStack.Tags.Count);
        Assert.DoesNotContain("stack2", updatedOriginalStack.Tags);
        Assert.Equal(originalStack.References.Count, updatedOriginalStack.References.Count);
        Assert.DoesNotContain("stack2", updatedOriginalStack.References);
        Assert.False(updatedOriginalStack.OccurrencesAreCritical);
    }
Example #13
0
        public async Task IncrementUsage_OnlyChangeCache()
        {
            var stack = await _stackRepository.AddAsync(StackData.GenerateStack(id: TestConstants.StackId, projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId), o => o.ImmediateConsistency());

            // Assert stack state in elasticsearch before increment usage
            Assert.Equal(0, stack.TotalOccurrences);
            Assert.True(stack.FirstOccurrence <= SystemClock.UtcNow);
            Assert.True(stack.LastOccurrence <= SystemClock.UtcNow);

            // Assert state in cache before increment usage
            Assert.Equal(DateTime.MinValue, await _cache.GetUnixTimeMillisecondsAsync(_stackService.GetStackOccurrenceMinDateCacheKey(stack.Id)));
            Assert.Equal(DateTime.MinValue, await _cache.GetUnixTimeMillisecondsAsync(_stackService.GetStackOccurrenceMaxDateCacheKey(stack.Id)));
            Assert.Equal(0, await _cache.GetAsync <long>(_stackService.GetStackOccurrenceCountCacheKey(stack.Id), 0));
            var occurrenceSet = await _cache.GetListAsync <(string OrganizationId, string ProjectId, string StackId)>(_stackService.GetStackOccurrenceSetCacheKey());

            Assert.True(occurrenceSet.IsNull || !occurrenceSet.HasValue || occurrenceSet.Value.Count == 0);

            var firstUtcNow = SystemClock.UtcNow.Floor(TimeSpan.FromMilliseconds(1));

            await RefreshDataAsync();

            await _stackService.IncrementStackUsageAsync(TestConstants.OrganizationId, TestConstants.ProjectId, stack.Id, firstUtcNow, firstUtcNow, 1);

            // Assert stack state has no change after increment usage
            stack = await _stackRepository.GetByIdAsync(TestConstants.StackId);

            Assert.Equal(0, stack.TotalOccurrences);
            Assert.True(stack.FirstOccurrence <= SystemClock.UtcNow);
            Assert.True(stack.LastOccurrence <= SystemClock.UtcNow);

            // Assert state in cache has been changed after increment usage
            Assert.Equal(firstUtcNow, await _cache.GetUnixTimeMillisecondsAsync(_stackService.GetStackOccurrenceMinDateCacheKey(stack.Id)));
            Assert.Equal(firstUtcNow, await _cache.GetUnixTimeMillisecondsAsync(_stackService.GetStackOccurrenceMaxDateCacheKey(stack.Id)));
            Assert.Equal(1, await _cache.GetAsync <long>(_stackService.GetStackOccurrenceCountCacheKey(stack.Id), 0));
            occurrenceSet = await _cache.GetListAsync <(string OrganizationId, string ProjectId, string StackId)>(_stackService.GetStackOccurrenceSetCacheKey());

            Assert.Single(occurrenceSet.Value);

            var secondUtcNow = SystemClock.UtcNow.Floor(TimeSpan.FromMilliseconds(1));

            await RefreshDataAsync();

            await _stackService.IncrementStackUsageAsync(TestConstants.OrganizationId, TestConstants.ProjectId, stack.Id, secondUtcNow, secondUtcNow, 2);

            // Assert state in cache has been changed after increment usage again
            Assert.Equal(firstUtcNow, await _cache.GetUnixTimeMillisecondsAsync(_stackService.GetStackOccurrenceMinDateCacheKey(stack.Id)));
            Assert.Equal(secondUtcNow, await _cache.GetUnixTimeMillisecondsAsync(_stackService.GetStackOccurrenceMaxDateCacheKey(stack.Id)));
            Assert.Equal(3, await _cache.GetAsync <long>(_stackService.GetStackOccurrenceCountCacheKey(stack.Id), 0));
            occurrenceSet = await _cache.GetListAsync <(string OrganizationId, string ProjectId, string StackId)>(_stackService.GetStackOccurrenceSetCacheKey());

            Assert.Single(occurrenceSet.Value);
        }
    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 IncrementEventCounterTestAsync()
        {
            await RemoveDataAsync();

            await _repository.AddAsync(StackData.GenerateStack(id: TestConstants.StackId, projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId));

            await _client.RefreshAsync();

            var stack = await _repository.GetByIdAsync(TestConstants.StackId);

            Assert.NotNull(stack);
            Assert.Equal(0, stack.TotalOccurrences);
            Assert.Equal(DateTime.MinValue, stack.FirstOccurrence);
            Assert.Equal(DateTime.MinValue, stack.LastOccurrence);

            var utcNow = DateTime.UtcNow;
            await _repository.IncrementEventCounterAsync(TestConstants.OrganizationId, TestConstants.ProjectId, TestConstants.StackId, utcNow, utcNow, 1);

            await _client.RefreshAsync();

            stack = await _repository.GetByIdAsync(TestConstants.StackId);

            Assert.Equal(1, stack.TotalOccurrences);
            Assert.Equal(utcNow, stack.FirstOccurrence);
            Assert.Equal(utcNow, stack.LastOccurrence);

            await _repository.IncrementEventCounterAsync(TestConstants.OrganizationId, TestConstants.ProjectId, TestConstants.StackId, utcNow.SubtractDays(1), utcNow.SubtractDays(1), 1);

            await _client.RefreshAsync();

            stack = await _repository.GetByIdAsync(TestConstants.StackId);

            Assert.Equal(2, stack.TotalOccurrences);
            Assert.Equal(utcNow.SubtractDays(1), stack.FirstOccurrence);
            Assert.Equal(utcNow, stack.LastOccurrence);

            await _repository.IncrementEventCounterAsync(TestConstants.OrganizationId, TestConstants.ProjectId, TestConstants.StackId, utcNow.AddDays(1), utcNow.AddDays(1), 1);

            await _client.RefreshAsync();

            stack = await _repository.GetByIdAsync(TestConstants.StackId);

            Assert.Equal(3, stack.TotalOccurrences);
            Assert.Equal(utcNow.SubtractDays(1), stack.FirstOccurrence);
            Assert.Equal(utcNow.AddDays(1), stack.LastOccurrence);
        }
        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);
        }
Example #17
0
        public async Task CanSaveStackUsage()
        {
            var stack = await _stackRepository.AddAsync(StackData.GenerateStack(id: TestConstants.StackId, projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId));

            var      utcNow = SystemClock.UtcNow.Floor(TimeSpan.FromMilliseconds(1));
            DateTime minOccurrenceDate = utcNow.AddMinutes(-1), maxOccurrenceDate = utcNow;
            await _stackService.IncrementStackUsageAsync(TestConstants.OrganizationId, TestConstants.ProjectId, stack.Id, minOccurrenceDate, maxOccurrenceDate, 10);

            await _stackService.SaveStackUsagesAsync(false);

            // Assert state in cache after save stack usage
            Assert.Equal(0, await _cache.GetAsync <long>(_stackService.GetStackOccurrenceCountCacheKey(stack.Id), 0));

            // Assert stack state after save stack usage
            stack = await _stackRepository.GetByIdAsync(TestConstants.StackId);

            Assert.Equal(10, stack.TotalOccurrences);
            Assert.Equal(minOccurrenceDate, stack.FirstOccurrence);
            Assert.Equal(maxOccurrenceDate, stack.LastOccurrence);
        }
        public async Task CanGetByStackHashAsync()
        {
            long count  = _cache.Count;
            long hits   = _cache.Hits;
            long misses = _cache.Misses;

            var stack = await _repository.AddAsync(StackData.GenerateStack(id: TestConstants.StackId, projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId, dateFixed: SystemClock.UtcNow.SubtractMonths(1)), o => o.Cache());

            Assert.NotNull(stack?.Id);
            Assert.Equal(count + 2, _cache.Count);
            Assert.Equal(hits, _cache.Hits);
            Assert.Equal(misses, _cache.Misses);

            var result = await _repository.GetStackBySignatureHashAsync(stack.ProjectId, stack.SignatureHash);

            Assert.Equal(stack.ToJson(), result.ToJson());
            Assert.Equal(count + 2, _cache.Count);
            Assert.Equal(hits + 1, _cache.Hits);
            Assert.Equal(misses, _cache.Misses);
        }
        public void MarkAsRegressedTest()
        {
            RemoveData();
            _repository.Add(StackData.GenerateStack(id: TestConstants.StackId, projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId, dateFixed: DateTime.Now.SubtractMonths(1)));
            _client.Refresh();

            var stack = _repository.GetById(TestConstants.StackId);

            Assert.NotNull(stack);
            Assert.False(stack.IsRegressed);
            Assert.NotNull(stack.DateFixed);

            _repository.MarkAsRegressed(TestConstants.StackId);

            _client.Refresh();
            stack = _repository.GetById(TestConstants.StackId);
            Assert.NotNull(stack);
            Assert.True(stack.IsRegressed);
            Assert.Null(stack.DateFixed);
        }
        public void CanCreateUpdateRemove()
        {
            _repository.RemoveAll();
            Assert.Equal(0, _repository.Count());

            var stack = StackData.GenerateStack(projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId);

            Assert.Null(stack.Id);

            _repository.Add(stack);
            Assert.NotNull(stack.Id);
            _client.Refresh();

            stack = _repository.GetById(stack.Id);
            Assert.NotNull(stack);

            stack.Description = "New Description";
            _repository.Save(stack);

            _repository.Remove(stack.Id);
        }
    public async Task CanIncrementEventCounterAsync()
    {
        var stack = await _repository.AddAsync(StackData.GenerateStack(projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId), o => o.ImmediateConsistency());

        Assert.NotNull(stack);
        Assert.Equal(0, stack.TotalOccurrences);
        Assert.True(stack.FirstOccurrence <= SystemClock.UtcNow);
        Assert.True(stack.LastOccurrence <= SystemClock.UtcNow);
        Assert.NotEqual(DateTime.MinValue, stack.CreatedUtc);
        Assert.NotEqual(DateTime.MinValue, stack.UpdatedUtc);
        Assert.Equal(stack.CreatedUtc, stack.UpdatedUtc);
        var updatedUtc = stack.UpdatedUtc;

        var utcNow = SystemClock.UtcNow;
        await _repository.IncrementEventCounterAsync(TestConstants.OrganizationId, TestConstants.ProjectId, stack.Id, utcNow, utcNow, 1);

        stack = await _repository.GetByIdAsync(stack.Id);

        Assert.Equal(1, stack.TotalOccurrences);
        Assert.Equal(utcNow, stack.FirstOccurrence);
        Assert.Equal(utcNow, stack.LastOccurrence);
        Assert.Equal(updatedUtc, stack.CreatedUtc);
        Assert.True(updatedUtc.IsBefore(stack.UpdatedUtc), $"Previous {updatedUtc}, Current: {stack.UpdatedUtc}");

        await _repository.IncrementEventCounterAsync(TestConstants.OrganizationId, TestConstants.ProjectId, stack.Id, utcNow.SubtractDays(1), utcNow.SubtractDays(1), 1);

        stack = await _repository.GetByIdAsync(stack.Id);

        Assert.Equal(2, stack.TotalOccurrences);
        Assert.Equal(utcNow.SubtractDays(1), stack.FirstOccurrence);
        Assert.Equal(utcNow, stack.LastOccurrence);

        await _repository.IncrementEventCounterAsync(TestConstants.OrganizationId, TestConstants.ProjectId, stack.Id, utcNow.AddDays(1), utcNow.AddDays(1), 1);

        stack = await _repository.GetByIdAsync(stack.Id);

        Assert.Equal(3, stack.TotalOccurrences);
        Assert.Equal(utcNow.SubtractDays(1), stack.FirstOccurrence);
        Assert.Equal(utcNow.AddDays(1), stack.LastOccurrence);
    }
        public void IncrementEventCounterTest()
        {
            RemoveData();
            _repository.Add(StackData.GenerateStack(id: TestConstants.StackId, projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId));
            _client.Refresh();

            var stack = _repository.GetById(TestConstants.StackId);

            Assert.NotNull(stack);
            Assert.Equal(0, stack.TotalOccurrences);
            Assert.Equal(DateTime.MinValue, stack.FirstOccurrence);
            Assert.Equal(DateTime.MinValue, stack.LastOccurrence);

            var utcNow = DateTime.UtcNow;

            _repository.IncrementEventCounter(TestConstants.OrganizationId, TestConstants.StackId, utcNow);
            _client.Refresh();

            stack = _repository.GetById(TestConstants.StackId);
            Assert.Equal(1, stack.TotalOccurrences);
            Assert.Equal(utcNow, stack.FirstOccurrence);
            Assert.Equal(utcNow, stack.LastOccurrence);

            _repository.IncrementEventCounter(TestConstants.OrganizationId, TestConstants.StackId, utcNow.SubtractDays(1));
            _client.Refresh();

            stack = _repository.GetById(TestConstants.StackId);
            Assert.Equal(2, stack.TotalOccurrences);
            Assert.Equal(utcNow.SubtractDays(1), stack.FirstOccurrence);
            Assert.Equal(utcNow, stack.LastOccurrence);

            _repository.IncrementEventCounter(TestConstants.OrganizationId, TestConstants.StackId, utcNow.AddDays(1));
            _client.Refresh();

            stack = _repository.GetById(TestConstants.StackId);
            Assert.Equal(3, stack.TotalOccurrences);
            Assert.Equal(utcNow.SubtractDays(1), stack.FirstOccurrence);
            Assert.Equal(utcNow.AddDays(1), stack.LastOccurrence);
        }