81 lines
2.8 KiB
C#
81 lines
2.8 KiB
C#
using System.Net;
|
|
using Elsa.Extensions;
|
|
using Elsa.Http;
|
|
using Elsa.Resilience.Extensions;
|
|
using Elsa.Resilience.Models;
|
|
using Elsa.Testing.Shared;
|
|
using Elsa.Workflows;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Xunit.Abstractions;
|
|
|
|
namespace Elsa.Resilience.IntegrationTests;
|
|
|
|
public class FlowSendHttpRequestResilienceTests
|
|
{
|
|
private readonly WorkflowTestFixture _fixture;
|
|
private readonly TestRetryAttemptRecorder _recorder = new();
|
|
|
|
public FlowSendHttpRequestResilienceTests(ITestOutputHelper output)
|
|
{
|
|
var handler = new SequentialStatusHandler([HttpStatusCode.TooManyRequests, HttpStatusCode.ServiceUnavailable, HttpStatusCode.OK]);
|
|
|
|
var configuration = new ConfigurationBuilder()
|
|
.AddInMemoryCollection(new Dictionary<string, string?>
|
|
{
|
|
["Resilience:Strategies:0:$type"] = "HttpResilienceStrategy",
|
|
["Resilience:Strategies:0:Id"] = "test",
|
|
["Resilience:Strategies:0:DisplayName"] = "Test",
|
|
["Resilience:Strategies:0:MaxRetryAttempts"] = "5",
|
|
["Resilience:Strategies:0:Delay"] = "00:00:00.001"
|
|
})
|
|
.Build();
|
|
|
|
_fixture = new WorkflowTestFixture(output)
|
|
.ConfigureServices(s =>
|
|
{
|
|
s.AddSingleton<IConfiguration>(configuration);
|
|
})
|
|
.ConfigureElsa(module =>
|
|
{
|
|
module.UseHttp(http =>
|
|
{
|
|
http.HttpClientBuilder = builder => builder.ConfigurePrimaryHttpMessageHandler(() => handler);
|
|
});
|
|
|
|
module.UseResilience(resilience =>
|
|
{
|
|
resilience.WithRetryAttemptRecorder(_ => _recorder);
|
|
});
|
|
});
|
|
}
|
|
|
|
[Fact(DisplayName = "FlowSendHttpRequest retries using selected resilience strategy")]
|
|
public async Task InvokesResilienceStrategy()
|
|
{
|
|
var activity = new FlowSendHttpRequest
|
|
{
|
|
Url = new(new Uri("http://localhost/test")),
|
|
Method = new("GET"),
|
|
ExpectedStatusCodes = new([200]),
|
|
CustomProperties =
|
|
{
|
|
["resilienceStrategy"] = new ResilienceStrategyConfig
|
|
{
|
|
Mode = ResilienceStrategyConfigMode.Identifier,
|
|
StrategyId = "test"
|
|
}
|
|
}
|
|
};
|
|
|
|
var result = await _fixture.RunActivityAsync(activity);
|
|
var statusCode = result.GetActivityOutput<int>(activity, nameof(SendHttpRequestBase.StatusCode));
|
|
|
|
Assert.Equal(200, statusCode);
|
|
Assert.Equal(2, _recorder.Attempts.Count);
|
|
Assert.Collection(_recorder.Attempts,
|
|
first => Assert.Equal(0, first.AttemptNumber),
|
|
second => Assert.Equal(1, second.AttemptNumber));
|
|
}
|
|
}
|