Browse Source

Dequeuer tests

pull/95/head
Sebastian Stehle 8 years ago
parent
commit
0573ab045c
  1. 13
      src/Squidex.Domain.Apps.Read/Schemas/WebhookDequeuer.cs
  2. 130
      tests/Squidex.Domain.Apps.Read.Tests/Schemas/WebhookDequeuerTests.cs
  3. 1
      tests/Squidex.Domain.Apps.Read.Tests/Squidex.Domain.Apps.Read.Tests.csproj

13
src/Squidex.Domain.Apps.Read/Schemas/WebhookDequeuer.cs

@ -81,6 +81,11 @@ namespace Squidex.Domain.Apps.Read.Schemas
{ {
} }
public void Next()
{
timer.SkipCurrentDelay();
}
private async Task QueryAsync(CancellationToken cancellationToken) private async Task QueryAsync(CancellationToken cancellationToken)
{ {
try try
@ -99,7 +104,7 @@ namespace Squidex.Domain.Apps.Read.Schemas
{ {
try try
{ {
await webhookEventRepository.TraceSendingAsync(@event.Job.Id); await webhookEventRepository.TraceSendingAsync(@event.Id);
return @event; return @event;
} }
@ -117,14 +122,14 @@ namespace Squidex.Domain.Apps.Read.Schemas
{ {
try try
{ {
var now = clock.GetCurrentInstant();
var response = await webhookSender.SendAsync(@event.Job); var response = await webhookSender.SendAsync(@event.Job);
Instant? nextCall = null; Instant? nextCall = null;
if (response.Result != WebhookResult.Success) if (response.Result != WebhookResult.Success)
{ {
var now = clock.GetCurrentInstant();
switch (@event.NumCalls) switch (@event.NumCalls)
{ {
case 0: case 0:
@ -144,7 +149,7 @@ namespace Squidex.Domain.Apps.Read.Schemas
await Task.WhenAll( await Task.WhenAll(
webhookRepository.TraceSentAsync(@event.Job.WebhookId, response.Result, response.Elapsed), webhookRepository.TraceSentAsync(@event.Job.WebhookId, response.Result, response.Elapsed),
webhookEventRepository.TraceSentAsync(@event.Job.Id, response.Dump, response.Result, response.Elapsed, nextCall)); webhookEventRepository.TraceSentAsync(@event.Id, response.Dump, response.Result, response.Elapsed, nextCall));
} }
catch (Exception ex) catch (Exception ex)
{ {

130
tests/Squidex.Domain.Apps.Read.Tests/Schemas/WebhookDequeuerTests.cs

@ -0,0 +1,130 @@
// ==========================================================================
// WebhookDequeuerTests.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
using System;
using System.Threading;
using System.Threading.Tasks;
using FakeItEasy;
using NodaTime;
using Squidex.Domain.Apps.Read.Schemas.Repositories;
using Squidex.Infrastructure.Log;
using Xunit;
// ReSharper disable MethodSupportsCancellation
// ReSharper disable ImplicitlyCapturedClosure
// ReSharper disable ConvertToConstant.Local
namespace Squidex.Domain.Apps.Read.Schemas
{
public class WebhookDequeuerTests
{
private readonly IClock clock = A.Fake<IClock>();
private readonly ISchemaWebhookRepository webhookRepository = A.Fake<ISchemaWebhookRepository>();
private readonly IWebhookEventRepository webhookEventRepository = A.Fake<IWebhookEventRepository>();
private readonly WebhookSender webhookSender = A.Fake<WebhookSender>();
private readonly Instant now = SystemClock.Instance.GetCurrentInstant();
public WebhookDequeuerTests()
{
A.CallTo(() => clock.GetCurrentInstant()).Returns(now);
}
[Fact]
public void Should_update_repositories_on_successful_requests()
{
var @event = CreateEvent(0);
var requestResult = WebhookResult.Success;
var requestTime = TimeSpan.FromMinutes(1);
var requestDump = "Dump";
SetupSender(@event, requestDump, requestResult, requestTime);
SetupPendingEvents(@event);
var sut = new WebhookDequeuer(
webhookSender,
webhookEventRepository,
webhookRepository,
clock, A.Fake<ISemanticLog>());
sut.Next();
sut.Dispose();
VerifyRepositories(@event, requestDump, requestResult, requestTime, null);
}
[Theory]
[InlineData(0, 5)]
[InlineData(1, 60)]
[InlineData(2, 300)]
[InlineData(3, 360)]
public void Should_set_next_attempt_based_on_num_calls(int calls, int minutes)
{
var @event = CreateEvent(calls);
var requestResult = WebhookResult.Failed;
var requestTime = TimeSpan.FromMinutes(1);
var requestDump = "Dump";
SetupSender(@event, requestDump, requestResult, requestTime);
SetupPendingEvents(@event);
var sut = new WebhookDequeuer(
webhookSender,
webhookEventRepository,
webhookRepository,
clock, A.Fake<ISemanticLog>());
sut.Next();
sut.Dispose();
VerifyRepositories(@event, requestDump, requestResult, requestTime, now.Plus(Duration.FromMinutes(minutes)));
}
private void SetupSender(IWebhookEventEntity @event, string requestDump, WebhookResult requestResult, TimeSpan requestTime)
{
A.CallTo(() => webhookSender.SendAsync(@event.Job))
.Returns(Task.FromResult((requestDump, requestResult, requestTime)));
}
private void SetupPendingEvents(IWebhookEventEntity @event)
{
A.CallTo(() => webhookEventRepository.QueryPendingAsync(A<Func<IWebhookEventEntity, Task>>.Ignored, A<CancellationToken>.Ignored))
.Invokes(async (Func<IWebhookEventEntity, Task> callback, CancellationToken ct) =>
{
await callback(@event);
});
}
private void VerifyRepositories(IWebhookEventEntity @event, string requestDump, WebhookResult requestResult, TimeSpan requestTime, Instant? nextAttempt)
{
A.CallTo(() => webhookEventRepository.TraceSendingAsync(@event.Id))
.MustHaveHappened();
A.CallTo(() => webhookEventRepository.TraceSendingAsync(@event.Id))
.MustHaveHappened();
A.CallTo(() => webhookEventRepository.TraceSentAsync(@event.Id, requestDump, requestResult, requestTime, nextAttempt))
.MustHaveHappened();
A.CallTo(() => webhookRepository.TraceSentAsync(@event.Job.WebhookId, requestResult, requestTime))
.MustHaveHappened();
}
private static IWebhookEventEntity CreateEvent(int numCalls)
{
var @event = A.Fake<IWebhookEventEntity>();
A.CallTo(() => @event.Id).Returns(Guid.NewGuid());
A.CallTo(() => @event.Job).Returns(new WebhookJob { WebhookId = Guid.NewGuid() });
A.CallTo(() => @event.NumCalls).Returns(numCalls);
return @event;
}
}
}

1
tests/Squidex.Domain.Apps.Read.Tests/Squidex.Domain.Apps.Read.Tests.csproj

@ -17,6 +17,7 @@
<ProjectReference Include="..\..\src\Squidex.Domain.Apps.Read.MongoDb\Squidex.Domain.Apps.Read.MongoDb.csproj" /> <ProjectReference Include="..\..\src\Squidex.Domain.Apps.Read.MongoDb\Squidex.Domain.Apps.Read.MongoDb.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="FakeItEasy" Version="4.0.0" />
<PackageReference Include="FluentAssertions" Version="4.19.3" /> <PackageReference Include="FluentAssertions" Version="4.19.3" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
<PackageReference Include="MongoDB.Driver" Version="2.4.4" /> <PackageReference Include="MongoDB.Driver" Version="2.4.4" />

Loading…
Cancel
Save