From 0573ab045cb162b148268eeaa9268c4290f3cf43 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Sat, 5 Aug 2017 17:47:00 +0200 Subject: [PATCH] Dequeuer tests --- .../Schemas/WebhookDequeuer.cs | 13 +- .../Schemas/WebhookDequeuerTests.cs | 130 ++++++++++++++++++ .../Squidex.Domain.Apps.Read.Tests.csproj | 1 + 3 files changed, 140 insertions(+), 4 deletions(-) create mode 100644 tests/Squidex.Domain.Apps.Read.Tests/Schemas/WebhookDequeuerTests.cs diff --git a/src/Squidex.Domain.Apps.Read/Schemas/WebhookDequeuer.cs b/src/Squidex.Domain.Apps.Read/Schemas/WebhookDequeuer.cs index ecf342e48..bf51ffde6 100644 --- a/src/Squidex.Domain.Apps.Read/Schemas/WebhookDequeuer.cs +++ b/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) { try @@ -99,7 +104,7 @@ namespace Squidex.Domain.Apps.Read.Schemas { try { - await webhookEventRepository.TraceSendingAsync(@event.Job.Id); + await webhookEventRepository.TraceSendingAsync(@event.Id); return @event; } @@ -117,14 +122,14 @@ namespace Squidex.Domain.Apps.Read.Schemas { try { - var now = clock.GetCurrentInstant(); - var response = await webhookSender.SendAsync(@event.Job); Instant? nextCall = null; if (response.Result != WebhookResult.Success) { + var now = clock.GetCurrentInstant(); + switch (@event.NumCalls) { case 0: @@ -144,7 +149,7 @@ namespace Squidex.Domain.Apps.Read.Schemas await Task.WhenAll( 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) { diff --git a/tests/Squidex.Domain.Apps.Read.Tests/Schemas/WebhookDequeuerTests.cs b/tests/Squidex.Domain.Apps.Read.Tests/Schemas/WebhookDequeuerTests.cs new file mode 100644 index 000000000..4ff600fb7 --- /dev/null +++ b/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(); + private readonly ISchemaWebhookRepository webhookRepository = A.Fake(); + private readonly IWebhookEventRepository webhookEventRepository = A.Fake(); + private readonly WebhookSender webhookSender = A.Fake(); + 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()); + + 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()); + + 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>.Ignored, A.Ignored)) + .Invokes(async (Func 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(); + + 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; + } + } +} diff --git a/tests/Squidex.Domain.Apps.Read.Tests/Squidex.Domain.Apps.Read.Tests.csproj b/tests/Squidex.Domain.Apps.Read.Tests/Squidex.Domain.Apps.Read.Tests.csproj index dc8fc55f8..c8c9c7fe0 100644 --- a/tests/Squidex.Domain.Apps.Read.Tests/Squidex.Domain.Apps.Read.Tests.csproj +++ b/tests/Squidex.Domain.Apps.Read.Tests/Squidex.Domain.Apps.Read.Tests.csproj @@ -17,6 +17,7 @@ +