mirror of https://github.com/Squidex/squidex.git
5 changed files with 184 additions and 9 deletions
@ -0,0 +1,173 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using Elasticsearch.Net.Specification.CrossClusterReplicationApi; |
|||
using Squidex.Domain.Apps.Core.HandleRules; |
|||
using Squidex.Domain.Apps.Core.Rules; |
|||
using Squidex.Domain.Apps.Core.Rules.EnrichedEvents; |
|||
using Squidex.Domain.Apps.Entities.Rules.Repositories; |
|||
using Squidex.Domain.Apps.Entities.TestHelpers; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Rules; |
|||
|
|||
public class RuleQueueWriterTests : GivenContext |
|||
{ |
|||
private readonly IRuleEventRepository ruleEventRepository = A.Fake<IRuleEventRepository>(); |
|||
private readonly IRuleUsageTracker ruleUsageTracker = A.Fake<IRuleUsageTracker>(); |
|||
private readonly RuleQueueWriter sut; |
|||
|
|||
public RuleQueueWriterTests() |
|||
{ |
|||
sut = new RuleQueueWriter(ruleEventRepository, ruleUsageTracker, null); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_not_enqueue_result_without_job() |
|||
{ |
|||
var result = new JobResult |
|||
{ |
|||
SkipReason = SkipReason.None, |
|||
}; |
|||
|
|||
var writes = await EnqueueAndFlushAsync(result); |
|||
|
|||
Assert.Empty(writes); |
|||
} |
|||
|
|||
[Theory] |
|||
[InlineData(SkipReason.ConditionDoesNotMatch)] |
|||
[InlineData(SkipReason.ConditionPrecheckDoesNotMatch)] |
|||
[InlineData(SkipReason.FromRule)] |
|||
[InlineData(SkipReason.NoAction)] |
|||
[InlineData(SkipReason.NoTrigger)] |
|||
[InlineData(SkipReason.TooOld)] |
|||
[InlineData(SkipReason.WrongEvent)] |
|||
[InlineData(SkipReason.WrongEventForTrigger)] |
|||
public async Task Should_not_enqueue_skipped_events_without_error(SkipReason reason) |
|||
{ |
|||
var result = new JobResult |
|||
{ |
|||
SkipReason = reason, |
|||
EnrichedEvent = new EnrichedManualEvent(), |
|||
EnrichmentError = null, |
|||
Job = new RuleJob() |
|||
}; |
|||
|
|||
var writes = await EnqueueAndFlushAsync(result); |
|||
|
|||
Assert.Empty(writes); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_enqueue_with_failed_reason() |
|||
{ |
|||
var result = new JobResult |
|||
{ |
|||
SkipReason = SkipReason.Failed, |
|||
EnrichedEvent = new EnrichedManualEvent(), |
|||
EnrichmentError = null, |
|||
Job = new RuleJob() |
|||
}; |
|||
|
|||
var writes = await EnqueueAndFlushAsync(result); |
|||
|
|||
Assert.Equal(new[] |
|||
{ |
|||
new RuleEventWrite(result.Job, null, null) |
|||
}, writes); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_enqueue_with_error() |
|||
{ |
|||
var result = new JobResult |
|||
{ |
|||
SkipReason = SkipReason.Failed, |
|||
EnrichedEvent = new EnrichedManualEvent(), |
|||
EnrichmentError = new InvalidOperationException(), |
|||
Job = new RuleJob() |
|||
}; |
|||
|
|||
var writes = await EnqueueAndFlushAsync(result); |
|||
|
|||
Assert.Equal(new[] |
|||
{ |
|||
new RuleEventWrite(result.Job, null, result.EnrichmentError) |
|||
}, writes); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_enqueue_success() |
|||
{ |
|||
var result = new JobResult |
|||
{ |
|||
SkipReason = SkipReason.None, |
|||
EnrichedEvent = new EnrichedManualEvent(), |
|||
EnrichmentError = null, |
|||
Job = new RuleJob() |
|||
}; |
|||
|
|||
var writes = await EnqueueAndFlushAsync(result); |
|||
|
|||
Assert.Equal(new[] |
|||
{ |
|||
new RuleEventWrite(result.Job, result.Job.Created, null) |
|||
}, writes); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_enqueue_disabled() |
|||
{ |
|||
var result = new JobResult |
|||
{ |
|||
SkipReason = SkipReason.Disabled, |
|||
EnrichedEvent = new EnrichedManualEvent(), |
|||
EnrichmentError = null, |
|||
Job = new RuleJob() |
|||
}; |
|||
|
|||
var writes = await EnqueueAndFlushAsync(result); |
|||
|
|||
Assert.Equal(new[] |
|||
{ |
|||
new RuleEventWrite(result.Job, result.Job.Created, null) |
|||
}, writes); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_write_batched() |
|||
{ |
|||
var result = new JobResult |
|||
{ |
|||
SkipReason = SkipReason.Disabled, |
|||
EnrichedEvent = new EnrichedManualEvent(), |
|||
EnrichmentError = null, |
|||
Job = new RuleJob() |
|||
}; |
|||
|
|||
for (var i = 0; i < 250; i++) |
|||
{ |
|||
await sut.WriteAsync(result); |
|||
} |
|||
|
|||
A.CallTo(() => ruleEventRepository.EnqueueAsync(A<List<RuleEventWrite>>._, default)) |
|||
.MustHaveHappenedANumberOfTimesMatching(x => x == 2); |
|||
} |
|||
|
|||
private async Task<RuleEventWrite[]> EnqueueAndFlushAsync(JobResult result) |
|||
{ |
|||
var writes = Array.Empty<RuleEventWrite>(); |
|||
|
|||
A.CallTo(() => ruleEventRepository.EnqueueAsync(A<List<RuleEventWrite>>._, default)) |
|||
.Invokes(x => { writes = x.GetArgument<List<RuleEventWrite>>(0)!.ToArray(); }); |
|||
|
|||
await sut.WriteAsync(result); |
|||
await sut.FlushAsync(); |
|||
|
|||
return writes; |
|||
} |
|||
} |
|||
Loading…
Reference in new issue