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 { ["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(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(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)); } }