From f00573ac4f486ac4dc7f06a80ad5ffd556580eab Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Mon, 20 Oct 2025 21:25:49 +0200 Subject: [PATCH] Refactor `SendHttpRequestTests` to utilize `ExecuteAsync` helper. Replaced repetitive service configuration logic with `ExecuteAsync` method, improving readability, consistency, and maintainability across tests. Updated input initialization for cleaner syntax. --- .../{Httpt => Http}/SendHttpRequestTests.cs | 111 ++++++++---------- 1 file changed, 47 insertions(+), 64 deletions(-) rename test/unit/Elsa.Activities.UnitTests/{Httpt => Http}/SendHttpRequestTests.cs (77%) diff --git a/test/unit/Elsa.Activities.UnitTests/Httpt/SendHttpRequestTests.cs b/test/unit/Elsa.Activities.UnitTests/Http/SendHttpRequestTests.cs similarity index 77% rename from test/unit/Elsa.Activities.UnitTests/Httpt/SendHttpRequestTests.cs rename to test/unit/Elsa.Activities.UnitTests/Http/SendHttpRequestTests.cs index 31a2df9bd..d14199041 100644 --- a/test/unit/Elsa.Activities.UnitTests/Httpt/SendHttpRequestTests.cs +++ b/test/unit/Elsa.Activities.UnitTests/Http/SendHttpRequestTests.cs @@ -3,6 +3,7 @@ using System.Text; using Elsa.Activities.UnitTests.Helpers; using Elsa.Extensions; using Elsa.Http; +using Elsa.Testing.Shared; using Elsa.Workflows; using Elsa.Workflows.Attributes; using Microsoft.Extensions.DependencyInjection; @@ -37,8 +38,8 @@ public class SendHttpRequestTests var sendHttpRequest = new SendHttpRequest { - Url = new Input(expectedUrl), - Method = new Input("GET"), + Url = new(expectedUrl), + Method = new("GET"), // Note: Setting ExpectedStatusCodes can cause workflow scheduling issues in test environments, // because the activity may attempt to schedule additional branches for each expected status code, // which can interfere with the test's control flow and assertions. To avoid this, we leave @@ -47,20 +48,14 @@ public class SendHttpRequestTests }; // Act - var context = await ActivityTestHelper.ExecuteActivityAsync(sendHttpRequest, services => - { - services.AddSingleton(mockHttpClientFactory); - services.AddSingleton(ActivityTestHelper.CreateMockResilientActivityInvoker()); - ActivityTestHelper.AddHttpServices(services); - services.AddLogging(); - }); + var context = await ExecuteAsync(sendHttpRequest, mockHttpClientFactory); // Assert Assert.NotNull(capturedRequest); Assert.Equal(HttpMethod.Get, capturedRequest.Method); Assert.Equal(expectedUrl, capturedRequest.RequestUri); - - var statusCodeOutput = context.GetExecutionOutput(_ => sendHttpRequest.StatusCode); + + var statusCodeOutput = context.GetActivityOutput(() => sendHttpRequest.StatusCode); Assert.Equal(200, statusCodeOutput); } @@ -87,21 +82,15 @@ public class SendHttpRequestTests var sendHttpRequest = new SendHttpRequest { - Url = new Input(expectedUrl), - Method = new Input("POST"), - Content = new Input(requestContent), - ContentType = new Input(contentType), + Url = new(expectedUrl), + Method = new("POST"), + Content = new(requestContent), + ContentType = new(contentType), ExpectedStatusCodes = new List() }; // Act - await ActivityTestHelper.ExecuteActivityAsync(sendHttpRequest, services => - { - services.AddSingleton(mockHttpClientFactory); - services.AddSingleton(ActivityTestHelper.CreateMockResilientActivityInvoker()); - ActivityTestHelper.AddHttpServices(services); - services.AddLogging(); - }); + await ExecuteAsync(sendHttpRequest, mockHttpClientFactory); // Assert Assert.NotNull(capturedRequest); @@ -132,20 +121,14 @@ public class SendHttpRequestTests var sendHttpRequest = new SendHttpRequest { - Url = new Input(expectedUrl), - Method = new Input("GET"), - Authorization = new Input(authorizationHeader), + Url = new(expectedUrl), + Method = new("GET"), + Authorization = new(authorizationHeader), ExpectedStatusCodes = new List() }; // Act - await ActivityTestHelper.ExecuteActivityAsync(sendHttpRequest, services => - { - services.AddSingleton(mockHttpClientFactory); - services.AddSingleton(ActivityTestHelper.CreateMockResilientActivityInvoker()); - ActivityTestHelper.AddHttpServices(services); - services.AddLogging(); - }); + await ExecuteAsync(sendHttpRequest, mockHttpClientFactory); // Assert Assert.NotNull(capturedRequest); @@ -169,8 +152,8 @@ public class SendHttpRequestTests var sendHttpRequest = new SendHttpRequest { - Url = new Input(new Uri("https://api.example.com/notfound")), - Method = new Input("GET"), + Url = new(new Uri("https://api.example.com/notfound")), + Method = new("GET"), // Test the configuration without actually scheduling activities ExpectedStatusCodes = new List { @@ -198,8 +181,8 @@ public class SendHttpRequestTests var sendHttpRequest = new SendHttpRequest { - Url = new Input(new Uri("https://api.example.com/error")), - Method = new Input("GET"), + Url = new(new Uri("https://api.example.com/error")), + Method = new("GET"), ExpectedStatusCodes = new List { new(200, mockActivity200) @@ -224,8 +207,8 @@ public class SendHttpRequestTests var sendHttpRequest = new SendHttpRequest { - Url = new Input(new Uri("https://unreachable.example.com")), - Method = new Input("GET"), + Url = new(new Uri("https://unreachable.example.com")), + Method = new("GET"), FailedToConnect = mockFailedToConnectActivity }; @@ -242,8 +225,8 @@ public class SendHttpRequestTests var sendHttpRequest = new SendHttpRequest { - Url = new Input(new Uri("https://slow.example.com")), - Method = new Input("GET"), + Url = new(new Uri("https://slow.example.com")), + Method = new("GET"), Timeout = mockTimeoutActivity }; @@ -270,22 +253,16 @@ public class SendHttpRequestTests var sendHttpRequest = new SendHttpRequest { - Url = new Input(new Uri("https://api.example.com/headers")), - Method = new Input("GET"), + Url = new(new Uri("https://api.example.com/headers")), + Method = new("GET"), ExpectedStatusCodes = new List() }; // Act - var context = await ActivityTestHelper.ExecuteActivityAsync(sendHttpRequest, services => - { - services.AddSingleton(mockHttpClientFactory); - services.AddSingleton(ActivityTestHelper.CreateMockResilientActivityInvoker()); - ActivityTestHelper.AddHttpServices(services); - services.AddLogging(); - }); + var context = await ExecuteAsync(sendHttpRequest, mockHttpClientFactory); // Assert - var responseHeadersObj = context.GetExecutionOutput(_ => sendHttpRequest.ResponseHeaders); + var responseHeadersObj = context.GetActivityOutput(() => sendHttpRequest.ResponseHeaders); var responseHeaders = responseHeadersObj as HttpHeaders; Assert.NotNull(responseHeaders); Assert.True(responseHeaders.ContainsKey("Custom-Header")); @@ -313,28 +290,22 @@ public class SendHttpRequestTests var sendHttpRequest = new SendHttpRequest { - Url = new Input(new Uri("https://api.example.com/json")), - Method = new Input("GET"), + Url = new(new Uri("https://api.example.com/json")), + Method = new("GET"), ExpectedStatusCodes = new List() }; // Act - var context = await ActivityTestHelper.ExecuteActivityAsync(sendHttpRequest, services => - { - services.AddSingleton(mockHttpClientFactory); - services.AddSingleton(ActivityTestHelper.CreateMockResilientActivityInvoker()); - ActivityTestHelper.AddHttpServices(services); - services.AddLogging(); - }); + var context = await ExecuteAsync(sendHttpRequest, mockHttpClientFactory); // Assert - var parsedContent = context.GetExecutionOutput(x => sendHttpRequest.ParsedContent); - var statusCode = context.GetExecutionOutput(x => sendHttpRequest.StatusCode); - var httpResponseResult = (HttpResponseMessage)context.GetExecutionOutput(x => sendHttpRequest.Result)!; - + var parsedContent = context.GetActivityOutput(() => sendHttpRequest.ParsedContent); + var statusCode = context.GetActivityOutput(() => sendHttpRequest.StatusCode); + var httpResponseResult = (HttpResponseMessage)context.GetActivityOutput(() => sendHttpRequest.Result)!; + Assert.NotNull(parsedContent); Assert.Equal(200, statusCode); - + // Verify the response was received and stored Assert.NotNull(httpResponseResult); Assert.Equal(HttpStatusCode.OK, httpResponseResult.StatusCode); @@ -381,4 +352,16 @@ public class SendHttpRequestTests Assert.Equal(statusCode, httpStatusCodeCase.StatusCode); Assert.Equal(mockActivity, httpStatusCodeCase.Activity); } + + private static Task ExecuteAsync(IActivity activity, IHttpClientFactory httpClientFactory) + { + return new ActivityTestFixture(activity) + .WithHttpServices() + .ConfigureServices(services => + { + services.AddSingleton(httpClientFactory); + services.AddLogging(); + }) + .ExecuteAsync(); + } }