elsa-core/test/integration/Elsa.Resilience.IntegrationTests/FlowSendHttpRequestResilienceTests.cs

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));
}
}